From 710fb7d021bce21fab05749b90b8e1348f1c5559 Mon Sep 17 00:00:00 2001 From: Daniel McGregor Date: Tue, 15 Oct 2024 15:49:07 +0800 Subject: [PATCH] feat: ARC-56 application specifications can now be output using the `--output-arc56` option --- docs/compiler.md | 7 +- docs/lg-arc4.md | 8 +- .../amm/out/ConstantProductAMM.approval.mir | 22 +- .../amm/out/ConstantProductAMM.approval.teal | 22 +- .../amm/out/ConstantProductAMM.arc32.json | 2 +- .../amm/out/ConstantProductAMM.arc56.json | 506 ++++ .../out/ConstantProductAMM.destructured.ir | 22 +- examples/amm/out/ConstantProductAMM.ssa.ir | 22 +- .../out/ConstantProductAMM.ssa.opt_pass_1.ir | 22 +- examples/amm/out/client_ConstantProductAMM.py | 6 +- .../out_O2/ConstantProductAMM.approval.teal | 22 +- .../out_O2/ConstantProductAMM.destructured.ir | 22 +- .../ConstantProductAMM.approval.teal | 22 +- .../ConstantProductAMM.destructured.ir | 22 +- examples/amm/puya.log | 3 +- examples/arc_28/out/EventEmitter.approval.mir | 24 +- .../arc_28/out/EventEmitter.approval.teal | 10 +- examples/arc_28/out/EventEmitter.arc32.json | 2 +- examples/arc_28/out/EventEmitter.arc56.json | 219 ++ .../arc_28/out/EventEmitter.destructured.ir | 22 +- examples/arc_28/out/EventEmitter.ssa.ir | 26 +- .../arc_28/out/EventEmitter.ssa.opt_pass_1.ir | 26 +- .../arc_28/out/EventEmitter.ssa.opt_pass_2.ir | 22 +- examples/arc_28/out/module.awst | 8 +- .../arc_28/out_O2/EventEmitter.approval.teal | 10 +- .../out_O2/EventEmitter.destructured.ir | 22 +- .../EventEmitter.approval.teal | 10 +- .../EventEmitter.destructured.ir | 26 +- examples/arc_28/puya.log | 27 +- examples/auction/out/Auction.approval.mir | 26 +- examples/auction/out/Auction.approval.teal | 26 +- examples/auction/out/Auction.arc32.json | 2 +- examples/auction/out/Auction.arc56.json | 360 +++ examples/auction/out/Auction.destructured.ir | 26 +- examples/auction/out/Auction.ssa.ir | 26 +- .../auction/out/Auction.ssa.opt_pass_1.ir | 26 +- examples/auction/out_O2/Auction.approval.teal | 26 +- .../auction/out_O2/Auction.destructured.ir | 26 +- .../out_unoptimized/Auction.approval.teal | 26 +- .../out_unoptimized/Auction.destructured.ir | 26 +- examples/auction/puya.log | 3 +- .../box_storage/out/BoxContract.approval.mir | 54 +- .../box_storage/out/BoxContract.approval.teal | 54 +- .../box_storage/out/BoxContract.arc32.json | 2 +- .../box_storage/out/BoxContract.arc56.json | 475 ++++ .../out/BoxContract.destructured.ir | 54 +- examples/box_storage/out/BoxContract.ssa.ir | 54 +- .../out/BoxContract.ssa.opt_pass_1.ir | 54 +- .../out/BoxContract.ssa.opt_pass_2.ir | 54 +- .../out/BoxContract.ssa.opt_pass_3.ir | 54 +- .../out/BoxContract.ssa.opt_pass_4.ir | 54 +- .../out/BoxContract.ssa.opt_pass_5.ir | 54 +- .../out_O2/BoxContract.approval.teal | 54 +- .../out_O2/BoxContract.destructured.ir | 54 +- .../out_unoptimized/BoxContract.approval.teal | 54 +- .../BoxContract.destructured.ir | 54 +- examples/box_storage/puya.log | 3 +- examples/calculator/puya.log | 2 +- examples/global_state/puya.log | 2 +- examples/hello_world/puya.log | 2 +- .../out/HelloWorldContract.approval.mir | 6 +- .../out/HelloWorldContract.approval.teal | 6 +- .../out/HelloWorldContract.arc32.json | 2 +- .../out/HelloWorldContract.arc56.json | 107 + .../out/HelloWorldContract.destructured.ir | 6 +- .../out/HelloWorldContract.ssa.ir | 6 +- .../out/HelloWorldContract.ssa.opt_pass_1.ir | 6 +- .../out_O2/HelloWorldContract.approval.teal | 6 +- .../out_O2/HelloWorldContract.destructured.ir | 6 +- .../HelloWorldContract.approval.teal | 6 +- .../HelloWorldContract.destructured.ir | 6 +- examples/hello_world_arc4/puya.log | 3 +- examples/local_state/puya.log | 2 +- examples/merkle/out/MerkleTree.approval.mir | 8 +- examples/merkle/out/MerkleTree.approval.teal | 8 +- examples/merkle/out/MerkleTree.arc32.json | 2 +- examples/merkle/out/MerkleTree.arc56.json | 143 + .../merkle/out/MerkleTree.destructured.ir | 8 +- examples/merkle/out/MerkleTree.ssa.ir | 8 +- .../merkle/out/MerkleTree.ssa.opt_pass_1.ir | 8 +- .../merkle/out_O2/MerkleTree.approval.teal | 8 +- .../merkle/out_O2/MerkleTree.destructured.ir | 8 +- .../out_unoptimized/MerkleTree.approval.teal | 8 +- .../MerkleTree.destructured.ir | 8 +- examples/merkle/puya.log | 3 +- examples/sizes.txt | 3 +- .../out/ExampleContract.approval.mir | 14 +- .../out/ExampleContract.approval.teal | 14 +- .../out/ExampleContract.arc32.json | 2 +- .../out/ExampleContract.arc56.json | 186 ++ .../out/ExampleContract.destructured.ir | 14 +- .../struct_in_box/out/ExampleContract.ssa.ir | 14 +- .../out/ExampleContract.ssa.opt_pass_1.ir | 14 +- .../out_O2/ExampleContract.approval.teal | 14 +- .../out_O2/ExampleContract.destructured.ir | 14 +- .../ExampleContract.approval.teal | 14 +- .../ExampleContract.destructured.ir | 14 +- examples/struct_in_box/puya.log | 3 +- .../out/TicTacToeContract.approval.mir | 14 +- .../out/TicTacToeContract.approval.teal | 14 +- .../out/TicTacToeContract.arc32.json | 2 +- .../out/TicTacToeContract.arc56.json | 268 ++ .../out/TicTacToeContract.destructured.ir | 14 +- .../tictactoe/out/TicTacToeContract.ssa.ir | 14 +- .../out/TicTacToeContract.ssa.opt_pass_1.ir | 14 +- .../out/TicTacToeContract.ssa.opt_pass_2.ir | 14 +- .../out/TicTacToeContract.ssa.opt_pass_3.ir | 14 +- .../out_O2/TicTacToeContract.approval.teal | 14 +- .../out_O2/TicTacToeContract.destructured.ir | 14 +- .../TicTacToeContract.approval.teal | 14 +- .../TicTacToeContract.destructured.ir | 14 +- examples/tictactoe/puya.log | 3 +- .../voting/out/VotingRoundApp.approval.mir | 20 +- .../voting/out/VotingRoundApp.approval.teal | 20 +- examples/voting/out/VotingRoundApp.arc32.json | 2 +- examples/voting/out/VotingRoundApp.arc56.json | 495 ++++ .../voting/out/VotingRoundApp.destructured.ir | 20 +- examples/voting/out/VotingRoundApp.ssa.ir | 20 +- .../out/VotingRoundApp.ssa.opt_pass_1.ir | 20 +- .../out/VotingRoundApp.ssa.opt_pass_2.ir | 20 +- .../out_O2/VotingRoundApp.approval.teal | 20 +- .../out_O2/VotingRoundApp.destructured.ir | 20 +- .../VotingRoundApp.approval.teal | 20 +- .../VotingRoundApp.destructured.ir | 20 +- examples/voting/puya.log | 3 +- scripts/compile_all_examples.py | 16 + src/puya/arc32.py | 20 +- src/puya/arc56.py | 328 +++ src/puya/arc56_models.py | 364 +++ src/puya/awst/function_traverser.py | 4 + src/puya/awst/nodes.py | 11 + src/puya/awst/to_code_visitor.py | 4 + src/puya/awst/validation/arc4_copy.py | 4 + src/puya/awst/visitors.py | 3 + src/puya/awst/wtypes.py | 3 + src/puya/compile.py | 33 +- src/puya/ir/_puya_lib.awst.json | 8 + src/puya/ir/arc4_router.py | 109 +- src/puya/ir/builder/_utils.py | 210 ++ src/puya/ir/builder/arc4.py | 260 +- src/puya/ir/builder/main.py | 16 + src/puya/ir/main.py | 231 +- src/puya/models.py | 49 +- src/puya/options.py | 1 + src/puya/ussemble/assemble.py | 6 + src/puya/ussemble/context.py | 20 +- src/puya/ussemble/main.py | 22 +- src/puya/ussemble/models.py | 4 +- src/puyapy/__main__.py | 6 + src/puyapy/awst_build/arc32_client_gen.py | 142 - src/puyapy/awst_build/arc4_client_gen.py | 212 ++ src/puyapy/awst_build/arc4_utils.py | 27 +- src/puyapy/awst_build/eb/arc4/emit.py | 40 +- src/puyapy/awst_build/module.py | 2 + src/puyapy/awst_build/pytypes.py | 12 +- src/puyapy/client_gen.py | 184 +- src/puyapy/compile.py | 26 +- .../out/CustomApproval.approval.mir | 6 +- .../out/CustomApproval.approval.teal | 6 +- .../abi_routing/out/CustomApproval.arc32.json | 2 +- .../abi_routing/out/CustomApproval.arc56.json | 113 + .../out/CustomApproval.destructured.ir | 6 +- .../abi_routing/out/CustomApproval.ssa.ir | 6 +- .../out/CustomApproval.ssa.opt_pass_1.ir | 6 +- .../abi_routing/out/MinimumARC4.approval.mir | 2 +- .../abi_routing/out/MinimumARC4.approval.teal | 2 +- .../abi_routing/out/MinimumARC4.arc32.json | 2 +- .../abi_routing/out/MinimumARC4.arc56.json | 79 + .../out/MinimumARC4.destructured.ir | 2 +- test_cases/abi_routing/out/MinimumARC4.ssa.ir | 2 +- .../out/MinimumARC4.ssa.opt_pass_1.ir | 2 +- .../abi_routing/out/Reference.approval.mir | 54 +- .../abi_routing/out/Reference.approval.teal | 54 +- .../abi_routing/out/Reference.arc32.json | 2 +- .../abi_routing/out/Reference.arc56.json | 798 ++++++ .../abi_routing/out/Reference.destructured.ir | 54 +- test_cases/abi_routing/out/Reference.ssa.ir | 54 +- .../out/Reference.ssa.opt_pass_1.ir | 54 +- .../out/Reference.ssa.opt_pass_2.ir | 54 +- .../out/Reference.ssa.opt_pass_3.ir | 54 +- .../out/Reference.ssa.opt_pass_4.ir | 54 +- .../abi_routing/out/client_Reference.py | 2 +- .../out_O2/CustomApproval.approval.teal | 6 +- .../out_O2/CustomApproval.destructured.ir | 6 +- .../out_O2/MinimumARC4.approval.teal | 2 +- .../out_O2/MinimumARC4.destructured.ir | 2 +- .../out_O2/Reference.approval.teal | 54 +- .../out_O2/Reference.destructured.ir | 54 +- .../CustomApproval.approval.teal | 6 +- .../CustomApproval.destructured.ir | 6 +- .../out_unoptimized/MinimumARC4.approval.teal | 2 +- .../MinimumARC4.destructured.ir | 2 +- .../out_unoptimized/Reference.approval.teal | 54 +- .../out_unoptimized/Reference.destructured.ir | 54 +- test_cases/abi_routing/puya.log | 5 +- test_cases/application/puya.log | 2 +- .../out/DynamicArrayContract.approval.mir | 26 +- .../out/DynamicArrayContract.approval.teal | 26 +- .../out/DynamicArrayContract.arc32.json | 2 +- .../out/DynamicArrayContract.arc56.json | 210 ++ .../out/DynamicArrayContract.destructured.ir | 26 +- .../out/DynamicArrayContract.ssa.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_1.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_2.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_3.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_4.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_5.ir | 26 +- .../DynamicArrayContract.ssa.opt_pass_6.ir | 26 +- .../out_O2/DynamicArrayContract.approval.teal | 26 +- .../DynamicArrayContract.destructured.ir | 26 +- .../DynamicArrayContract.approval.teal | 26 +- .../DynamicArrayContract.destructured.ir | 26 +- test_cases/arc4_dynamic_arrays/puya.log | 3 +- test_cases/arc4_numeric_comparisons/puya.log | 2 +- ...rc4DynamicStringArrayContract.approval.mir | 10 +- ...c4DynamicStringArrayContract.approval.teal | 10 +- .../Arc4DynamicStringArrayContract.arc32.json | 2 +- .../Arc4DynamicStringArrayContract.arc56.json | 120 + ...DynamicStringArrayContract.destructured.ir | 10 +- .../out/Arc4DynamicStringArrayContract.ssa.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_1.ir | 10 +- ...amicStringArrayContract.ssa.opt_pass_10.ir | 10 +- ...amicStringArrayContract.ssa.opt_pass_11.ir | 10 +- ...amicStringArrayContract.ssa.opt_pass_12.ir | 10 +- ...amicStringArrayContract.ssa.opt_pass_13.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_2.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_3.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_4.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_5.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_6.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_7.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_8.ir | 10 +- ...namicStringArrayContract.ssa.opt_pass_9.ir | 10 +- .../out/MutableParams2.approval.teal | 6 +- .../arc4_types/out/MutableParams2.arc32.json | 2 +- .../arc4_types/out/MutableParams2.arc56.json | 102 + .../out/MutableParams2.destructured.ir | 6 +- .../arc4_types/out/MutableParams2.ssa.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_1.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_2.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_3.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_4.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_5.ir | 6 +- .../out/MutableParams2.ssa.opt_pass_6.ir | 6 +- ...c4DynamicStringArrayContract.approval.teal | 10 +- ...DynamicStringArrayContract.destructured.ir | 10 +- .../out_O2/MutableParams2.approval.teal | 6 +- .../out_O2/MutableParams2.destructured.ir | 6 +- ...c4DynamicStringArrayContract.approval.teal | 10 +- ...DynamicStringArrayContract.destructured.ir | 10 +- .../MutableParams2.approval.teal | 6 +- .../MutableParams2.destructured.ir | 6 +- test_cases/arc4_types/puya.log | 4 +- test_cases/arc_56/contract.py | 120 + test_cases/arc_56/out/Contract.approval.mir | 403 +++ test_cases/arc_56/out/Contract.approval.teal | 355 +++ test_cases/arc_56/out/Contract.arc32.json | 266 ++ test_cases/arc_56/out/Contract.arc56.json | 495 ++++ test_cases/arc_56/out/Contract.clear.mir | 7 + test_cases/arc_56/out/Contract.clear.teal | 5 + .../arc_56/out/Contract.destructured.ir | 164 ++ test_cases/arc_56/out/Contract.ssa.ir | 290 +++ .../arc_56/out/Contract.ssa.opt_pass_1.ir | 220 ++ .../arc_56/out/Contract.ssa.opt_pass_10.ir | 164 ++ .../arc_56/out/Contract.ssa.opt_pass_2.ir | 191 ++ .../arc_56/out/Contract.ssa.opt_pass_3.ir | 180 ++ .../arc_56/out/Contract.ssa.opt_pass_4.ir | 175 ++ .../arc_56/out/Contract.ssa.opt_pass_5.ir | 171 ++ .../arc_56/out/Contract.ssa.opt_pass_6.ir | 168 ++ .../arc_56/out/Contract.ssa.opt_pass_7.ir | 167 ++ .../arc_56/out/Contract.ssa.opt_pass_8.ir | 166 ++ .../arc_56/out/Contract.ssa.opt_pass_9.ir | 165 ++ test_cases/arc_56/out/client_Contract.py | 56 + test_cases/arc_56/out/module.awst | 100 + .../arc_56/out_O2/Contract.approval.teal | 247 ++ test_cases/arc_56/out_O2/Contract.clear.teal | 5 + .../arc_56/out_O2/Contract.destructured.ir | 164 ++ .../out_unoptimized/Contract.approval.teal | 561 ++++ .../out_unoptimized/Contract.clear.teal | 5 + .../out_unoptimized/Contract.destructured.ir | 261 ++ test_cases/arc_56/puya.log | 2319 +++++++++++++++++ test_cases/arc_56/template.vars | 4 + test_cases/asset/puya.log | 2 +- test_cases/augmented_assignment/puya.log | 2 +- test_cases/avm_11/out/Contract.approval.teal | 6 +- test_cases/avm_11/out/Contract.arc32.json | 2 +- test_cases/avm_11/out/Contract.arc56.json | 180 ++ .../avm_11/out/Contract.destructured.ir | 6 +- test_cases/avm_11/out/Contract.ssa.ir | 6 +- .../avm_11/out/Contract.ssa.opt_pass_1.ir | 6 +- .../avm_11/out/Contract.ssa.opt_pass_2.ir | 6 +- .../avm_11/out_O2/Contract.approval.teal | 6 +- .../avm_11/out_O2/Contract.destructured.ir | 6 +- .../out_unoptimized/Contract.approval.teal | 6 +- .../out_unoptimized/Contract.destructured.ir | 6 +- test_cases/avm_11/puya.log | 3 +- .../out/TestContract.approval.mir | 8 +- .../out/TestContract.approval.teal | 8 +- .../out/TestContract.arc32.json | 2 +- .../out/TestContract.arc56.json | 153 ++ .../out/TestContract.destructured.ir | 8 +- .../avm_types_in_abi/out/TestContract.ssa.ir | 8 +- .../out/TestContract.ssa.opt_pass_1.ir | 8 +- .../out/TestContract.ssa.opt_pass_2.ir | 8 +- .../out_O2/TestContract.approval.teal | 8 +- .../out_O2/TestContract.destructured.ir | 8 +- .../TestContract.approval.teal | 8 +- .../TestContract.destructured.ir | 8 +- test_cases/avm_types_in_abi/puya.log | 3 +- test_cases/biguint_binary_ops/puya.log | 2 +- test_cases/boolean_binary_ops/puya.log | 2 +- test_cases/bug_load_store_load_store/puya.log | 2 +- test_cases/bytes_ops/puya.log | 2 +- test_cases/callsub/puya.log | 2 +- test_cases/chained_assignment/puya.log | 2 +- test_cases/compile/out/Hello.approval.mir | 14 +- test_cases/compile/out/Hello.approval.teal | 14 +- test_cases/compile/out/Hello.arc32.json | 2 +- test_cases/compile/out/Hello.arc56.json | 165 ++ test_cases/compile/out/Hello.destructured.ir | 14 +- test_cases/compile/out/Hello.ssa.ir | 14 +- .../compile/out/Hello.ssa.opt_pass_1.ir | 14 +- test_cases/compile/out/HelloBase.approval.mir | 12 +- .../compile/out/HelloBase.approval.teal | 12 +- test_cases/compile/out/HelloBase.arc32.json | 2 +- test_cases/compile/out/HelloBase.arc56.json | 145 ++ .../compile/out/HelloBase.destructured.ir | 12 +- test_cases/compile/out/HelloBase.ssa.ir | 12 +- .../compile/out/HelloBase.ssa.opt_pass_1.ir | 12 +- .../compile/out/HelloFactory.approval.mir | 54 +- .../compile/out/HelloFactory.approval.teal | 54 +- .../compile/out/HelloFactory.arc32.json | 2 +- .../compile/out/HelloFactory.arc56.json | 345 +++ .../compile/out/HelloFactory.destructured.ir | 54 +- test_cases/compile/out/HelloFactory.ssa.ir | 54 +- .../out/HelloFactory.ssa.opt_pass_1.ir | 54 +- .../out/HelloFactory.ssa.opt_pass_2.ir | 54 +- .../out/HelloFactory.ssa.opt_pass_3.ir | 54 +- .../out/HelloFactory.ssa.opt_pass_4.ir | 54 +- .../out/HelloOtherConstants.approval.mir | 12 +- .../out/HelloOtherConstants.approval.teal | 12 +- .../out/HelloOtherConstants.arc32.json | 2 +- .../out/HelloOtherConstants.arc56.json | 208 ++ .../out/HelloOtherConstants.destructured.ir | 12 +- .../compile/out/HelloOtherConstants.ssa.ir | 12 +- .../out/HelloOtherConstants.ssa.opt_pass_1.ir | 12 +- test_cases/compile/out/HelloPrfx.approval.mir | 14 +- .../compile/out/HelloPrfx.approval.teal | 14 +- test_cases/compile/out/HelloPrfx.arc32.json | 2 +- test_cases/compile/out/HelloPrfx.arc56.json | 165 ++ .../compile/out/HelloPrfx.destructured.ir | 14 +- test_cases/compile/out/HelloPrfx.ssa.ir | 14 +- .../compile/out/HelloPrfx.ssa.opt_pass_1.ir | 14 +- test_cases/compile/out/HelloTmpl.approval.mir | 14 +- .../compile/out/HelloTmpl.approval.teal | 14 +- test_cases/compile/out/HelloTmpl.arc32.json | 2 +- test_cases/compile/out/HelloTmpl.arc56.json | 165 ++ .../compile/out/HelloTmpl.destructured.ir | 14 +- test_cases/compile/out/HelloTmpl.ssa.ir | 14 +- .../compile/out/HelloTmpl.ssa.opt_pass_1.ir | 14 +- .../compile/out/LargeProgram.approval.mir | 10 +- .../compile/out/LargeProgram.approval.teal | 10 +- .../compile/out/LargeProgram.arc32.json | 2 +- .../compile/out/LargeProgram.arc56.json | 125 + .../compile/out/LargeProgram.destructured.ir | 10 +- test_cases/compile/out/LargeProgram.ssa.ir | 10 +- .../out/LargeProgram.ssa.opt_pass_1.ir | 10 +- test_cases/compile/out_O2/Hello.approval.teal | 14 +- .../compile/out_O2/Hello.destructured.ir | 14 +- .../compile/out_O2/HelloBase.approval.teal | 12 +- .../compile/out_O2/HelloBase.destructured.ir | 12 +- .../compile/out_O2/HelloFactory.approval.teal | 54 +- .../out_O2/HelloFactory.destructured.ir | 54 +- .../out_O2/HelloOtherConstants.approval.teal | 12 +- .../HelloOtherConstants.destructured.ir | 12 +- .../compile/out_O2/HelloPrfx.approval.teal | 14 +- .../compile/out_O2/HelloPrfx.destructured.ir | 14 +- .../compile/out_O2/HelloTmpl.approval.teal | 14 +- .../compile/out_O2/HelloTmpl.destructured.ir | 14 +- .../compile/out_O2/LargeProgram.approval.teal | 10 +- .../out_O2/LargeProgram.destructured.ir | 10 +- .../out_unoptimized/Hello.approval.teal | 14 +- .../out_unoptimized/Hello.destructured.ir | 14 +- .../out_unoptimized/HelloBase.approval.teal | 12 +- .../out_unoptimized/HelloBase.destructured.ir | 12 +- .../HelloFactory.approval.teal | 54 +- .../HelloFactory.destructured.ir | 54 +- .../HelloOtherConstants.approval.teal | 12 +- .../HelloOtherConstants.destructured.ir | 12 +- .../out_unoptimized/HelloPrfx.approval.teal | 14 +- .../out_unoptimized/HelloPrfx.destructured.ir | 14 +- .../out_unoptimized/HelloTmpl.approval.teal | 14 +- .../out_unoptimized/HelloTmpl.destructured.ir | 14 +- .../LargeProgram.approval.teal | 10 +- .../LargeProgram.destructured.ir | 10 +- test_cases/compile/puya.log | 9 +- test_cases/conditional_execution/puya.log | 2 +- test_cases/conditional_expressions/puya.log | 2 +- test_cases/constants/puya.log | 2 +- test_cases/contains/puya.log | 2 +- test_cases/control_op_simplification/puya.log | 2 +- .../debug/out/DebugContract.approval.mir | 6 +- .../debug/out/DebugContract.approval.teal | 6 +- test_cases/debug/out/DebugContract.arc32.json | 2 +- test_cases/debug/out/DebugContract.arc56.json | 120 + .../debug/out/DebugContract.destructured.ir | 6 +- test_cases/debug/out/DebugContract.ssa.ir | 6 +- .../debug/out/DebugContract.ssa.opt_pass_1.ir | 6 +- .../debug/out/DebugContract.ssa.opt_pass_2.ir | 6 +- .../debug/out_O2/DebugContract.approval.teal | 6 +- .../out_O2/DebugContract.destructured.ir | 6 +- .../DebugContract.approval.teal | 6 +- .../DebugContract.destructured.ir | 6 +- test_cases/debug/puya.log | 3 +- test_cases/diamond_mro/out/Base1.approval.mir | 8 +- .../diamond_mro/out/Base1.approval.teal | 8 +- test_cases/diamond_mro/out/Base1.arc32.json | 2 +- test_cases/diamond_mro/out/Base1.arc56.json | 117 + .../diamond_mro/out/Base1.destructured.ir | 8 +- test_cases/diamond_mro/out/Base1.ssa.ir | 8 +- .../diamond_mro/out/Base1.ssa.opt_pass_1.ir | 8 +- test_cases/diamond_mro/out/Base2.approval.mir | 8 +- .../diamond_mro/out/Base2.approval.teal | 8 +- test_cases/diamond_mro/out/Base2.arc32.json | 2 +- test_cases/diamond_mro/out/Base2.arc56.json | 117 + .../diamond_mro/out/Base2.destructured.ir | 8 +- test_cases/diamond_mro/out/Base2.ssa.ir | 8 +- .../diamond_mro/out/Base2.ssa.opt_pass_1.ir | 8 +- .../diamond_mro/out/Derived.approval.mir | 8 +- .../diamond_mro/out/Derived.approval.teal | 8 +- test_cases/diamond_mro/out/Derived.arc32.json | 2 +- test_cases/diamond_mro/out/Derived.arc56.json | 117 + .../diamond_mro/out/Derived.destructured.ir | 8 +- test_cases/diamond_mro/out/Derived.ssa.ir | 8 +- .../diamond_mro/out/Derived.ssa.opt_pass_1.ir | 8 +- test_cases/diamond_mro/out/GP.approval.mir | 8 +- test_cases/diamond_mro/out/GP.approval.teal | 8 +- test_cases/diamond_mro/out/GP.arc32.json | 2 +- test_cases/diamond_mro/out/GP.arc56.json | 117 + test_cases/diamond_mro/out/GP.destructured.ir | 8 +- test_cases/diamond_mro/out/GP.ssa.ir | 8 +- .../diamond_mro/out/GP.ssa.opt_pass_1.ir | 8 +- .../diamond_mro/out_O2/Base1.approval.teal | 8 +- .../diamond_mro/out_O2/Base1.destructured.ir | 8 +- .../diamond_mro/out_O2/Base2.approval.teal | 8 +- .../diamond_mro/out_O2/Base2.destructured.ir | 8 +- .../diamond_mro/out_O2/Derived.approval.teal | 8 +- .../out_O2/Derived.destructured.ir | 8 +- .../diamond_mro/out_O2/GP.approval.teal | 8 +- .../diamond_mro/out_O2/GP.destructured.ir | 8 +- .../out_unoptimized/Base1.approval.teal | 8 +- .../out_unoptimized/Base1.destructured.ir | 8 +- .../out_unoptimized/Base2.approval.teal | 8 +- .../out_unoptimized/Base2.destructured.ir | 8 +- .../out_unoptimized/Derived.approval.teal | 8 +- .../out_unoptimized/Derived.destructured.ir | 8 +- .../out_unoptimized/GP.approval.teal | 8 +- .../out_unoptimized/GP.destructured.ir | 8 +- test_cases/diamond_mro/puya.log | 6 +- test_cases/dup2_optimization_bug/puya.log | 2 +- test_cases/edverify/puya.log | 2 +- test_cases/enumeration/puya.log | 2 +- .../everything/out/MyContract.approval.mir | 20 +- .../everything/out/MyContract.approval.teal | 20 +- .../everything/out/MyContract.arc32.json | 2 +- .../everything/out/MyContract.arc56.json | 233 ++ .../everything/out/MyContract.destructured.ir | 20 +- test_cases/everything/out/MyContract.ssa.ir | 20 +- .../out/MyContract.ssa.opt_pass_1.ir | 20 +- .../out/MyContract.ssa.opt_pass_2.ir | 20 +- .../out/MyContract.ssa.opt_pass_3.ir | 20 +- .../out/MyContract.ssa.opt_pass_4.ir | 20 +- .../out/MyContract.ssa.opt_pass_5.ir | 20 +- .../out_O2/MyContract.approval.teal | 20 +- .../out_O2/MyContract.destructured.ir | 20 +- .../out_unoptimized/MyContract.approval.teal | 20 +- .../MyContract.destructured.ir | 20 +- test_cases/everything/puya.log | 3 +- .../out/AppCall.approval.mir | 6 +- .../out/AppCall.approval.teal | 6 +- .../group_side_effects/out/AppCall.arc32.json | 2 +- .../group_side_effects/out/AppCall.arc56.json | 102 + .../out/AppCall.destructured.ir | 6 +- .../group_side_effects/out/AppCall.ssa.ir | 6 +- .../out/AppCall.ssa.opt_pass_1.ir | 6 +- .../out/AppExpectingEffects.approval.mir | 10 +- .../out/AppExpectingEffects.approval.teal | 10 +- .../out/AppExpectingEffects.arc32.json | 2 +- .../out/AppExpectingEffects.arc56.json | 189 ++ .../out/AppExpectingEffects.destructured.ir | 10 +- .../out/AppExpectingEffects.ssa.ir | 10 +- .../out/AppExpectingEffects.ssa.opt_pass_1.ir | 10 +- .../out/AppExpectingEffects.ssa.opt_pass_2.ir | 10 +- .../out_O2/AppCall.approval.teal | 6 +- .../out_O2/AppCall.destructured.ir | 6 +- .../out_O2/AppExpectingEffects.approval.teal | 10 +- .../AppExpectingEffects.destructured.ir | 10 +- .../out_unoptimized/AppCall.approval.teal | 6 +- .../out_unoptimized/AppCall.destructured.ir | 6 +- .../AppExpectingEffects.approval.teal | 10 +- .../AppExpectingEffects.destructured.ir | 10 +- test_cases/group_side_effects/puya.log | 4 +- test_cases/inheritance/puya.log | 2 +- .../out/ArrayAccessContract.approval.mir | 6 +- .../out/ArrayAccessContract.approval.teal | 6 +- .../out/ArrayAccessContract.arc32.json | 2 +- .../out/ArrayAccessContract.arc56.json | 127 + .../out/ArrayAccessContract.destructured.ir | 6 +- .../out/ArrayAccessContract.ssa.ir | 6 +- .../out/ArrayAccessContract.ssa.opt_pass_1.ir | 6 +- .../out/ArrayAccessContract.ssa.opt_pass_2.ir | 6 +- .../CreateAndTransferContract.approval.mir | 6 +- .../CreateAndTransferContract.approval.teal | 6 +- .../out/CreateAndTransferContract.arc32.json | 2 +- .../out/CreateAndTransferContract.arc56.json | 108 + .../CreateAndTransferContract.destructured.ir | 6 +- .../out/CreateAndTransferContract.ssa.ir | 6 +- ...reateAndTransferContract.ssa.opt_pass_1.ir | 6 +- .../out/FieldTupleContract.approval.mir | 10 +- .../out/FieldTupleContract.approval.teal | 10 +- .../out/FieldTupleContract.arc32.json | 2 +- .../out/FieldTupleContract.arc56.json | 120 + .../out/FieldTupleContract.destructured.ir | 10 +- .../out/FieldTupleContract.ssa.ir | 10 +- .../out/FieldTupleContract.ssa.opt_pass_1.ir | 10 +- .../out/FieldTupleContract.ssa.opt_pass_2.ir | 10 +- .../out/FieldTupleContract.ssa.opt_pass_3.ir | 10 +- .../out/Greeter.approval.mir | 10 +- .../out/Greeter.approval.teal | 10 +- .../inner_transactions/out/Greeter.arc32.json | 2 +- .../inner_transactions/out/Greeter.arc56.json | 151 ++ .../out/Greeter.destructured.ir | 10 +- .../inner_transactions/out/Greeter.ssa.ir | 10 +- .../out/Greeter.ssa.opt_pass_1.ir | 10 +- .../out/Greeter.ssa.opt_pass_2.ir | 10 +- .../out_O2/ArrayAccessContract.approval.teal | 6 +- .../ArrayAccessContract.destructured.ir | 6 +- .../CreateAndTransferContract.approval.teal | 6 +- .../CreateAndTransferContract.destructured.ir | 6 +- .../out_O2/FieldTupleContract.approval.teal | 10 +- .../out_O2/FieldTupleContract.destructured.ir | 10 +- .../out_O2/Greeter.approval.teal | 10 +- .../out_O2/Greeter.destructured.ir | 10 +- .../ArrayAccessContract.approval.teal | 6 +- .../ArrayAccessContract.destructured.ir | 6 +- .../CreateAndTransferContract.approval.teal | 6 +- .../CreateAndTransferContract.destructured.ir | 6 +- .../FieldTupleContract.approval.teal | 10 +- .../FieldTupleContract.destructured.ir | 10 +- .../out_unoptimized/Greeter.approval.teal | 10 +- .../out_unoptimized/Greeter.destructured.ir | 10 +- test_cases/inner_transactions/puya.log | 6 +- .../out/Contract.approval.mir | 10 +- .../out/Contract.approval.teal | 10 +- .../out/Contract.arc32.json | 2 +- .../out/Contract.arc56.json | 120 + .../out/Contract.destructured.ir | 10 +- .../out/Contract.ssa.ir | 10 +- .../out/Contract.ssa.opt_pass_1.ir | 10 +- .../out/Contract.ssa.opt_pass_2.ir | 10 +- .../out_O2/Contract.approval.teal | 10 +- .../out_O2/Contract.destructured.ir | 10 +- .../out_unoptimized/Contract.approval.teal | 10 +- .../out_unoptimized/Contract.destructured.ir | 10 +- .../inner_transactions_assignment/puya.log | 3 +- test_cases/intrinsics/puya.log | 2 +- test_cases/iteration/puya.log | 2 +- test_cases/koopman/puya.log | 2 +- test_cases/less_simple/puya.log | 2 +- test_cases/literals/puya.log | 2 +- test_cases/log/puya.log | 2 +- test_cases/logic_signature/puya.log | 2 +- test_cases/loop_else/puya.log | 2 +- test_cases/match/puya.log | 2 +- test_cases/module_consts/puya.log | 2 +- test_cases/mylib/puya.log | 2 +- test_cases/named_tuples/contract.py | 2 + .../out/NamedTuplesContract.approval.mir | 60 +- .../out/NamedTuplesContract.approval.teal | 56 +- .../out/NamedTuplesContract.arc32.json | 2 +- .../out/NamedTuplesContract.arc56.json | 169 ++ .../out/NamedTuplesContract.destructured.ir | 30 +- .../out/NamedTuplesContract.ssa.ir | 38 +- .../out/NamedTuplesContract.ssa.opt_pass_1.ir | 30 +- .../out/NamedTuplesContract.ssa.opt_pass_2.ir | 30 +- .../out_O2/NamedTuplesContract.approval.teal | 10 +- .../NamedTuplesContract.destructured.ir | 30 +- .../NamedTuplesContract.approval.teal | 56 +- .../NamedTuplesContract.destructured.ir | 38 +- test_cases/named_tuples/puya.log | 87 +- test_cases/nested_loops/puya.log | 2 +- .../out/Issue118.approval.mir | 6 +- .../out/Issue118.approval.teal | 6 +- .../regression_tests/out/Issue118.arc32.json | 2 +- .../regression_tests/out/Issue118.arc56.json | 107 + .../out/Issue118.destructured.ir | 6 +- .../regression_tests/out/Issue118.ssa.ir | 6 +- .../out/Issue118.ssa.opt_pass_1.ir | 6 +- .../out/Issue118.ssa.opt_pass_2.ir | 6 +- .../out/Issue118.ssa.opt_pass_3.ir | 6 +- .../out_O2/Issue118.approval.teal | 6 +- .../out_O2/Issue118.destructured.ir | 6 +- .../out_unoptimized/Issue118.approval.teal | 6 +- .../out_unoptimized/Issue118.destructured.ir | 6 +- test_cases/regression_tests/puya.log | 3 +- .../out/Contract.approval.mir | 10 +- .../out/Contract.approval.teal | 10 +- .../reinterpret_cast/out/Contract.arc32.json | 2 +- .../reinterpret_cast/out/Contract.arc56.json | 120 + .../out/Contract.destructured.ir | 10 +- .../reinterpret_cast/out/Contract.ssa.ir | 10 +- .../out/Contract.ssa.opt_pass_1.ir | 10 +- .../out/Contract.ssa.opt_pass_2.ir | 10 +- .../out/Contract.ssa.opt_pass_3.ir | 10 +- .../out_O2/Contract.approval.teal | 10 +- .../out_O2/Contract.destructured.ir | 10 +- .../out_unoptimized/Contract.approval.teal | 10 +- .../out_unoptimized/Contract.destructured.ir | 10 +- test_cases/reinterpret_cast/puya.log | 3 +- test_cases/scratch_slots/puya.log | 2 +- test_cases/simple/puya.log | 2 +- test_cases/simplish/puya.log | 2 +- test_cases/ssa/puya.log | 2 +- test_cases/ssa2/puya.log | 2 +- .../state_mutations/out/Contract.approval.mir | 16 +- .../out/Contract.approval.teal | 16 +- .../state_mutations/out/Contract.arc32.json | 2 +- .../state_mutations/out/Contract.arc56.json | 219 ++ .../out/Contract.destructured.ir | 16 +- .../state_mutations/out/Contract.ssa.ir | 16 +- .../out/Contract.ssa.opt_pass_1.ir | 16 +- .../out/Contract.ssa.opt_pass_2.ir | 16 +- .../out/Contract.ssa.opt_pass_3.ir | 16 +- .../out/Contract.ssa.opt_pass_4.ir | 16 +- .../out/Contract.ssa.opt_pass_5.ir | 16 +- .../out_O2/Contract.approval.teal | 16 +- .../out_O2/Contract.destructured.ir | 16 +- .../out_unoptimized/Contract.approval.teal | 16 +- .../out_unoptimized/Contract.destructured.ir | 16 +- test_cases/state_mutations/puya.log | 3 +- .../out/StateProxyContract.approval.mir | 4 +- .../out/StateProxyContract.approval.teal | 4 +- .../out/StateProxyContract.arc32.json | 2 +- .../out/StateProxyContract.arc56.json | 120 + .../out/StateProxyContract.destructured.ir | 4 +- .../out/StateProxyContract.ssa.ir | 4 +- .../out/StateProxyContract.ssa.opt_pass_1.ir | 4 +- .../out_O2/StateProxyContract.approval.teal | 4 +- .../out_O2/StateProxyContract.destructured.ir | 4 +- .../StateProxyContract.approval.teal | 4 +- .../StateProxyContract.destructured.ir | 4 +- test_cases/state_proxies/puya.log | 3 +- .../state_totals/out/Contract.approval.mir | 2 +- .../state_totals/out/Contract.approval.teal | 2 +- .../state_totals/out/Contract.arc32.json | 2 +- .../state_totals/out/Contract.arc56.json | 85 + .../state_totals/out/Contract.destructured.ir | 2 +- test_cases/state_totals/out/Contract.ssa.ir | 2 +- .../out/Contract.ssa.opt_pass_1.ir | 2 +- .../out/Contract.ssa.opt_pass_2.ir | 2 +- .../out/Contract.ssa.opt_pass_3.ir | 2 +- .../out_O2/Contract.approval.teal | 2 +- .../out_O2/Contract.destructured.ir | 2 +- .../out_unoptimized/Contract.approval.teal | 2 +- .../out_unoptimized/Contract.destructured.ir | 2 +- test_cases/state_totals/puya.log | 3 +- test_cases/stress_tests/puya.log | 2 +- test_cases/string_ops/puya.log | 2 +- test_cases/stubs/puya.log | 2 +- .../TemplateVariablesContract.approval.mir | 14 +- .../TemplateVariablesContract.approval.teal | 14 +- .../out/TemplateVariablesContract.arc32.json | 2 +- .../out/TemplateVariablesContract.arc56.json | 148 ++ .../TemplateVariablesContract.destructured.ir | 14 +- .../out/TemplateVariablesContract.ssa.ir | 14 +- ...emplateVariablesContract.ssa.opt_pass_1.ir | 14 +- .../TemplateVariablesContract.approval.teal | 14 +- .../TemplateVariablesContract.destructured.ir | 14 +- .../TemplateVariablesContract.approval.teal | 14 +- .../TemplateVariablesContract.destructured.ir | 14 +- test_cases/template_variables/puya.log | 3 +- test_cases/too_many_permutations/puya.log | 2 +- .../out/TransactionContract.approval.mir | 40 +- .../out/TransactionContract.approval.teal | 40 +- .../out/TransactionContract.arc32.json | 2 +- .../out/TransactionContract.arc56.json | 747 ++++++ .../out/TransactionContract.destructured.ir | 40 +- .../out/TransactionContract.ssa.ir | 40 +- .../out/TransactionContract.ssa.opt_pass_1.ir | 40 +- .../out_O2/TransactionContract.approval.teal | 40 +- .../TransactionContract.destructured.ir | 40 +- .../TransactionContract.approval.teal | 40 +- .../TransactionContract.destructured.ir | 40 +- test_cases/transaction/puya.log | 3 +- .../out/NestedTuples.approval.mir | 18 +- .../out/NestedTuples.approval.teal | 18 +- .../tuple_support/out/NestedTuples.arc32.json | 2 +- .../tuple_support/out/NestedTuples.arc56.json | 217 ++ .../out/NestedTuples.destructured.ir | 18 +- .../tuple_support/out/NestedTuples.ssa.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_1.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_10.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_11.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_12.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_2.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_3.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_4.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_5.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_6.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_7.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_8.ir | 18 +- .../out/NestedTuples.ssa.opt_pass_9.ir | 18 +- .../tuple_support/out/client_NestedTuples.py | 3 +- .../out_O2/NestedTuples.approval.teal | 18 +- .../out_O2/NestedTuples.destructured.ir | 18 +- .../NestedTuples.approval.teal | 18 +- .../NestedTuples.destructured.ir | 18 +- test_cases/tuple_support/puya.log | 3 +- .../typed_abi_call/out/Greeter.approval.mir | 66 +- .../typed_abi_call/out/Greeter.approval.teal | 66 +- .../typed_abi_call/out/Greeter.arc32.json | 2 +- .../typed_abi_call/out/Greeter.arc56.json | 534 ++++ .../out/Greeter.destructured.ir | 66 +- test_cases/typed_abi_call/out/Greeter.ssa.ir | 66 +- .../out/Greeter.ssa.opt_pass_1.ir | 66 +- .../out/Greeter.ssa.opt_pass_10.ir | 66 +- .../out/Greeter.ssa.opt_pass_11.ir | 66 +- .../out/Greeter.ssa.opt_pass_12.ir | 66 +- .../out/Greeter.ssa.opt_pass_13.ir | 66 +- .../out/Greeter.ssa.opt_pass_14.ir | 66 +- .../out/Greeter.ssa.opt_pass_15.ir | 66 +- .../out/Greeter.ssa.opt_pass_16.ir | 66 +- .../out/Greeter.ssa.opt_pass_2.ir | 66 +- .../out/Greeter.ssa.opt_pass_3.ir | 66 +- .../out/Greeter.ssa.opt_pass_4.ir | 66 +- .../out/Greeter.ssa.opt_pass_5.ir | 66 +- .../out/Greeter.ssa.opt_pass_6.ir | 66 +- .../out/Greeter.ssa.opt_pass_7.ir | 66 +- .../out/Greeter.ssa.opt_pass_8.ir | 66 +- .../out/Greeter.ssa.opt_pass_9.ir | 66 +- .../typed_abi_call/out/Logger.approval.mir | 70 +- .../typed_abi_call/out/Logger.approval.teal | 70 +- .../typed_abi_call/out/Logger.arc32.json | 2 +- .../typed_abi_call/out/Logger.arc56.json | 618 +++++ .../typed_abi_call/out/Logger.destructured.ir | 70 +- test_cases/typed_abi_call/out/Logger.ssa.ir | 70 +- .../out/Logger.ssa.opt_pass_1.ir | 70 +- .../out/Logger.ssa.opt_pass_2.ir | 70 +- .../out/Logger.ssa.opt_pass_3.ir | 70 +- .../out/Logger.ssa.opt_pass_4.ir | 70 +- .../out/Logger.ssa.opt_pass_5.ir | 70 +- .../out_O2/Greeter.approval.teal | 66 +- .../out_O2/Greeter.destructured.ir | 66 +- .../out_O2/Logger.approval.teal | 70 +- .../out_O2/Logger.destructured.ir | 70 +- .../out_unoptimized/Greeter.approval.teal | 66 +- .../out_unoptimized/Greeter.destructured.ir | 66 +- .../out_unoptimized/Logger.approval.teal | 70 +- .../out_unoptimized/Logger.destructured.ir | 70 +- test_cases/typed_abi_call/puya.log | 4 +- .../out/Caller.approval.mir | 18 +- .../out/Caller.approval.teal | 18 +- .../typed_abi_call_txn/out/Caller.arc32.json | 2 +- .../typed_abi_call_txn/out/Caller.arc56.json | 228 ++ .../out/Caller.destructured.ir | 18 +- .../typed_abi_call_txn/out/Caller.ssa.ir | 18 +- .../out/Caller.ssa.opt_pass_1.ir | 18 +- .../out/Caller.ssa.opt_pass_2.ir | 18 +- .../out/TxnContract.approval.mir | 14 +- .../out/TxnContract.approval.teal | 14 +- .../out/TxnContract.arc32.json | 2 +- .../out/TxnContract.arc56.json | 214 ++ .../out/TxnContract.destructured.ir | 14 +- .../typed_abi_call_txn/out/TxnContract.ssa.ir | 14 +- .../out/TxnContract.ssa.opt_pass_1.ir | 14 +- .../out_O2/Caller.approval.teal | 18 +- .../out_O2/Caller.destructured.ir | 18 +- .../out_O2/TxnContract.approval.teal | 14 +- .../out_O2/TxnContract.destructured.ir | 14 +- .../out_unoptimized/Caller.approval.teal | 18 +- .../out_unoptimized/Caller.destructured.ir | 18 +- .../out_unoptimized/TxnContract.approval.teal | 14 +- .../TxnContract.destructured.ir | 14 +- test_cases/typed_abi_call_txn/puya.log | 4 +- test_cases/unary/puya.log | 2 +- .../out/Unassigned.approval.mir | 14 +- .../out/Unassigned.approval.teal | 14 +- .../out/Unassigned.arc32.json | 2 +- .../out/Unassigned.arc56.json | 138 + .../out/Unassigned.destructured.ir | 14 +- .../out/Unassigned.ssa.ir | 14 +- .../out/Unassigned.ssa.opt_pass_1.ir | 14 +- .../out_O2/Unassigned.approval.teal | 14 +- .../out_O2/Unassigned.destructured.ir | 14 +- .../out_unoptimized/Unassigned.approval.teal | 14 +- .../Unassigned.destructured.ir | 14 +- test_cases/unassigned_expression/puya.log | 3 +- test_cases/undefined_phi_args/puya.log | 2 +- test_cases/unssa/puya.log | 2 +- test_cases/with_reentrancy/puya.log | 2 +- tests/test_cli.py | 20 +- tests/test_compile.py | 16 + tests/utils/__init__.py | 6 +- 803 files changed, 26179 insertions(+), 6084 deletions(-) create mode 100644 examples/amm/out/ConstantProductAMM.arc56.json create mode 100644 examples/arc_28/out/EventEmitter.arc56.json create mode 100644 examples/auction/out/Auction.arc56.json create mode 100644 examples/box_storage/out/BoxContract.arc56.json create mode 100644 examples/hello_world_arc4/out/HelloWorldContract.arc56.json create mode 100644 examples/merkle/out/MerkleTree.arc56.json create mode 100644 examples/struct_in_box/out/ExampleContract.arc56.json create mode 100644 examples/tictactoe/out/TicTacToeContract.arc56.json create mode 100644 examples/voting/out/VotingRoundApp.arc56.json create mode 100644 src/puya/arc56.py create mode 100644 src/puya/arc56_models.py delete mode 100644 src/puyapy/awst_build/arc32_client_gen.py create mode 100644 src/puyapy/awst_build/arc4_client_gen.py create mode 100644 test_cases/abi_routing/out/CustomApproval.arc56.json create mode 100644 test_cases/abi_routing/out/MinimumARC4.arc56.json create mode 100644 test_cases/abi_routing/out/Reference.arc56.json create mode 100644 test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json create mode 100644 test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json create mode 100644 test_cases/arc4_types/out/MutableParams2.arc56.json create mode 100644 test_cases/arc_56/contract.py create mode 100644 test_cases/arc_56/out/Contract.approval.mir create mode 100644 test_cases/arc_56/out/Contract.approval.teal create mode 100644 test_cases/arc_56/out/Contract.arc32.json create mode 100644 test_cases/arc_56/out/Contract.arc56.json create mode 100644 test_cases/arc_56/out/Contract.clear.mir create mode 100644 test_cases/arc_56/out/Contract.clear.teal create mode 100644 test_cases/arc_56/out/Contract.destructured.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir create mode 100644 test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir create mode 100644 test_cases/arc_56/out/client_Contract.py create mode 100644 test_cases/arc_56/out/module.awst create mode 100644 test_cases/arc_56/out_O2/Contract.approval.teal create mode 100644 test_cases/arc_56/out_O2/Contract.clear.teal create mode 100644 test_cases/arc_56/out_O2/Contract.destructured.ir create mode 100644 test_cases/arc_56/out_unoptimized/Contract.approval.teal create mode 100644 test_cases/arc_56/out_unoptimized/Contract.clear.teal create mode 100644 test_cases/arc_56/out_unoptimized/Contract.destructured.ir create mode 100644 test_cases/arc_56/puya.log create mode 100644 test_cases/arc_56/template.vars create mode 100644 test_cases/avm_11/out/Contract.arc56.json create mode 100644 test_cases/avm_types_in_abi/out/TestContract.arc56.json create mode 100644 test_cases/compile/out/Hello.arc56.json create mode 100644 test_cases/compile/out/HelloBase.arc56.json create mode 100644 test_cases/compile/out/HelloFactory.arc56.json create mode 100644 test_cases/compile/out/HelloOtherConstants.arc56.json create mode 100644 test_cases/compile/out/HelloPrfx.arc56.json create mode 100644 test_cases/compile/out/HelloTmpl.arc56.json create mode 100644 test_cases/compile/out/LargeProgram.arc56.json create mode 100644 test_cases/debug/out/DebugContract.arc56.json create mode 100644 test_cases/diamond_mro/out/Base1.arc56.json create mode 100644 test_cases/diamond_mro/out/Base2.arc56.json create mode 100644 test_cases/diamond_mro/out/Derived.arc56.json create mode 100644 test_cases/diamond_mro/out/GP.arc56.json create mode 100644 test_cases/everything/out/MyContract.arc56.json create mode 100644 test_cases/group_side_effects/out/AppCall.arc56.json create mode 100644 test_cases/group_side_effects/out/AppExpectingEffects.arc56.json create mode 100644 test_cases/inner_transactions/out/ArrayAccessContract.arc56.json create mode 100644 test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json create mode 100644 test_cases/inner_transactions/out/FieldTupleContract.arc56.json create mode 100644 test_cases/inner_transactions/out/Greeter.arc56.json create mode 100644 test_cases/inner_transactions_assignment/out/Contract.arc56.json create mode 100644 test_cases/named_tuples/out/NamedTuplesContract.arc56.json create mode 100644 test_cases/regression_tests/out/Issue118.arc56.json create mode 100644 test_cases/reinterpret_cast/out/Contract.arc56.json create mode 100644 test_cases/state_mutations/out/Contract.arc56.json create mode 100644 test_cases/state_proxies/out/StateProxyContract.arc56.json create mode 100644 test_cases/state_totals/out/Contract.arc56.json create mode 100644 test_cases/template_variables/out/TemplateVariablesContract.arc56.json create mode 100644 test_cases/transaction/out/TransactionContract.arc56.json create mode 100644 test_cases/tuple_support/out/NestedTuples.arc56.json create mode 100644 test_cases/typed_abi_call/out/Greeter.arc56.json create mode 100644 test_cases/typed_abi_call/out/Logger.arc56.json create mode 100644 test_cases/typed_abi_call_txn/out/Caller.arc56.json create mode 100644 test_cases/typed_abi_call_txn/out/TxnContract.arc56.json create mode 100644 test_cases/unassigned_expression/out/Unassigned.arc56.json diff --git a/docs/compiler.md b/docs/compiler.md index 7141ee8638..ecbc4eb750 100644 --- a/docs/compiler.md +++ b/docs/compiler.md @@ -107,19 +107,20 @@ puyapy [-h] [--version] [-O {0,1,2}] ### Options | Option | Description | Default | -|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------- | +|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------| | `-h`, `--help` | Show the help message and exit | N/A | | `--version` | Show program's version number and exit | N/A | | `-O {0,1,2}`
`--optimization-level {0,1,2}` | Set optimization level of output TEAL / AVM bytecode | `1` | | `--output-teal`, `--no-output-teal` | Output TEAL | `True` | | `--output-arc32`, `--no-output-arc32` | Output {contract}.arc32.json ARC-32 app spec file if the contract is an ARC-4 contract | `True` | +| `--output-arc56`, `--no-output-arc56` | Output {contract}.arc56.json ARC-56 app spec file if the contract is an ARC-4 contract | `False` | | `--output-client`, `--no-output-client` | Output Algorand Python contract client for typed ARC4 ABI calls | `False` | | `--output-bytecode`, `--no-output-bytecode` | Output AVM bytecode | `False` | | `--out-dir OUT_DIR` | The path for outputting artefacts | Same folder as contract | | `--log-level {notset,debug,info,warning,error,critical}` | Minimum level to log to console | `info` | | `-g {0,1,2}`, `--debug-level {0,1,2}` | Output debug information level
`0` = No debug annotations
`1` = Output debug annotations
`2` = Reserved for future use, currently the same as `1` | `1` | -| `--template-var` | Allows specifying template values. Can be used multiple times, see below for examples | N/A | -| `--template-vars-prefix` | Prefix to use for template variables | "TMPL_" | +| `--template-var` | Allows specifying template values. Can be used multiple times, see below for examples | N/A | +| `--template-vars-prefix` | Prefix to use for template variables | "TMPL_" | ### Defining template values diff --git a/docs/lg-arc4.md b/docs/lg-arc4.md index a51377fea6..84c66e268d 100644 --- a/docs/lg-arc4.md +++ b/docs/lg-arc4.md @@ -11,12 +11,12 @@ class HelloWorldContract(ARC4Contract): ... ``` -## ARC-32 +## ARC-32 and ARC-56 [ARC32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) extends the concepts in ARC4 to include an Application Specification which more holistically describes a smart contract and its associated state. -ARC32 Application Specification files are automatically generated by the compiler for ARC4 -contracts as `.arc32.json` +ARC-32/ARC-56 Application Specification files are automatically generated by the compiler for ARC4 +contracts as `.arc32.json` or `.arc56.json` ## Methods @@ -24,6 +24,8 @@ Individual methods on a smart contract should be annotated with an `abimethod` d A method that should not be externally available should be annotated with a `subroutine` decorator. +Method docstrings will be used when outputting ARC-32 or ARC-56 application specifications, the following docstrings styles are supported ReST, Google, Numpydoc-style and Epydoc. + ```python from algopy import ARC4Contract, subroutine, arc4 diff --git a/examples/amm/out/ConstantProductAMM.approval.mir b/examples/amm/out/ConstantProductAMM.approval.mir index f64ab37889..5fe5a4979a 100644 --- a/examples/amm/out/ConstantProductAMM.approval.mir +++ b/examples/amm/out/ConstantProductAMM.approval.mir @@ -82,9 +82,9 @@ __puya_arc4_router___set_governor_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -101,9 +101,9 @@ __puya_arc4_router___bootstrap_route@3: // @arc4.abimethod() txn OnCompletion tmp%10#0 ! tmp%11#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%12#0 - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex tmp%14#0 @@ -145,9 +145,9 @@ __puya_arc4_router___mint_route@4: // ) txn OnCompletion tmp%22#0 ! tmp%23#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%24#0 - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex tmp%26#0 @@ -203,9 +203,9 @@ __puya_arc4_router___burn_route@5: // ) txn OnCompletion tmp%37#0 ! tmp%38#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%39#0 - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex tmp%41#0 @@ -251,9 +251,9 @@ __puya_arc4_router___swap_route@6: // ) txn OnCompletion tmp%51#0 ! tmp%52#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%53#0 - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex tmp%55#0 @@ -294,7 +294,7 @@ __puya_arc4_router___bare_routing@9: __puya_arc4_router_____algopy_default_create@10: txn ApplicationID tmp%63#0 ! tmp%64#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/examples/amm/out/ConstantProductAMM.approval.teal b/examples/amm/out/ConstantProductAMM.approval.teal index c13c3edde7..bce9b102c8 100644 --- a/examples/amm/out/ConstantProductAMM.approval.teal +++ b/examples/amm/out/ConstantProductAMM.approval.teal @@ -68,9 +68,9 @@ __puya_arc4_router___set_governor_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txna ApplicationArgs 1 @@ -87,9 +87,9 @@ __puya_arc4_router___bootstrap_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -128,9 +128,9 @@ __puya_arc4_router___mint_route@4: // ) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -181,9 +181,9 @@ __puya_arc4_router___burn_route@5: // ) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -225,9 +225,9 @@ __puya_arc4_router___swap_route@6: // ) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -262,7 +262,7 @@ __puya_arc4_router___bare_routing@9: bnz __puya_arc4_router___after_if_else@13 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/amm/out/ConstantProductAMM.arc32.json b/examples/amm/out/ConstantProductAMM.arc32.json index a4b753ad08..576d8bd863 100644 --- a/examples/amm/out/ConstantProductAMM.arc32.json +++ b/examples/amm/out/ConstantProductAMM.arc32.json @@ -65,7 +65,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2dvdmVybm9yCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgYnVybgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc3dhcF9yb3V0ZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yKG5ld19nb3Zlcm5vcjogYnl0ZXMpIC0+IHZvaWQ6CnNldF9nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXRfZ292ZXJub3Ioc2VsZiwgbmV3X2dvdmVybm9yOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBuZXdfZ292ZXJub3IKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYyLTI2MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfaXNfZ292ZXJub3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ292ZXJub3IgZXhpc3RzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICAvLyApLCAiT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kIgogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGFjY291bnQgc2V0IGluIGdsb2JhbF9zdGF0ZS5nb3Zlcm5vciBtYXkgY2FsbCB0aGlzIG1ldGhvZAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5ib290c3RyYXAoc2VlZDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0Ogpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDktNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIHNlZWQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBhX2Fzc2V0OiBBc3NldCwgYl9hc3NldDogQXNzZXQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYucG9vbF90b2tlbiwgImFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLl9jaGVja19pc19nb3Zlcm5vcigpCiAgICBjYWxsc3ViIF9jaGVja19pc19nb3Zlcm5vcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMiwgImdyb3VwIHNpemUgbm90IDIiCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBncm91cCBzaXplIG5vdCAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBzZWVkLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHNlZWQuYW1vdW50ID49IDMwMF8wMDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IiAgIyAwLjMgQWxnb3MKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDMwMDAwMCAvLyAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYV9hc3NldC5pZCA8IGJfYXNzZXQuaWQsICJhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYXNzZXJ0IC8vIGFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBhX2Fzc2V0CiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBzZWxmLmFzc2V0X2IgPSBiX2Fzc2V0CiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBzZWxmLl9jcmVhdGVfcG9vbF90b2tlbigpCiAgICBjYWxsc3ViIF9jcmVhdGVfcG9vbF90b2tlbgogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2EpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzkKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jcmVhdGVfcG9vbF90b2tlbigpIC0+IHVpbnQ2NDoKX2NyZWF0ZV9wb29sX3Rva2VuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2OC0yNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NyZWF0ZV9wb29sX3Rva2VuKHNlbGYpIC0+IEFzc2V0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcyCiAgICAvLyBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHg0NDUwNTQyZAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyZAogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzYKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gZGVjaW1hbHM9MywKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQKICAgIC8vIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjczCiAgICAvLyB1bml0X25hbWU9YiJkYnQiLAogICAgcHVzaGJ5dGVzIDB4NjQ2Mjc0CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yNzkKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjgwCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0CiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcwLTI4MQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0CiAgICAvLyApCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9kb19vcHRfaW4oYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2RvX29wdF9pbjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9kb19vcHRfaW4oc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg2CiAgICAvLyByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyODUtMjg5CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0PWFzc2V0LAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGFtbS9jb250cmFjdC5weToyODgKICAgIC8vIGFtb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5kb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcjogYnl0ZXMsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgpkb19hc3NldF90cmFuc2ZlcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRvX2Fzc2V0X3RyYW5zZmVyKCosIHJlY2VpdmVyOiBBY2NvdW50LCBhc3NldDogQXNzZXQsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLm1pbnQoYV94ZmVyOiB1aW50NjQsIGJfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgptaW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIG1pbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGJfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA1IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTEKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIHdlbGwtZm9ybWVkIG1pbnQKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBhX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgYl94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIwLTEyMwogICAgLy8gIyB2YWxpZCBhc3NldCBhIHhmZXIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI0CiAgICAvLyBhc3NlcnQgYV94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCBhX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI5CiAgICAvLyBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyAjIHZhbGlkIGFzc2V0IGIgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBiX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzUKICAgIC8vIHBvb2xfYmFsYW5jZT1zZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzYKICAgIC8vIGFfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzcKICAgIC8vIGJfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzQtMTQwCiAgICAvLyB0b19taW50ID0gdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICAvLyAgICAgYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9hbW91bnQ9YV94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICAgICBiX2Ftb3VudD1iX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgdG9rZW5zX3RvX21pbnQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB0b19taW50ID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQzLTE0NAogICAgLy8gIyBtaW50IHRva2VucwogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5wb29sX3Rva2VuLCBhbW91bnQ9dG9fbWludCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDUKICAgIC8vIHNlbGYuX3VwZGF0ZV9yYXRpbygpCiAgICBjYWxsc3ViIF91cGRhdGVfcmF0aW8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NoZWNrX2Jvb3RzdHJhcHBlZCgpIC0+IHZvaWQ6Cl9jaGVja19ib290c3RyYXBwZWQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYm9vdHN0cmFwcGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTMKICAgIC8vIGFzc2VydCBzZWxmLnBvb2xfdG9rZW4sICJib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9wb29sX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9wb29sX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkzCiAgICAvLyByZXR1cm4gc2VsZi5wb29sX3Rva2VuLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2FfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYV9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYV9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9iX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X2JfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X2JfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X2IuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC50b2tlbnNfdG9fbWludChwb29sX2JhbGFuY2U6IHVpbnQ2NCwgYV9iYWxhbmNlOiB1aW50NjQsIGJfYmFsYW5jZTogdWludDY0LCBhX2Ftb3VudDogdWludDY0LCBiX2Ftb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19taW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyMi0zMzAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBwb29sX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBiX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIGJfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDUgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzEKICAgIC8vIGlzX2luaXRpYWxfbWludCA9IGFfYmFsYW5jZSA9PSBhX2Ftb3VudCBhbmQgYl9iYWxhbmNlID09IGJfYW1vdW50CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiB0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICBiIHRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANAoKdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCnRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzIKICAgIC8vIGlmIGlzX2luaXRpYWxfbWludDoKICAgIGJ6IHRva2Vuc190b19taW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcmV0dXJuIG9wLnNxcnQoYV9hbW91bnQgKiBiX2Ftb3VudCkgLSBTQ0FMRQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHNxcnQKICAgIGludGNfMiAvLyAxMDAwCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlCiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtNQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gYV9yYXRpbyA9IFNDQUxFICogYV9hbW91bnQgLy8gKGFfYmFsYW5jZSAtIGFfYW1vdW50KQogICAgaW50Y18yIC8vIDEwMDAKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIC8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM2CiAgICAvLyBiX3JhdGlvID0gU0NBTEUgKiBiX2Ftb3VudCAvLyAoYl9iYWxhbmNlIC0gYl9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzcKICAgIC8vIGlmIGFfcmF0aW8gPCBiX3JhdGlvOgogICAgPAogICAgYnogdG9rZW5zX3RvX21pbnRfZWxzZV9ib2R5QDgKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzgKICAgIC8vIHJldHVybiBhX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMAogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAODoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBiX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMQogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fdXBkYXRlX3JhdGlvKCkgLT4gdm9pZDoKX3VwZGF0ZV9yYXRpbzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF91cGRhdGVfcmF0aW8oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gYV9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTgKICAgIC8vIGJfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnJhdGlvID0gYV9iYWxhbmNlICogU0NBTEUgLy8gYl9iYWxhbmNlCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgc3dhcAogICAgLwogICAgYnl0ZWMgNCAvLyAicmF0aW8iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5idXJuKHBvb2xfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpidXJuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0Ny0xNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgYnVybigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHBvb2xfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzAKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzIKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzcKICAgIC8vIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3Ni0xNzgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc5CiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgxCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4My0xODUKICAgIC8vICMgR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzc3VlZAogICAgLy8gIyAhaW1wb3J0YW50OiB0aGlzIGhhcHBlbnMgcHJpb3IgdG8gcmVjZWl2aW5nIHRoZSBjdXJyZW50IGF4ZmVyIG9mIHBvb2wgdG9rZW5zCiAgICAvLyBwb29sX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4Ni0xOTAKICAgIC8vIGFfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBkaWcgMwogICAgY2FsbHN1YiB0b2tlbnNfdG9fYnVybgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MS0xOTUKICAgIC8vIGJfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBhCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2EsIGFtb3VudD1hX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGIKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYiwgYW1vdW50PWJfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19idXJuKHBvb2xfYmFsYW5jZTogdWludDY0LCBzdXBwbHk6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX2J1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQzLTM0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fYnVybigqLCBwb29sX2JhbGFuY2U6IFVJbnQ2NCwgc3VwcGx5OiBVSW50NjQsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDUKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZSAtIGFtb3VudAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gcmV0dXJuIHN1cHBseSAqIGFtb3VudCAvLyBpc3N1ZWQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLnN3YXAoc3dhcF94ZmVyOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpzd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBzd2FwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3dhcF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjMKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjUKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGJfYXNzZXQgPT0gc2VsZi5hc3NldF9iLCAiYXNzZXQgYiBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHN3YXBfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzIKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzYKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEtMjQxCiAgICAvLyBtYXRjaCBzd2FwX3hmZXIueGZlcl9hc3NldDoKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYToKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYjoKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIG1hdGNoIHN3YXBfc3dpdGNoX2Nhc2VfMEAxIHN3YXBfc3dpdGNoX2Nhc2VfMUAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQxCiAgICAvLyBhc3NlcnQgRmFsc2UsICJhc3NldCBpZCBpbmNvcnJlY3QiCiAgICBlcnIgLy8gYXNzZXQgaWQgaW5jb3JyZWN0Cgpzd2FwX3N3aXRjaF9jYXNlXzBAMToKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzMKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9hCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBiIHN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzcKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzgKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCgpzd2FwX3N3aXRjaF9jYXNlX25leHRANDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyB0b19zd2FwID0gdG9rZW5zX3RvX3N3YXAoCiAgICAvLyAgICAgaW5fYW1vdW50PXN3YXBfeGZlci5hc3NldF9hbW91bnQsIGluX3N1cHBseT1pbl9zdXBwbHksIG91dF9zdXBwbHk9b3V0X3N1cHBseQogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdG9rZW5zX3RvX3N3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDYKICAgIC8vIGFzc2VydCB0b19zd2FwID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ4CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1vdXRfYXNzZXQsIGFtb3VudD10b19zd2FwKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDEKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19zd2FwKGluX2Ftb3VudDogdWludDY0LCBpbl9zdXBwbHk6IHVpbnQ2NCwgb3V0X3N1cHBseTogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19zd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX3N3YXAoKiwgaW5fYW1vdW50OiBVSW50NjQsIGluX3N1cHBseTogVUludDY0LCBvdXRfc3VwcGx5OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaW5fdG90YWwgPSBTQ0FMRSAqIChpbl9zdXBwbHkgLSBpbl9hbW91bnQpICsgKGluX2Ftb3VudCAqIEZBQ1RPUikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICAtCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoaW50IDk5NSAvLyA5OTUKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUyCiAgICAvLyBvdXRfdG90YWwgPSBpbl9hbW91bnQgKiBGQUNUT1IgKiBvdXRfc3VwcGx5CiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTMKICAgIC8vIHJldHVybiBvdXRfdG90YWwgLy8gaW5fdG90YWwKICAgIHN3YXAKICAgIC8KICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfZ292ZXJub3IKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWludF9yb3V0ZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDctMTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBidXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zd2FwX3JvdXRlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDQtMjA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5zZXRfZ292ZXJub3IobmV3X2dvdmVybm9yOiBieXRlcykgLT4gdm9pZDoKc2V0X2dvdmVybm9yOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHNldF9nb3Zlcm5vcihzZWxmLCBuZXdfZ292ZXJub3I6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NgogICAgLy8gc2VsZi5fY2hlY2tfaXNfZ292ZXJub3IoKQogICAgY2FsbHN1YiBfY2hlY2tfaXNfZ292ZXJub3IKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IG5ld19nb3Zlcm5vcgogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19pc19nb3Zlcm5vcigpIC0+IHZvaWQ6Cl9jaGVja19pc19nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19pc19nb3Zlcm5vcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY1CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb3Zlcm5vciBleGlzdHMKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIC8vICksICJPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QiCiAgICBhc3NlcnQgLy8gT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJvb3RzdHJhcChzZWVkOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6CmJvb3RzdHJhcDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OS01MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgc2VlZDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sIGFfYXNzZXQ6IEFzc2V0LCBiX2Fzc2V0OiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5wb29sX3Rva2VuLCAiYXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyLCAiZ3JvdXAgc2l6ZSBub3QgMiIKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgc2VlZC5hbW91bnQgPj0gMzAwXzAwMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiICAjIDAuMyBBbGdvcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMzAwMDAwIC8vIDMwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhX2Fzc2V0LmlkIDwgYl9hc3NldC5pZCwgImFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYiIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzMKICAgIC8vIHNlbGYuYXNzZXRfYSA9IGFfYXNzZXQKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuYXNzZXRfYiA9IGJfYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYucG9vbF90b2tlbiA9IHNlbGYuX2NyZWF0ZV9wb29sX3Rva2VuKCkKICAgIGNhbGxzdWIgX2NyZWF0ZV9wb29sX3Rva2VuCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OAogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHNlbGYucG9vbF90b2tlbi5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NyZWF0ZV9wb29sX3Rva2VuKCkgLT4gdWludDY0OgpfY3JlYXRlX3Bvb2xfdG9rZW46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY4LTI2OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3JlYXRlX3Bvb2xfdG9rZW4oc2VsZikgLT4gQXNzZXQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjc5CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzIKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAweDQ0NTA1NDJkCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJkCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNvbmNhdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzcKICAgIC8vIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc1CiAgICAvLyBkZWNpbWFscz0zLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gdG90YWw9VE9UQUxfU1VQUExZLAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzMKICAgIC8vIHVuaXRfbmFtZT1iImRidCIsCiAgICBwdXNoYnl0ZXMgMHg2NDYyNzQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yODAKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzAtMjgxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4My0yODQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODYKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg1LTI4OQogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1Ni0zNTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0ubWludChhX3hmZXI6IHVpbnQ2NCwgYl94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm1pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgbWludCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYl94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDUgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMy0xMTQKICAgIC8vICMgd2VsbC1mb3JtZWQgbWludAogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBiX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIyCiAgICAvLyBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjAtMTIzCiAgICAvLyAjIHZhbGlkIGFzc2V0IGEgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFzc2VydCBhX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IGFfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjkKICAgIC8vIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNy0xMzAKICAgIC8vICMgdmFsaWQgYXNzZXQgYiB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGJfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgYl94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNC0xNDAKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiB0b2tlbnNfdG9fbWludAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfYm9vdHN0cmFwcGVkKCkgLT4gdm9pZDoKX2NoZWNrX2Jvb3RzdHJhcHBlZDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTEtMjUyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19ib290c3RyYXBwZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gYXNzZXJ0IHNlbGYucG9vbF90b2tlbiwgImJvb3RzdHJhcCBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGZpcnN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9wb29sX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X3Bvb2xfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X3Bvb2xfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTMKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYV9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9hX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9hX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9hLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2JfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYl9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYl9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYi5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50KHBvb2xfYmFsYW5jZTogdWludDY0LCBhX2JhbGFuY2U6IHVpbnQ2NCwgYl9iYWxhbmNlOiB1aW50NjQsIGFfYW1vdW50OiB1aW50NjQsIGJfYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX21pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzIyLTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICAqLAogICAgLy8gICAgIHBvb2xfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGJfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYl9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gNSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gaXNfaW5pdGlhbF9taW50ID0gYV9iYWxhbmNlID09IGFfYW1vdW50IGFuZCBiX2JhbGFuY2UgPT0gYl9hbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0Cgp0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAoKdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gaWYgaXNfaW5pdGlhbF9taW50OgogICAgYnogdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzMzCiAgICAvLyByZXR1cm4gb3Auc3FydChhX2Ftb3VudCAqIGJfYW1vdW50KSAtIFNDQUxFCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgc3FydAogICAgaW50Y18yIC8vIDEwMDAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM0CiAgICAvLyBpc3N1ZWQgPSBUT1RBTF9TVVBQTFkgLSBwb29sX2JhbGFuY2UKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgZnJhbWVfZGlnIC01CiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM1CiAgICAvLyBhX3JhdGlvID0gU0NBTEUgKiBhX2Ftb3VudCAvLyAoYV9iYWxhbmNlIC0gYV9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIGJfcmF0aW8gPSBTQ0FMRSAqIGJfYW1vdW50IC8vIChiX2JhbGFuY2UgLSBiX2Ftb3VudCkKICAgIGludGNfMiAvLyAxMDAwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gaWYgYV9yYXRpbyA8IGJfcmF0aW86CiAgICA8CiAgICBieiB0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAOAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmV0dXJuIGFfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRva2Vuc190b19taW50X2Vsc2VfYm9keUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIGJfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl91cGRhdGVfcmF0aW8oKSAtPiB2b2lkOgpfdXBkYXRlX3JhdGlvOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3VwZGF0ZV9yYXRpbyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU3CiAgICAvLyBhX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gYl9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYucmF0aW8gPSBhX2JhbGFuY2UgKiBTQ0FMRSAvLyBiX2JhbGFuY2UKICAgIHN3YXAKICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJ1cm4ocG9vbF94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmJ1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBidXJuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgcG9vbF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTczCiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc2LTE3OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwb29sX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzkKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxODEKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgzLTE4NQogICAgLy8gIyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXNzdWVkCiAgICAvLyAjICFpbXBvcnRhbnQ6IHRoaXMgaGFwcGVucyBwcmlvciB0byByZWNlaXZpbmcgdGhlIGN1cnJlbnQgYXhmZXIgb2YgcG9vbCB0b2tlbnMKICAgIC8vIHBvb2xfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg4CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg2LTE5MAogICAgLy8gYV9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkzCiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkxLTE5NQogICAgLy8gYl9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIC8vIGFtbS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vICMgU2VuZCBiYWNrIGNvbW1lbnN1cmF0ZSBhbXQgb2YgYgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5hc3NldF9iLCBhbW91bnQ9Yl9hbXQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX2J1cm4ocG9vbF9iYWxhbmNlOiB1aW50NjQsIHN1cHBseTogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b2tlbnNfdG9fYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMtMzQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRva2Vuc190b19idXJuKCosIHBvb2xfYmFsYW5jZTogVUludDY0LCBzdXBwbHk6IFVJbnQ2NCwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NQogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlIC0gYW1vdW50CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcChzd2FwX3hmZXI6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIHN3YXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzd2FwX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2E6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMS0yNDEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgbWF0Y2ggc3dhcF9zd2l0Y2hfY2FzZV8wQDEgc3dhcF9zd2l0Y2hfY2FzZV8xQDIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDEKICAgIC8vIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIGVyciAvLyBhc3NldCBpZCBpbmNvcnJlY3QKCnN3YXBfc3dpdGNoX2Nhc2VfMEAxOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM1CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGIgc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDQKCnN3YXBfc3dpdGNoX2Nhc2VfMUAyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM5CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vIHRvX3N3YXAgPSB0b2tlbnNfdG9fc3dhcCgKICAgIC8vICAgICBpbl9hbW91bnQ9c3dhcF94ZmVyLmFzc2V0X2Ftb3VudCwgaW5fc3VwcGx5PWluX3N1cHBseSwgb3V0X3N1cHBseT1vdXRfc3VwcGx5CiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0b2tlbnNfdG9fc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDgKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX3N3YXAoaW5fYW1vdW50OiB1aW50NjQsIGluX3N1cHBseTogdWludDY0LCBvdXRfc3VwcGx5OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX3N3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5LTM1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fc3dhcCgqLCBpbl9hbW91bnQ6IFVJbnQ2NCwgaW5fc3VwcGx5OiBVSW50NjQsIG91dF9zdXBwbHk6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUxCiAgICAvLyBpbl90b3RhbCA9IFNDQUxFICogKGluX3N1cHBseSAtIGluX2Ftb3VudCkgKyAoaW5fYW1vdW50ICogRkFDVE9SKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgOTk1IC8vIDk5NQogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTIKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/examples/amm/out/ConstantProductAMM.arc56.json b/examples/amm/out/ConstantProductAMM.arc56.json new file mode 100644 index 0000000000..4638da7049 --- /dev/null +++ b/examples/amm/out/ConstantProductAMM.arc56.json @@ -0,0 +1,506 @@ +{ + "name": "ConstantProductAMM", + "structs": {}, + "methods": [ + { + "name": "set_governor", + "args": [ + { + "type": "account", + "name": "new_governor" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "sets the governor of the contract, may only be called by the current governor", + "events": [], + "recommendations": {} + }, + { + "name": "bootstrap", + "args": [ + { + "type": "pay", + "name": "seed", + "desc": "Initial Payment transaction to the app account so it can opt in to assets and create pool token." + }, + { + "type": "asset", + "name": "a_asset", + "desc": "One of the two assets this pool should allow swapping between." + }, + { + "type": "asset", + "name": "b_asset", + "desc": "The other of the two assets this pool should allow swapping between." + } + ], + "returns": { + "type": "uint64", + "desc": "The asset id of the pool token created." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "bootstraps the contract by opting into the assets and creating the pool token.\nNote this method will fail if it is attempted more than once on the same contract since the assets and pool token application state values are marked as static and cannot be overridden.", + "events": [], + "recommendations": {} + }, + { + "name": "mint", + "args": [ + { + "type": "axfer", + "name": "a_xfer", + "desc": "Asset Transfer Transaction of asset A as a deposit to the pool in exchange for pool tokens." + }, + { + "type": "axfer", + "name": "b_xfer", + "desc": "Asset Transfer Transaction of asset B as a deposit to the pool in exchange for pool tokens." + }, + { + "type": "asset", + "name": "pool_asset", + "desc": "The asset ID of the pool token so that we may distribute it.", + "defaultValue": { + "source": "global", + "data": "cG9vbF90b2tlbg==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "a_asset", + "desc": "The asset ID of the Asset A so that we may inspect our balance.", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "The asset ID of the Asset B so that we may inspect our balance.", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "mint pool tokens given some amount of asset A and asset B.\nGiven some amount of Asset A and Asset B in the transfers, mint some number of pool tokens commensurate with the pools current balance and circulating supply of pool tokens.", + "events": [], + "recommendations": {} + }, + { + "name": "burn", + "args": [ + { + "type": "axfer", + "name": "pool_xfer", + "desc": "Asset Transfer Transaction of the pool token for the amount the sender wishes to redeem" + }, + { + "type": "asset", + "name": "pool_asset", + "desc": "Asset ID of the pool token so we may inspect balance.", + "defaultValue": { + "source": "global", + "data": "cG9vbF90b2tlbg==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "a_asset", + "desc": "Asset ID of Asset A so we may inspect balance and distribute it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "Asset ID of Asset B so we may inspect balance and distribute it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "burn pool tokens to get back some amount of asset A and asset B", + "events": [], + "recommendations": {} + }, + { + "name": "swap", + "args": [ + { + "type": "axfer", + "name": "swap_xfer", + "desc": "Asset Transfer Transaction of either Asset A or Asset B" + }, + { + "type": "asset", + "name": "a_asset", + "desc": "Asset ID of asset A so we may inspect balance and possibly transfer it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "Asset ID of asset B so we may inspect balance and possibly transfer it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Swap some amount of either asset A or asset B for the other", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 4, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "asset_a": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfYQ==" + }, + "asset_b": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfYg==" + }, + "governor": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z292ZXJub3I=" + }, + "pool_token": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cG9vbF90b2tlbg==" + }, + "ratio": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0aW8=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 145, + 163, + 207, + 258, + 298 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 363 + ], + "errorMessage": "Only the account set in global_state.governor may call this method" + }, + { + "pc": [ + 689, + 702, + 715 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 400, + 611, + 635, + 871, + 990 + ], + "errorMessage": "amount minimum not met" + }, + { + "pc": [ + 373 + ], + "errorMessage": "application has already been bootstrapped" + }, + { + "pc": [ + 563, + 605, + 849, + 976 + ], + "errorMessage": "asset a incorrect" + }, + { + "pc": [ + 406 + ], + "errorMessage": "asset a must be less than asset b" + }, + { + "pc": [ + 571, + 629, + 857, + 984 + ], + "errorMessage": "asset b incorrect" + }, + { + "pc": [ + 450, + 469 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 1017 + ], + "errorMessage": "asset id incorrect" + }, + { + "pc": [ + 555, + 841, + 881 + ], + "errorMessage": "asset pool incorrect" + }, + { + "pc": [ + 676 + ], + "errorMessage": "bootstrap method needs to be called first" + }, + { + "pc": [ + 337 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 148, + 166, + 210, + 261, + 301 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 424, + 447, + 559, + 603, + 699, + 845, + 920, + 972, + 1002, + 1032 + ], + "errorMessage": "check self.asset_a exists" + }, + { + "pc": [ + 431, + 466, + 567, + 627, + 712, + 853, + 931, + 980, + 1006, + 1050 + ], + "errorMessage": "check self.asset_b exists" + }, + { + "pc": [ + 361 + ], + "errorMessage": "check self.governor exists" + }, + { + "pc": [ + 371, + 438, + 551, + 659, + 675, + 686, + 837, + 879 + ], + "errorMessage": "check self.pool_token exists" + }, + { + "pc": [ + 382 + ], + "errorMessage": "group size not 2" + }, + { + "pc": [ + 390, + 595, + 619, + 865 + ], + "errorMessage": "receiver not app address" + }, + { + "pc": [ + 653, + 1061 + ], + "errorMessage": "send amount too low" + }, + { + "pc": [ + 579, + 587, + 889, + 998 + ], + "errorMessage": "sender invalid" + }, + { + "pc": [ + 221, + 231, + 271, + 311 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 176 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfZ292ZXJub3IKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWludF9yb3V0ZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDctMTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBidXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zd2FwX3JvdXRlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDQtMjA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5zZXRfZ292ZXJub3IobmV3X2dvdmVybm9yOiBieXRlcykgLT4gdm9pZDoKc2V0X2dvdmVybm9yOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHNldF9nb3Zlcm5vcihzZWxmLCBuZXdfZ292ZXJub3I6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NgogICAgLy8gc2VsZi5fY2hlY2tfaXNfZ292ZXJub3IoKQogICAgY2FsbHN1YiBfY2hlY2tfaXNfZ292ZXJub3IKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IG5ld19nb3Zlcm5vcgogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19pc19nb3Zlcm5vcigpIC0+IHZvaWQ6Cl9jaGVja19pc19nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19pc19nb3Zlcm5vcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY1CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb3Zlcm5vciBleGlzdHMKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIC8vICksICJPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QiCiAgICBhc3NlcnQgLy8gT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJvb3RzdHJhcChzZWVkOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6CmJvb3RzdHJhcDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OS01MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgc2VlZDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sIGFfYXNzZXQ6IEFzc2V0LCBiX2Fzc2V0OiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5wb29sX3Rva2VuLCAiYXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyLCAiZ3JvdXAgc2l6ZSBub3QgMiIKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgc2VlZC5hbW91bnQgPj0gMzAwXzAwMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiICAjIDAuMyBBbGdvcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMzAwMDAwIC8vIDMwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhX2Fzc2V0LmlkIDwgYl9hc3NldC5pZCwgImFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYiIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzMKICAgIC8vIHNlbGYuYXNzZXRfYSA9IGFfYXNzZXQKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuYXNzZXRfYiA9IGJfYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYucG9vbF90b2tlbiA9IHNlbGYuX2NyZWF0ZV9wb29sX3Rva2VuKCkKICAgIGNhbGxzdWIgX2NyZWF0ZV9wb29sX3Rva2VuCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OAogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHNlbGYucG9vbF90b2tlbi5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NyZWF0ZV9wb29sX3Rva2VuKCkgLT4gdWludDY0OgpfY3JlYXRlX3Bvb2xfdG9rZW46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY4LTI2OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3JlYXRlX3Bvb2xfdG9rZW4oc2VsZikgLT4gQXNzZXQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjc5CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzIKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAweDQ0NTA1NDJkCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJkCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNvbmNhdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzcKICAgIC8vIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc1CiAgICAvLyBkZWNpbWFscz0zLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gdG90YWw9VE9UQUxfU1VQUExZLAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzMKICAgIC8vIHVuaXRfbmFtZT1iImRidCIsCiAgICBwdXNoYnl0ZXMgMHg2NDYyNzQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yODAKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzAtMjgxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4My0yODQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODYKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg1LTI4OQogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1Ni0zNTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0ubWludChhX3hmZXI6IHVpbnQ2NCwgYl94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm1pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgbWludCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYl94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDUgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMy0xMTQKICAgIC8vICMgd2VsbC1mb3JtZWQgbWludAogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBiX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIyCiAgICAvLyBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjAtMTIzCiAgICAvLyAjIHZhbGlkIGFzc2V0IGEgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFzc2VydCBhX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IGFfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjkKICAgIC8vIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNy0xMzAKICAgIC8vICMgdmFsaWQgYXNzZXQgYiB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGJfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgYl94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNC0xNDAKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiB0b2tlbnNfdG9fbWludAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfYm9vdHN0cmFwcGVkKCkgLT4gdm9pZDoKX2NoZWNrX2Jvb3RzdHJhcHBlZDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTEtMjUyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19ib290c3RyYXBwZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gYXNzZXJ0IHNlbGYucG9vbF90b2tlbiwgImJvb3RzdHJhcCBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGZpcnN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9wb29sX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X3Bvb2xfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X3Bvb2xfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTMKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYV9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9hX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9hX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9hLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2JfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYl9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYl9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYi5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50KHBvb2xfYmFsYW5jZTogdWludDY0LCBhX2JhbGFuY2U6IHVpbnQ2NCwgYl9iYWxhbmNlOiB1aW50NjQsIGFfYW1vdW50OiB1aW50NjQsIGJfYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX21pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzIyLTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICAqLAogICAgLy8gICAgIHBvb2xfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGJfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYl9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gNSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gaXNfaW5pdGlhbF9taW50ID0gYV9iYWxhbmNlID09IGFfYW1vdW50IGFuZCBiX2JhbGFuY2UgPT0gYl9hbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0Cgp0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAoKdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gaWYgaXNfaW5pdGlhbF9taW50OgogICAgYnogdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzMzCiAgICAvLyByZXR1cm4gb3Auc3FydChhX2Ftb3VudCAqIGJfYW1vdW50KSAtIFNDQUxFCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgc3FydAogICAgaW50Y18yIC8vIDEwMDAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM0CiAgICAvLyBpc3N1ZWQgPSBUT1RBTF9TVVBQTFkgLSBwb29sX2JhbGFuY2UKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgZnJhbWVfZGlnIC01CiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM1CiAgICAvLyBhX3JhdGlvID0gU0NBTEUgKiBhX2Ftb3VudCAvLyAoYV9iYWxhbmNlIC0gYV9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIGJfcmF0aW8gPSBTQ0FMRSAqIGJfYW1vdW50IC8vIChiX2JhbGFuY2UgLSBiX2Ftb3VudCkKICAgIGludGNfMiAvLyAxMDAwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gaWYgYV9yYXRpbyA8IGJfcmF0aW86CiAgICA8CiAgICBieiB0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAOAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmV0dXJuIGFfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRva2Vuc190b19taW50X2Vsc2VfYm9keUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIGJfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl91cGRhdGVfcmF0aW8oKSAtPiB2b2lkOgpfdXBkYXRlX3JhdGlvOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3VwZGF0ZV9yYXRpbyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU3CiAgICAvLyBhX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gYl9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYucmF0aW8gPSBhX2JhbGFuY2UgKiBTQ0FMRSAvLyBiX2JhbGFuY2UKICAgIHN3YXAKICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJ1cm4ocG9vbF94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmJ1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBidXJuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgcG9vbF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTczCiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc2LTE3OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwb29sX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzkKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxODEKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgzLTE4NQogICAgLy8gIyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXNzdWVkCiAgICAvLyAjICFpbXBvcnRhbnQ6IHRoaXMgaGFwcGVucyBwcmlvciB0byByZWNlaXZpbmcgdGhlIGN1cnJlbnQgYXhmZXIgb2YgcG9vbCB0b2tlbnMKICAgIC8vIHBvb2xfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg4CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg2LTE5MAogICAgLy8gYV9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkzCiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkxLTE5NQogICAgLy8gYl9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIC8vIGFtbS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vICMgU2VuZCBiYWNrIGNvbW1lbnN1cmF0ZSBhbXQgb2YgYgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5hc3NldF9iLCBhbW91bnQ9Yl9hbXQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX2J1cm4ocG9vbF9iYWxhbmNlOiB1aW50NjQsIHN1cHBseTogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b2tlbnNfdG9fYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMtMzQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRva2Vuc190b19idXJuKCosIHBvb2xfYmFsYW5jZTogVUludDY0LCBzdXBwbHk6IFVJbnQ2NCwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NQogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlIC0gYW1vdW50CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcChzd2FwX3hmZXI6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIHN3YXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzd2FwX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2E6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMS0yNDEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgbWF0Y2ggc3dhcF9zd2l0Y2hfY2FzZV8wQDEgc3dhcF9zd2l0Y2hfY2FzZV8xQDIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDEKICAgIC8vIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIGVyciAvLyBhc3NldCBpZCBpbmNvcnJlY3QKCnN3YXBfc3dpdGNoX2Nhc2VfMEAxOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM1CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGIgc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDQKCnN3YXBfc3dpdGNoX2Nhc2VfMUAyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM5CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vIHRvX3N3YXAgPSB0b2tlbnNfdG9fc3dhcCgKICAgIC8vICAgICBpbl9hbW91bnQ9c3dhcF94ZmVyLmFzc2V0X2Ftb3VudCwgaW5fc3VwcGx5PWluX3N1cHBseSwgb3V0X3N1cHBseT1vdXRfc3VwcGx5CiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0b2tlbnNfdG9fc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDgKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX3N3YXAoaW5fYW1vdW50OiB1aW50NjQsIGluX3N1cHBseTogdWludDY0LCBvdXRfc3VwcGx5OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX3N3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5LTM1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fc3dhcCgqLCBpbl9hbW91bnQ6IFVJbnQ2NCwgaW5fc3VwcGx5OiBVSW50NjQsIG91dF9zdXBwbHk6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUxCiAgICAvLyBpbl90b3RhbCA9IFNDQUxFICogKGluX3N1cHBseSAtIGluX2Ftb3VudCkgKyAoaW5fYW1vdW50ICogRkFDVE9SKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgOTk1IC8vIDk5NQogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTIKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAFAAHoBwSAyK+gJSYFB2Fzc2V0X2EHYXNzZXRfYgpwb29sX3Rva2VuCGdvdmVybm9yBXJhdGlvMRhAAAOIAASIABZDigAAKCJnKSJnKzEAZyoiZycEImeJigABMRtBAOeCBQQIqVb3BGtZ2WUEXL8eLQQUNsKsBEqI4FU2GgCOBQACABQAQABzAJsiiTEZFEQxGEQ2GgEXwByIALgjiTEZFEQxGEQxFiMJSTgQIxJENhoBF8AwNhoCF8AwiACtFoAEFR98dUxQsCOJMRkURDEYRDEWgQIJSTgQJRJEMRYjCUk4ECUSRDYaARfAMDYaAhfAMDYaAxfAMIgBISOJMRkURDEYRDEWIwlJOBAlEkQ2GgEXwDA2GgIXwDA2GgMXwDCIAhcjiTEZFEQxGEQxFiMJSTgQJRJENhoBF8AwNhoCF8AwiAJ5I4kxGUAABjEYFEQjiSKJigEAiAAFK4v/Z4mKAAAxACIrZUQSRImKAwEiKmVEFESI/+gyBIECEkSL/TgHMgoSRIv9OAiB4KcSD0SL/ov/DEQoi/5nKYv/Z4gAFipMZyIoZUSIAE4iKWVEiABHIiplRImKAAGxIihlRHEDRIAERFBULUxQgAEtUCIpZURxA0RQMgpJsiqyKYEDsiMhBLIigANkYnSyJbImgQOyECKyAbO0PImKAQAyCov/IogAAYmKAwCxi/2yFIv/shKL/rIRJbIQIrIBs4mKBQCIAHkiKmVEi/0SRCIoZUSL/hJEIillRIv/EkSL+zgAMQASRIv8OAAxABJEi/s4FDIKEkSL+zgRIihlRBJEi/s4EklEi/w4FDIKEkSL/DgRIillRBJEi/w4EklEiAAniAAxiAA7TwRPBIgAQUlEMQAiKmVETwKI/22IAI2JigAAIiplRESJigABMgoiKmVEcABEiYoAATIKIihlRHAARImKAAEyCiIpZURwAESJigUBgABJi/yL/hJBAAyL/Yv/EkEABCNCAAEiQQALi/6L/wuSJAmMAIkhBIv7CSSL/guL/Iv+CQpJjAAki/8Li/2L/wkKSYwBDEEACIsACyQKjACJiwELJAqMAImKAACI/4SI/45MJAtMCicETGeJigQAiP9bIiplRIv9EkQiKGVEi/4SRCIpZUSL/xJEi/w4FDIKEkSL/DgSSUSL/DgRIiplRBJEi/w4ADEAEkSI/ymI/zNLAUxLA4gAJYj/NU8CTE8DiAAaMQAiKGVETwOI/mgxACIpZURPAoj+XYj/fYmKAwEhBIv9CYv/CYv+i/8LTAqJigMAgABJiP7UIihlRIv+EkQiKWVEi/8SRIv9OBJJRIv9OAAxABJEIihlRCIpZUSL/TgRjgIAAQATAIj+w4wAiP6xIihlTIwBREIAD4j+pIwAiP6sIillTIwBRIsCiwBPAogAD0lEMQCLAU8CiP3XiP73iYoDAYv+i/0JJAuL/YHjBwtMSwEITIv/C0wKiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/amm/out/ConstantProductAMM.destructured.ir b/examples/amm/out/ConstantProductAMM.destructured.ir index bc63039488..99941b7517 100644 --- a/examples/amm/out/ConstantProductAMM.destructured.ir +++ b/examples/amm/out/ConstantProductAMM.destructured.ir @@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM: block@2: // set_governor_route_L43 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM: block@3: // bootstrap_route_L49 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM: block@4: // mint_route_L81 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM: block@5: // burn_route_L147 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM: block@6: // swap_route_L204 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM: block@10: // __algopy_default_create_L1 let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (! tmp%63#0) - (assert tmp%64#0) // is creating + (assert tmp%64#0) // can only call when creating return 1u block@13: // after_if_else_L27 return 0u diff --git a/examples/amm/out/ConstantProductAMM.ssa.ir b/examples/amm/out/ConstantProductAMM.ssa.ir index 0fb962fb89..8835783656 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.ir @@ -32,10 +32,10 @@ contract examples.amm.contract.ConstantProductAMM: block@2: // set_governor_route_L43 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0) @@ -44,10 +44,10 @@ contract examples.amm.contract.ConstantProductAMM: block@3: // bootstrap_route_L49 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -67,10 +67,10 @@ contract examples.amm.contract.ConstantProductAMM: block@4: // mint_route_L81 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -95,10 +95,10 @@ contract examples.amm.contract.ConstantProductAMM: block@5: // burn_route_L147 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -118,10 +118,10 @@ contract examples.amm.contract.ConstantProductAMM: block@6: // swap_route_L204 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (== tmp%51#0 NoOp) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) let tmp%54#0: bool = (!= tmp%53#0 0u) - (assert tmp%54#0) // is not creating + (assert tmp%54#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -145,7 +145,7 @@ contract examples.amm.contract.ConstantProductAMM: block@10: // __algopy_default_create_L1 let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (== tmp%63#0 0u) - (assert tmp%64#0) // is creating + (assert tmp%64#0) // can only call when creating examples.amm.contract.ConstantProductAMM.__algopy_default_create() return 1u block@11: // switch_case_default_L27 diff --git a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir index 1b160b38ef..05561550b6 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir @@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM: block@2: // set_governor_route_L43 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM: block@3: // bootstrap_route_L49 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM: block@4: // mint_route_L81 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM: block@5: // burn_route_L147 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM: block@6: // swap_route_L204 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM: block@10: // __algopy_default_create_L1 let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (! tmp%63#0) - (assert tmp%64#0) // is creating + (assert tmp%64#0) // can only call when creating return 1u block@13: // after_if_else_L27 return 0u diff --git a/examples/amm/out/client_ConstantProductAMM.py b/examples/amm/out/client_ConstantProductAMM.py index 27dddb37a5..1ce44d23e3 100644 --- a/examples/amm/out/client_ConstantProductAMM.py +++ b/examples/amm/out/client_ConstantProductAMM.py @@ -21,7 +21,7 @@ def bootstrap( b_asset: algopy.Asset, ) -> algopy.arc4.UIntN[typing.Literal[64]]: ... - @algopy.arc4.abimethod(default_args={'pool_asset': 'pool_token', 'a_asset': 'asset_a', 'b_asset': 'asset_b'}) + @algopy.arc4.abimethod def mint( self, a_xfer: algopy.gtxn.AssetTransferTransaction, @@ -31,7 +31,7 @@ def mint( b_asset: algopy.Asset, ) -> None: ... - @algopy.arc4.abimethod(default_args={'pool_asset': 'pool_token', 'a_asset': 'asset_a', 'b_asset': 'asset_b'}) + @algopy.arc4.abimethod def burn( self, pool_xfer: algopy.gtxn.AssetTransferTransaction, @@ -40,7 +40,7 @@ def burn( b_asset: algopy.Asset, ) -> None: ... - @algopy.arc4.abimethod(default_args={'a_asset': 'asset_a', 'b_asset': 'asset_b'}) + @algopy.arc4.abimethod def swap( self, swap_xfer: algopy.gtxn.AssetTransferTransaction, diff --git a/examples/amm/out_O2/ConstantProductAMM.approval.teal b/examples/amm/out_O2/ConstantProductAMM.approval.teal index f05c0010f7..bbc709265f 100644 --- a/examples/amm/out_O2/ConstantProductAMM.approval.teal +++ b/examples/amm/out_O2/ConstantProductAMM.approval.teal @@ -47,9 +47,9 @@ __puya_arc4_router__: __puya_arc4_router___set_governor_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Accounts @@ -60,9 +60,9 @@ __puya_arc4_router___set_governor_route@2: __puya_arc4_router___bootstrap_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - @@ -89,9 +89,9 @@ __puya_arc4_router___bootstrap_route@3: __puya_arc4_router___mint_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex pushint 2 // 2 - @@ -124,9 +124,9 @@ __puya_arc4_router___mint_route@4: __puya_arc4_router___burn_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - @@ -151,9 +151,9 @@ __puya_arc4_router___burn_route@5: __puya_arc4_router___swap_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - @@ -177,7 +177,7 @@ __puya_arc4_router___bare_routing@9: bnz __puya_arc4_router___after_if_else@13 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/amm/out_O2/ConstantProductAMM.destructured.ir b/examples/amm/out_O2/ConstantProductAMM.destructured.ir index bc63039488..99941b7517 100644 --- a/examples/amm/out_O2/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_O2/ConstantProductAMM.destructured.ir @@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM: block@2: // set_governor_route_L43 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM: block@3: // bootstrap_route_L49 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM: block@4: // mint_route_L81 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM: block@5: // burn_route_L147 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM: block@6: // swap_route_L204 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM: block@10: // __algopy_default_create_L1 let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (! tmp%63#0) - (assert tmp%64#0) // is creating + (assert tmp%64#0) // can only call when creating return 1u block@13: // after_if_else_L27 return 0u diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal index 514bb3a8b5..742adae4f7 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal +++ b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal @@ -76,11 +76,11 @@ __puya_arc4_router___set_governor_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txna ApplicationArgs 1 @@ -98,11 +98,11 @@ __puya_arc4_router___bootstrap_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -145,11 +145,11 @@ __puya_arc4_router___mint_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -206,11 +206,11 @@ __puya_arc4_router___burn_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -257,11 +257,11 @@ __puya_arc4_router___swap_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // amm/contract.py:27 // class ConstantProductAMM(ARC4Contract): txn GroupIndex @@ -308,7 +308,7 @@ __puya_arc4_router_____algopy_default_create@10: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir index 8955b74db2..47e2d1bf7b 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir @@ -32,10 +32,10 @@ contract examples.amm.contract.ConstantProductAMM: block@2: // set_governor_route_L43 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0) @@ -44,10 +44,10 @@ contract examples.amm.contract.ConstantProductAMM: block@3: // bootstrap_route_L49 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -67,10 +67,10 @@ contract examples.amm.contract.ConstantProductAMM: block@4: // mint_route_L81 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -95,10 +95,10 @@ contract examples.amm.contract.ConstantProductAMM: block@5: // burn_route_L147 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -118,10 +118,10 @@ contract examples.amm.contract.ConstantProductAMM: block@6: // swap_route_L204 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (== tmp%51#0 NoOp) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) let tmp%54#0: bool = (!= tmp%53#0 0u) - (assert tmp%54#0) // is not creating + (assert tmp%54#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -145,7 +145,7 @@ contract examples.amm.contract.ConstantProductAMM: block@10: // __algopy_default_create_L1 let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (== tmp%63#0 0u) - (assert tmp%64#0) // is creating + (assert tmp%64#0) // can only call when creating examples.amm.contract.ConstantProductAMM.__algopy_default_create() return 1u block@11: // switch_case_default_L27 diff --git a/examples/amm/puya.log b/examples/amm/puya.log index b5410c8e19..c7720866d6 100644 --- a/examples/amm/puya.log +++ b/examples/amm/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['amm'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['amm'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing amm/out/module.awst debug: Sealing block@0: // L12 @@ -1962,6 +1962,7 @@ debug: examples.amm.contract.tokens_to_mint f-stack on first store: [] debug: examples.amm.contract.ConstantProductAMM.swap f-stack entry: ['in_supply#0', 'out_asset#0'] debug: examples.amm.contract.ConstantProductAMM.swap f-stack on first store: ['tmp%2#0'] info: Writing amm/out/ConstantProductAMM.arc32.json +info: Writing amm/out/ConstantProductAMM.arc56.json info: Writing amm/out/ConstantProductAMM.approval.teal info: Writing amm/out/ConstantProductAMM.clear.teal info: Writing amm/out/ConstantProductAMM.approval.bin diff --git a/examples/arc_28/out/EventEmitter.approval.mir b/examples/arc_28/out/EventEmitter.approval.mir index 845c7aaaaf..2bb6b91697 100644 --- a/examples/arc_28/out/EventEmitter.approval.mir +++ b/examples/arc_28/out/EventEmitter.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___emit_swapped_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -54,9 +54,9 @@ __puya_arc4_router___emit_ufixed_route@3: // @arc4.abimethod() txn OnCompletion tmp%9#0 ! tmp%10#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%11#0 - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 tmp%13#0 @@ -79,7 +79,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%16#0 ! tmp%17#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 @@ -105,16 +105,16 @@ emit_swapped_block@0: ( concat (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0 method Swapped(uint64,uint64) (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0,Method(Swapped(uint64,uint64)) l-load encoded_tuple_buffer%2#0 1 (𝕡) a#0,b#0 | Method(Swapped(uint64,uint64)),encoded_tuple_buffer%2#0 - concat (𝕡) a#0,b#0 | tmp%0#0 - l-load-copy tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0,tmp%0#0 (copy) - log (𝕡) a#0,b#0 | tmp%0#0 + concat (𝕡) a#0,b#0 | event%0#0 + l-load-copy event%0#0 0 (𝕡) a#0,b#0 | event%0#0,event%0#0 (copy) + log (𝕡) a#0,b#0 | event%0#0 // arc_28/contract.py:15 // arc4.emit("Swapped(uint64,uint64)", b, a) - l-load-copy tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0,tmp%0#0 (copy) - log (𝕡) a#0,b#0 | tmp%0#0 + l-load-copy event%0#0 0 (𝕡) a#0,b#0 | event%0#0,event%0#0 (copy) + log (𝕡) a#0,b#0 | event%0#0 // arc_28/contract.py:16 // arc4.emit("Swapped", b, a) - l-load tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0 + l-load event%0#0 0 (𝕡) a#0,b#0 | event%0#0 log (𝕡) a#0,b#0 | retsub @@ -138,7 +138,7 @@ emit_ufixed_block@0: ( concat (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0 method AnEvent(ufixed256x16,ufixed64x2) (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0,Method(AnEvent(ufixed256x16,ufixed64x2)) l-load encoded_tuple_buffer%2#0 1 (𝕡) a#0,b#0 | Method(AnEvent(ufixed256x16,ufixed64x2)),encoded_tuple_buffer%2#0 - concat (𝕡) a#0,b#0 | tmp%0#0 + concat (𝕡) a#0,b#0 | event%0#0 log (𝕡) a#0,b#0 | retsub diff --git a/examples/arc_28/out/EventEmitter.approval.teal b/examples/arc_28/out/EventEmitter.approval.teal index a9149fc187..0a4eeb8d08 100644 --- a/examples/arc_28/out/EventEmitter.approval.teal +++ b/examples/arc_28/out/EventEmitter.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___emit_swapped_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 @@ -42,9 +42,9 @@ __puya_arc4_router___emit_ufixed_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 @@ -62,7 +62,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/arc_28/out/EventEmitter.arc32.json b/examples/arc_28/out/EventEmitter.arc32.json index a4a51beaa0..efa6c58bd0 100644 --- a/examples/arc_28/out/EventEmitter.arc32.json +++ b/examples/arc_28/out/EventEmitter.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVtaXRfc3dhcHBlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGVtaXRfdWZpeGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXJjXzI4LmNvbnRyYWN0LkV2ZW50RW1pdHRlci5lbWl0X3N3YXBwZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3N3YXBwZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTItMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVtaXRfc3dhcHBlZChzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNAogICAgLy8gYXJjNC5lbWl0KFN3YXBwZWQoYiwgYSkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxY2NiZDkyNSAvLyBtZXRob2QgIlN3YXBwZWQodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTUKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCh1aW50NjQsdWludDY0KSIsIGIsIGEpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhcmM0LmVtaXQoIlN3YXBwZWQiLCBiLCBhKQogICAgbG9nCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfdWZpeGVkKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdm9pZDoKZW1pdF91Zml4ZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgtMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZW1pdF91Zml4ZWQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhOiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLAogICAgLy8gICAgIGI6IGFyYzQuVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzY0XSwgdHlwaW5nLkxpdGVyYWxbMl1dLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MjQKICAgIC8vIGFyYzQuZW1pdCgiQW5FdmVudCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4MikiLCBhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NzM4OWIxYmEgLy8gbWV0aG9kICJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZW1pdF9zd2FwcGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0X3VmaXhlZF9yb3V0ZUAzOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBlbWl0X3VmaXhlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfc3dhcHBlZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmVtaXRfc3dhcHBlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZW1pdF9zd2FwcGVkKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZChiLCBhKSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDFjY2JkOTI1IC8vIG1ldGhvZCAiU3dhcHBlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNQogICAgLy8gYXJjNC5lbWl0KCJTd2FwcGVkKHVpbnQ2NCx1aW50NjQpIiwgYiwgYSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTYKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCIsIGIsIGEpCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFyY18yOC5jb250cmFjdC5FdmVudEVtaXR0ZXIuZW1pdF91Zml4ZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3VmaXhlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOC0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBlbWl0X3VmaXhlZCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuQmlnVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzI1Nl0sIHR5cGluZy5MaXRlcmFsWzE2XV0sCiAgICAvLyAgICAgYjogYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbNjRdLCB0eXBpbmcuTGl0ZXJhbFsyXV0sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToyNAogICAgLy8gYXJjNC5lbWl0KCJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIsIGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg3Mzg5YjFiYSAvLyBtZXRob2QgIkFuRXZlbnQodWZpeGVkMjU2eDE2LHVmaXhlZDY0eDIpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/examples/arc_28/out/EventEmitter.arc56.json b/examples/arc_28/out/EventEmitter.arc56.json new file mode 100644 index 0000000000..19d5c6d073 --- /dev/null +++ b/examples/arc_28/out/EventEmitter.arc56.json @@ -0,0 +1,219 @@ +{ + "name": "EventEmitter", + "structs": {}, + "methods": [ + { + "name": "emit_swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ] + }, + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "field1" + }, + { + "type": "uint64", + "name": "field2" + } + ] + } + ], + "recommendations": {} + }, + { + "name": "emit_ufixed", + "args": [ + { + "type": "ufixed256x16", + "name": "a" + }, + { + "type": "ufixed64x2", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "AnEvent", + "args": [ + { + "type": "ufixed256x16", + "name": "field1" + }, + { + "type": "ufixed64x2", + "name": "field2" + } + ] + } + ], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43, + 61 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 84 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 46, + 64 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZW1pdF9zd2FwcGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0X3VmaXhlZF9yb3V0ZUAzOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBlbWl0X3VmaXhlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfc3dhcHBlZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmVtaXRfc3dhcHBlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZW1pdF9zd2FwcGVkKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZChiLCBhKSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDFjY2JkOTI1IC8vIG1ldGhvZCAiU3dhcHBlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNQogICAgLy8gYXJjNC5lbWl0KCJTd2FwcGVkKHVpbnQ2NCx1aW50NjQpIiwgYiwgYSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTYKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCIsIGIsIGEpCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFyY18yOC5jb250cmFjdC5FdmVudEVtaXR0ZXIuZW1pdF91Zml4ZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3VmaXhlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOC0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBlbWl0X3VmaXhlZCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuQmlnVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzI1Nl0sIHR5cGluZy5MaXRlcmFsWzE2XV0sCiAgICAvLyAgICAgYjogYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbNjRdLCB0eXBpbmcuTGl0ZXJhbFsyXV0sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToyNAogICAgLy8gYXJjNC5lbWl0KCJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIsIGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg3Mzg5YjFiYSAvLyBtZXRob2QgIkFuRXZlbnQodWZpeGVkMjU2eDE2LHVmaXhlZDY0eDIpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBADuCAgQKlULNBHGjFR82GgCOAgACABQjiTEZFEQxGEQ2GgE2GgKIACEiiTEZFEQxGEQ2GgE2GgKIACUiiTEZQAAGMRgURCKJI4mKAgCL/4v+UIAEHMvZJUxQSbBJsLCJigIAi/6L/1CABHOJsbpMULCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [ + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ] + }, + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "field1" + }, + { + "type": "uint64", + "name": "field2" + } + ] + }, + { + "name": "AnEvent", + "args": [ + { + "type": "ufixed256x16", + "name": "field1" + }, + { + "type": "ufixed64x2", + "name": "field2" + } + ] + } + ], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/arc_28/out/EventEmitter.destructured.ir b/examples/arc_28/out/EventEmitter.destructured.ir index e6398ae78b..e7262f2440 100644 --- a/examples/arc_28/out/EventEmitter.destructured.ir +++ b/examples/arc_28/out/EventEmitter.destructured.ir @@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/EventEmitter.ssa.ir b/examples/arc_28/out/EventEmitter.ssa.ir index d6ab7c516c..51c871040d 100644 --- a/examples/arc_28/out/EventEmitter.ssa.ir +++ b/examples/arc_28/out/EventEmitter.ssa.ir @@ -16,10 +16,10 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -27,10 +27,10 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -45,7 +45,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating examples.arc_28.contract.EventEmitter.__algopy_default_create() return 1u block@8: // switch_case_default_L11 @@ -61,20 +61,20 @@ contract examples.arc_28.contract.EventEmitter: let encoded_tuple_buffer%0#0: bytes = 0x let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 b#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let current_tail_offset%1#0: uint64 = 16u let encoded_tuple_buffer%3#0: bytes = 0x let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 b#0) let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let current_tail_offset%2#0: uint64 = 16u let encoded_tuple_buffer%6#0: bytes = 0x let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 b#0) let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: @@ -83,8 +83,8 @@ contract examples.arc_28.contract.EventEmitter: let encoded_tuple_buffer%0#0: bytes = 0x let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 a#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.__algopy_default_create() -> void: diff --git a/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir b/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir index eec5395287..87af5ba3f5 100644 --- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir +++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u @@ -47,24 +47,24 @@ contract examples.arc_28.contract.EventEmitter: block@0: // L12 let encoded_tuple_buffer%1#0: bytes = b#0 let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let encoded_tuple_buffer%4#0: bytes = b#0 let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let encoded_tuple_buffer%7#0: bytes = b#0 let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%1#0: bytes = a#0 let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir b/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir index e6398ae78b..e7262f2440 100644 --- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir +++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/module.awst b/examples/arc_28/out/module.awst index e8e5c520b1..283892aa07 100644 --- a/examples/arc_28/out/module.awst +++ b/examples/arc_28/out/module.awst @@ -16,14 +16,14 @@ contract EventEmitter abimethod examples.arc_28.contract.EventEmitter.emit_swapped(a: arc4.uint64, b: arc4.uint64): void { - log(concat(Method("Swapped(uint64,uint64)"), new examples.arc_28.contract.Swapped(a=b, b=a))) - log(concat(Method("Swapped(uint64,uint64)"), arc4_encode((b, a), arc4.tuple))) - log(concat(Method("Swapped(uint64,uint64)"), arc4_encode((b, a), arc4.tuple))) + emit('Swapped(uint64,uint64)', new examples.arc_28.contract.Swapped(a=b, b=a)) + emit('Swapped(uint64,uint64)', new Swapped(field1=b, field2=a)) + emit('Swapped(uint64,uint64)', new Swapped(field1=b, field2=a)) } abimethod examples.arc_28.contract.EventEmitter.emit_ufixed(a: arc4.ufixed256x16, b: arc4.ufixed64x2): void { - log(concat(Method("AnEvent(ufixed256x16,ufixed64x2)"), arc4_encode((a, b), arc4.tuple))) + emit('AnEvent(ufixed256x16,ufixed64x2)', new AnEvent(field1=a, field2=b)) } baremethod examples.arc_28.contract.EventEmitter.__algopy_default_create(): void diff --git a/examples/arc_28/out_O2/EventEmitter.approval.teal b/examples/arc_28/out_O2/EventEmitter.approval.teal index a804dc0069..8378c10ee5 100644 --- a/examples/arc_28/out_O2/EventEmitter.approval.teal +++ b/examples/arc_28/out_O2/EventEmitter.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___emit_swapped_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 callsub emit_swapped @@ -32,9 +32,9 @@ __puya_arc4_router___emit_swapped_route@2: __puya_arc4_router___emit_ufixed_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 callsub emit_ufixed @@ -46,7 +46,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/arc_28/out_O2/EventEmitter.destructured.ir b/examples/arc_28/out_O2/EventEmitter.destructured.ir index e6398ae78b..e7262f2440 100644 --- a/examples/arc_28/out_O2/EventEmitter.destructured.ir +++ b/examples/arc_28/out_O2/EventEmitter.destructured.ir @@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out_unoptimized/EventEmitter.approval.teal b/examples/arc_28/out_unoptimized/EventEmitter.approval.teal index abe41c22a7..b58ee4e527 100644 --- a/examples/arc_28/out_unoptimized/EventEmitter.approval.teal +++ b/examples/arc_28/out_unoptimized/EventEmitter.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___emit_swapped_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 @@ -50,11 +50,11 @@ __puya_arc4_router___emit_ufixed_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // arc_28/contract.py:11 // class EventEmitter(ARC4Contract): txna ApplicationArgs 1 @@ -81,7 +81,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir index 18b6675a5f..877104a918 100644 --- a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir +++ b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir @@ -16,10 +16,10 @@ contract examples.arc_28.contract.EventEmitter: block@2: // emit_swapped_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0) @@ -27,10 +27,10 @@ contract examples.arc_28.contract.EventEmitter: block@3: // emit_ufixed_route_L18 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%13#0: bytes = (txna ApplicationArgs 1) let tmp%14#0: bytes = (txna ApplicationArgs 2) examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0) @@ -45,7 +45,7 @@ contract examples.arc_28.contract.EventEmitter: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating examples.arc_28.contract.EventEmitter.__algopy_default_create() return 1u block@8: // switch_case_default_L11 @@ -59,24 +59,24 @@ contract examples.arc_28.contract.EventEmitter: block@0: // L12 let encoded_tuple_buffer%1#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let encoded_tuple_buffer%4#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let encoded_tuple_buffer%7#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%1#0: bytes = (concat 0x a#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.__algopy_default_create() -> void: diff --git a/examples/arc_28/puya.log b/examples/arc_28/puya.log index 82741a52ea..edf4abd904 100644 --- a/examples/arc_28/puya.log +++ b/examples/arc_28/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_28'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_28'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing arc_28/out/module.awst debug: Sealing block@0: // L12 @@ -551,10 +551,10 @@ debug: Replacing redundant declaration let encoded_tuple_buffer%5#0: bytes = (co debug: Replacing redundant declaration let encoded_tuple_buffer%8#0: bytes = (concat b#0 a#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:18-31, ir_type=bytes, name='encoded_tuple_buffer%2', version=0),) debug: Found equivalence set: encoded_tuple_buffer%2#0, encoded_tuple_buffer%5#0, encoded_tuple_buffer%8#0 debug: Replacing {encoded_tuple_buffer%5#0, encoded_tuple_buffer%8#0} with encoded_tuple_buffer%2#0 made 2 modifications -debug: Replacing redundant declaration let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='tmp%0', version=0),) -debug: Replacing redundant declaration let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='tmp%0', version=0),) -debug: Found equivalence set: tmp%0#0, tmp%1#0, tmp%2#0 -debug: Replacing {tmp%1#0, tmp%2#0} with tmp%0#0 made 2 modifications +debug: Replacing redundant declaration let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='event%0', version=0),) +debug: Replacing redundant declaration let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='event%0', version=0),) +debug: Found equivalence set: event%0#0, event%1#0, event%2#0 +debug: Replacing {event%1#0, event%2#0} with event%0#0 made 2 modifications debug: Optimizer: Remove Calls To No Op Subroutines debug: Optimizing subroutine examples.arc_28.contract.EventEmitter.emit_ufixed debug: Optimizer: Constant Replacer @@ -706,20 +706,21 @@ debug: Inserted __puya_arc4_router_____algopy_default_create@7.ops[1]: 'l-store- debug: Replaced __puya_arc4_router_____algopy_default_create@7.ops[3]: 'v-load tmp%16#0' with 'l-load tmp%16#0' debug: Inserted __puya_arc4_router_____algopy_default_create@7.ops[5]: 'l-store-copy tmp%17#0 0' debug: Replaced __puya_arc4_router_____algopy_default_create@7.ops[7]: 'v-load tmp%17#0' with 'l-load tmp%17#0' -debug: Inserted emit_swapped_block@0.ops[7]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[9]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted emit_swapped_block@0.ops[7]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[9]: 'v-load event%0#0' with 'l-load event%0#0' debug: Inserted emit_swapped_block@0.ops[3]: 'l-store-copy encoded_tuple_buffer%2#0 0' debug: Replaced emit_swapped_block@0.ops[6]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0' -debug: Inserted emit_swapped_block@0.ops[11]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0' -debug: Inserted emit_swapped_block@0.ops[14]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[16]: 'v-load tmp%0#0' with 'l-load tmp%0#0' -debug: Inserted emit_ufixed_block@0.ops[7]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_ufixed_block@0.ops[9]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted emit_swapped_block@0.ops[11]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[13]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Inserted emit_swapped_block@0.ops[14]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[16]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Inserted emit_ufixed_block@0.ops[7]: 'l-store-copy event%0#0 0' +debug: Replaced emit_ufixed_block@0.ops[9]: 'v-load event%0#0' with 'l-load event%0#0' debug: Inserted emit_ufixed_block@0.ops[3]: 'l-store-copy encoded_tuple_buffer%2#0 0' debug: Replaced emit_ufixed_block@0.ops[6]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0' debug: Found 3 edge set/s for examples.arc_28.contract.EventEmitter.__puya_arc4_router__ info: Writing arc_28/out/EventEmitter.arc32.json +info: Writing arc_28/out/EventEmitter.arc56.json info: Writing arc_28/out/EventEmitter.approval.teal info: Writing arc_28/out/EventEmitter.clear.teal info: Writing arc_28/out/EventEmitter.approval.bin diff --git a/examples/auction/out/Auction.approval.mir b/examples/auction/out/Auction.approval.mir index 9426d2a5e7..66ed5d16aa 100644 --- a/examples/auction/out/Auction.approval.mir +++ b/examples/auction/out/Auction.approval.mir @@ -83,9 +83,9 @@ __puya_arc4_router___opt_into_asset_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -102,9 +102,9 @@ __puya_arc4_router___start_auction_route@3: // @arc4.abimethod txn OnCompletion tmp%10#0 ! tmp%11#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%12#0 - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 tmp%14#0 @@ -133,9 +133,9 @@ __puya_arc4_router___opt_in_route@4: // @arc4.abimethod txn OnCompletion tmp%19#0 ! tmp%20#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%21#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -144,9 +144,9 @@ __puya_arc4_router___bid_route@5: // @arc4.abimethod txn OnCompletion tmp%23#0 ! tmp%24#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%25#0 - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txn GroupIndex tmp%27#0 @@ -169,9 +169,9 @@ __puya_arc4_router___claim_bids_route@6: // @arc4.abimethod txn OnCompletion tmp%28#0 ! tmp%29#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%30#0 - assert // is not creating + assert // can only call when not creating callsub claim_bids int 1 1 retsub 1 @@ -181,9 +181,9 @@ __puya_arc4_router___claim_asset_route@7: // @arc4.abimethod txn OnCompletion tmp%32#0 ! tmp%33#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%34#0 - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 tmp%36#0 @@ -205,7 +205,7 @@ __puya_arc4_router___bare_routing@10: __puya_arc4_router_____algopy_default_create@11: txn ApplicationID tmp%40#0 ! tmp%41#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/examples/auction/out/Auction.approval.teal b/examples/auction/out/Auction.approval.teal index e62e2862a0..20301c8c04 100644 --- a/examples/auction/out/Auction.approval.teal +++ b/examples/auction/out/Auction.approval.teal @@ -63,9 +63,9 @@ __puya_arc4_router___opt_into_asset_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -82,9 +82,9 @@ __puya_arc4_router___start_auction_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -110,9 +110,9 @@ __puya_arc4_router___opt_in_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub @@ -121,9 +121,9 @@ __puya_arc4_router___bid_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txn GroupIndex @@ -145,9 +145,9 @@ __puya_arc4_router___claim_bids_route@6: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub claim_bids intc_1 // 1 retsub @@ -157,9 +157,9 @@ __puya_arc4_router___claim_asset_route@7: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -178,7 +178,7 @@ __puya_arc4_router___bare_routing@10: bnz __puya_arc4_router___after_if_else@14 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/auction/out/Auction.arc32.json b/examples/auction/out/Auction.arc32.json index ff28182475..2ac484c7a8 100644 --- a/examples/auction/out/Auction.arc32.json +++ b/examples/auction/out/Auction.arc32.json @@ -32,7 +32,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc3RhcnRfYXVjdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbGFpbV9iaWRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLm9wdF9pbnRvX2Fzc2V0KGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm9wdF9pbnRvX2Fzc2V0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2ludG9fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyOS0zMAogICAgLy8gIyBWZXJpZnkgYSBBU0EgaGFzbid0IGFscmVhZHkgYmVlbiBvcHRlZCBpbnRvCiAgICAvLyBhc3NlcnQgc2VsZi5hc2EuaWQgPT0gMCwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzEtMzIKICAgIC8vICMgU2F2ZSBBU0EgSUQgaW4gZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLmFzYSA9IGFzc2V0CiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzgKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5zdGFydF9hdWN0aW9uKHN0YXJ0aW5nX3ByaWNlOiB1aW50NjQsIGxlbmd0aDogdWludDY0LCBheGZlcjogdWludDY0KSAtPiB2b2lkOgpzdGFydF9hdWN0aW9uOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MC00NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc3RhcnRfYXVjdGlvbigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHN0YXJ0aW5nX3ByaWNlOiBVSW50NjQsCiAgICAvLyAgICAgbGVuZ3RoOiBVSW50NjQsCiAgICAvLyAgICAgYXhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyAjIEVuc3VyZSB0aGUgYXVjdGlvbiBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKICAgIC8vIGFzc2VydCBzZWxmLmF1Y3Rpb25fZW5kID09IDAsICJhdWN0aW9uIGFscmVhZHkgc3RhcnRlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhdWN0aW9uIGFscmVhZHkgc3RhcnRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo1NAogICAgLy8gYXhmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTItNTUKICAgIC8vICMgVmVyaWZ5IGF4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwIgogICAgYXNzZXJ0IC8vIGF4ZmVyIG11c3QgdHJhbnNmZXIgdG8gdGhpcyBhcHAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTctNTgKICAgIC8vICMgU2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2FfYW1vdW50ID0gYXhmZXIuYXNzZXRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBieXRlY18zIC8vICJhc2FfYW1vdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTkKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGxlbmd0aAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHN0YXJ0aW5nX3ByaWNlCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYmlkKHBheTogdWludDY0KSAtPiB2b2lkOgpiaWQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY2LTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBiaWQoc2VsZiwgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBFbnN1cmUgYXVjdGlvbiBoYXNuJ3QgZW5kZWQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuYXVjdGlvbl9lbmQsICJhdWN0aW9uIGhhcyBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgIDwKICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBlbmRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3MS03MgogICAgLy8gIyBWZXJpZnkgcGF5bWVudCB0cmFuc2FjdGlvbgogICAgLy8gYXNzZXJ0IHBheS5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggdHJhbnNhY3Rpb24gc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTZW5kZXIKICAgIGR1cAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPiBzZWxmLnByZXZpb3VzX2JpZCwgIkJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZCBleGlzdHMKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gQmlkIG11c3QgYmUgaGlnaGVyIHRoYW4gcHJldmlvdXMgYmlkCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIHNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gcGF5LmFtb3VudAogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IHBheS5zZW5kZXIKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzktODAKICAgIC8vICMgVXBkYXRlIGNsYWltYWJsZSBhbW91bnQKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IHBheS5hbW91bnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xhaW1fYmlkcygpIC0+IHZvaWQ6CmNsYWltX2JpZHM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjgyLTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9iaWRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODQKICAgIC8vIGFtb3VudCA9IG9yaWdpbmFsX2Ftb3VudCA9IHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYWltYWJsZV9hbW91bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyAjIHN1YnRyYWN0IHByZXZpb3VzIGJpZCBpZiBzZW5kZXIgaXMgcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYucHJldmlvdXNfYmlkZGVyOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWRkZXIgZXhpc3RzCiAgICA9PQogICAgYnogY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODgKICAgIC8vIGFtb3VudCAtPSBzZWxmLnByZXZpb3VzX2JpZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MC05MwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBvcmlnaW5hbF9hbW91bnQgLSBhbW91bnQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2Fzc2V0KGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmNsYWltX2Fzc2V0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1Y3Rpb25fZW5kIGV4aXN0cwogICAgPgogICAgYXNzZXJ0IC8vIGF1Y3Rpb24gaGFzIG5vdCBlbmRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTA2CiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NldF9jbG9zZV90bz1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWRkZXIgZXhpc3RzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYV9hbW91bnQgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMC0xMDEKICAgIC8vICMgU2VuZCBBU0EgdG8gcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTA2CiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdGFydF9hdWN0aW9uX3JvdXRlQDM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJpZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYmlkc19yb3V0ZUA2OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1fYmlkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmlkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zNQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogdWludDY0LCBsZW5ndGg6IHVpbnQ2NCwgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAtNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogVUludDY0LAogICAgLy8gICAgIGF4ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0OS01MAogICAgLy8gIyBFbnN1cmUgdGhlIGF1Y3Rpb24gaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkCiAgICAvLyBhc3NlcnQgc2VsZi5hdWN0aW9uX2VuZCA9PSAwLCAiYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTQKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUyLTU1CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU3LTU4CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGgKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmJpZChwYXk6IHVpbnQ2NCkgLT4gdm9pZDoKYmlkOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYmlkKHNlbGYsIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgRW5zdXJlIGF1Y3Rpb24gaGFzbid0IGVuZGVkCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgZW5kZWQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzEtNzIKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBzZXQgZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHBheS5hbW91bnQKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wcmV2aW91c19iaWRkZXIgPSBwYXkuc2VuZGVyCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyAjIFVwZGF0ZSBjbGFpbWFibGUgYW1vdW50CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ni04NwogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwLTkzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIG5vdCBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NldF9yZWNlaXZlcj1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfYW1vdW50IGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTE2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/auction/out/Auction.arc56.json b/examples/auction/out/Auction.arc56.json new file mode 100644 index 0000000000..41a1ff759d --- /dev/null +++ b/examples/auction/out/Auction.arc56.json @@ -0,0 +1,360 @@ +{ + "name": "Auction", + "structs": {}, + "methods": [ + { + "name": "opt_into_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "start_auction", + "args": [ + { + "type": "uint64", + "name": "starting_price" + }, + { + "type": "uint64", + "name": "length" + }, + { + "type": "axfer", + "name": "axfer" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "opt_in", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "bid", + "args": [ + { + "type": "pay", + "name": "pay" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "claim_bids", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "claim_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 4, + "bytes": 1 + }, + "local": { + "ints": 1, + "bytes": 0 + } + }, + "keys": { + "global": { + "auction_end": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXVjdGlvbl9lbmQ=" + }, + "previous_bid": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJldmlvdXNfYmlk" + }, + "asa_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNhX2Ftb3VudA==" + }, + "asa": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNh" + }, + "previous_bidder": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cHJldmlvdXNfYmlkZGVy" + } + }, + "local": { + "claimable_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2xhaW0=", + "desc": "The claimable amount" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 299 + ], + "errorMessage": "ASA already opted in" + }, + { + "pc": [ + 396 + ], + "errorMessage": "Bid must be higher than previous bid" + }, + { + "pc": [ + 165, + 183, + 213, + 222, + 244, + 256 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 292 + ], + "errorMessage": "Only creator can opt in to ASA" + }, + { + "pc": [ + 336 + ], + "errorMessage": "auction already started" + }, + { + "pc": [ + 375 + ], + "errorMessage": "auction has ended" + }, + { + "pc": [ + 486 + ], + "errorMessage": "auction has not ended" + }, + { + "pc": [ + 330 + ], + "errorMessage": "auction must be started by creator" + }, + { + "pc": [ + 344 + ], + "errorMessage": "axfer must transfer to this app" + }, + { + "pc": [ + 279 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 168, + 186, + 216, + 225, + 247, + 259 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 297 + ], + "errorMessage": "check self.asa exists" + }, + { + "pc": [ + 499 + ], + "errorMessage": "check self.asa_amount exists" + }, + { + "pc": [ + 334, + 373, + 484 + ], + "errorMessage": "check self.auction_end exists" + }, + { + "pc": [ + 426 + ], + "errorMessage": "check self.claimable_amount exists for account" + }, + { + "pc": [ + 392, + 440 + ], + "errorMessage": "check self.previous_bid exists" + }, + { + "pc": [ + 432, + 491, + 495 + ], + "errorMessage": "check self.previous_bidder exists" + }, + { + "pc": [ + 384 + ], + "errorMessage": "payment sender must match transaction sender" + }, + { + "pc": [ + 204 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 235 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdGFydF9hdWN0aW9uX3JvdXRlQDM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJpZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYmlkc19yb3V0ZUA2OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1fYmlkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmlkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zNQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogdWludDY0LCBsZW5ndGg6IHVpbnQ2NCwgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAtNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogVUludDY0LAogICAgLy8gICAgIGF4ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0OS01MAogICAgLy8gIyBFbnN1cmUgdGhlIGF1Y3Rpb24gaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkCiAgICAvLyBhc3NlcnQgc2VsZi5hdWN0aW9uX2VuZCA9PSAwLCAiYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTQKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUyLTU1CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU3LTU4CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGgKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmJpZChwYXk6IHVpbnQ2NCkgLT4gdm9pZDoKYmlkOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYmlkKHNlbGYsIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgRW5zdXJlIGF1Y3Rpb24gaGFzbid0IGVuZGVkCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgZW5kZWQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzEtNzIKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBzZXQgZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHBheS5hbW91bnQKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wcmV2aW91c19iaWRkZXIgPSBwYXkuc2VuZGVyCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyAjIFVwZGF0ZSBjbGFpbWFibGUgYW1vdW50CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ni04NwogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwLTkzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIG5vdCBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NldF9yZWNlaXZlcj1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfYW1vdW50IGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTE2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEEJgYLYXVjdGlvbl9lbmQMcHJldmlvdXNfYmlkD3ByZXZpb3VzX2JpZGRlcgphc2FfYW1vdW50A2FzYQVjbGFpbTEYQAADiAAEiAAWQ4oAACgiZykiZysiZycEImcqMgNniYoAATEbQQCgggYEKCayAgTwqnAjBDDG1YoE23/oQwTmVGJbBB7BK+82GgCOBgACABQAMgA7AFEAXSKJMRkURDEYRDYaARfAMIgAaiOJMRkURDEYRDYaARc2GgIXMRYjCUk4ECQSRIgAciOJMRkURDEYRCOJMRkURDEYRDEWIwlJOBAjEkSIAH4jiTEZFEQxGESIAKIjiTEZFEQxGEQ2GgEXwDCIAM8jiTEZQAAGMRgURCOJIomKAQAxADIJEkQiJwRlRBREJwSL/2exMgqL/7IRshQkshAisgGziYoDADEAMgkSRCIoZUQURIv/OBQyChJEi/84EitMZzIHi/4IKExnKYv9Z4mKAQAyByIoZUQMRIv/OABJMQASRIv/OAgiKWVESwEMRClLAWcqTwJnMQAnBU8CZomKAAAxACInBWNMSU8CRDEAIiplRBJBAAoiKWVEiwBMCYwBsTEAsgeLAUmyCCOyECKyAbMxAIsATwIJJwVMZomKAQAyByIoZUQNRLEiKmVEIiplRCIrZUSyErIUshWL/7IRJLIQIrIBs4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir index fbc0ab2858..b387e33b2c 100644 --- a/examples/auction/out/Auction.destructured.ir +++ b/examples/auction/out/Auction.destructured.ir @@ -31,9 +31,9 @@ contract examples.auction.contract.Auction: block@2: // opt_into_asset_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.auction.contract.Auction: block@3: // start_auction_route_L40 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: bytes = (txna ApplicationArgs 1) let tmp%15#0: uint64 = (btoi tmp%14#0) let tmp%16#0: bytes = (txna ApplicationArgs 2) @@ -59,16 +59,16 @@ contract examples.auction.contract.Auction: block@4: // opt_in_route_L62 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u block@5: // bid_route_L66 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -79,17 +79,17 @@ contract examples.auction.contract.Auction: block@6: // claim_bids_route_L82 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating examples.auction.contract.Auction.claim_bids() return 1u block@7: // claim_asset_route_L97 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: bytes = (txna ApplicationArgs 1) let tmp%37#0: uint64 = (btoi tmp%36#0) let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0) @@ -101,7 +101,7 @@ contract examples.auction.contract.Auction: block@11: // __algopy_default_create_L1 let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (! tmp%40#0) - (assert tmp%41#0) // is creating + (assert tmp%41#0) // can only call when creating return 1u block@14: // after_if_else_L16 return 0u diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir index e8695f632c..591591e97d 100644 --- a/examples/auction/out/Auction.ssa.ir +++ b/examples/auction/out/Auction.ssa.ir @@ -32,10 +32,10 @@ contract examples.auction.contract.Auction: block@2: // opt_into_asset_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0) @@ -44,10 +44,10 @@ contract examples.auction.contract.Auction: block@3: // start_auction_route_L40 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: bytes = (txna ApplicationArgs 1) let tmp%15#0: uint64 = (btoi tmp%14#0) let tmp%16#0: bytes = (txna ApplicationArgs 2) @@ -62,19 +62,19 @@ contract examples.auction.contract.Auction: block@4: // opt_in_route_L62 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating examples.auction.contract.Auction.opt_in() return 1u block@5: // bid_route_L66 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -85,19 +85,19 @@ contract examples.auction.contract.Auction: block@6: // claim_bids_route_L82 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.auction.contract.Auction.claim_bids() return 1u block@7: // claim_asset_route_L97 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (== tmp%32#0 NoOp) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) let tmp%35#0: bool = (!= tmp%34#0 0u) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%36#0: bytes = (txna ApplicationArgs 1) let tmp%37#0: uint64 = (btoi tmp%36#0) let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0) @@ -113,7 +113,7 @@ contract examples.auction.contract.Auction: block@11: // __algopy_default_create_L1 let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (== tmp%40#0 0u) - (assert tmp%41#0) // is creating + (assert tmp%41#0) // can only call when creating examples.auction.contract.Auction.__algopy_default_create() return 1u block@12: // switch_case_default_L16 diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir index 90d31666f7..0a5fa81bd2 100644 --- a/examples/auction/out/Auction.ssa.opt_pass_1.ir +++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir @@ -31,9 +31,9 @@ contract examples.auction.contract.Auction: block@2: // opt_into_asset_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.auction.contract.Auction: block@3: // start_auction_route_L40 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: bytes = (txna ApplicationArgs 1) let tmp%15#0: uint64 = (btoi tmp%14#0) let tmp%16#0: bytes = (txna ApplicationArgs 2) @@ -59,16 +59,16 @@ contract examples.auction.contract.Auction: block@4: // opt_in_route_L62 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u block@5: // bid_route_L66 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -79,17 +79,17 @@ contract examples.auction.contract.Auction: block@6: // claim_bids_route_L82 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating examples.auction.contract.Auction.claim_bids() return 1u block@7: // claim_asset_route_L97 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: bytes = (txna ApplicationArgs 1) let tmp%37#0: uint64 = (btoi tmp%36#0) let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0) @@ -101,7 +101,7 @@ contract examples.auction.contract.Auction: block@11: // __algopy_default_create_L1 let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (! tmp%40#0) - (assert tmp%41#0) // is creating + (assert tmp%41#0) // can only call when creating return 1u block@14: // after_if_else_L16 return 0u diff --git a/examples/auction/out_O2/Auction.approval.teal b/examples/auction/out_O2/Auction.approval.teal index 6ba5f4b68a..eaf1718140 100644 --- a/examples/auction/out_O2/Auction.approval.teal +++ b/examples/auction/out_O2/Auction.approval.teal @@ -47,9 +47,9 @@ __puya_arc4_router__: __puya_arc4_router___opt_into_asset_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -60,9 +60,9 @@ __puya_arc4_router___opt_into_asset_route@2: __puya_arc4_router___start_auction_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -82,18 +82,18 @@ __puya_arc4_router___start_auction_route@3: __puya_arc4_router___opt_in_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub __puya_arc4_router___bid_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - @@ -109,9 +109,9 @@ __puya_arc4_router___bid_route@5: __puya_arc4_router___claim_bids_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub claim_bids intc_1 // 1 retsub @@ -119,9 +119,9 @@ __puya_arc4_router___claim_bids_route@6: __puya_arc4_router___claim_asset_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -134,7 +134,7 @@ __puya_arc4_router___bare_routing@10: bnz __puya_arc4_router___after_if_else@14 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir index fbc0ab2858..b387e33b2c 100644 --- a/examples/auction/out_O2/Auction.destructured.ir +++ b/examples/auction/out_O2/Auction.destructured.ir @@ -31,9 +31,9 @@ contract examples.auction.contract.Auction: block@2: // opt_into_asset_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0) @@ -42,9 +42,9 @@ contract examples.auction.contract.Auction: block@3: // start_auction_route_L40 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: bytes = (txna ApplicationArgs 1) let tmp%15#0: uint64 = (btoi tmp%14#0) let tmp%16#0: bytes = (txna ApplicationArgs 2) @@ -59,16 +59,16 @@ contract examples.auction.contract.Auction: block@4: // opt_in_route_L62 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u block@5: // bid_route_L66 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -79,17 +79,17 @@ contract examples.auction.contract.Auction: block@6: // claim_bids_route_L82 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating examples.auction.contract.Auction.claim_bids() return 1u block@7: // claim_asset_route_L97 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: bytes = (txna ApplicationArgs 1) let tmp%37#0: uint64 = (btoi tmp%36#0) let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0) @@ -101,7 +101,7 @@ contract examples.auction.contract.Auction: block@11: // __algopy_default_create_L1 let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (! tmp%40#0) - (assert tmp%41#0) // is creating + (assert tmp%41#0) // can only call when creating return 1u block@14: // after_if_else_L16 return 0u diff --git a/examples/auction/out_unoptimized/Auction.approval.teal b/examples/auction/out_unoptimized/Auction.approval.teal index 69e38d504b..3a9b1e4dad 100644 --- a/examples/auction/out_unoptimized/Auction.approval.teal +++ b/examples/auction/out_unoptimized/Auction.approval.teal @@ -72,11 +72,11 @@ __puya_arc4_router___opt_into_asset_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -94,11 +94,11 @@ __puya_arc4_router___start_auction_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -128,11 +128,11 @@ __puya_arc4_router___opt_in_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub opt_in intc_1 // 1 retsub @@ -143,11 +143,11 @@ __puya_arc4_router___bid_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txn GroupIndex @@ -170,11 +170,11 @@ __puya_arc4_router___claim_bids_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub claim_bids intc_1 // 1 retsub @@ -185,11 +185,11 @@ __puya_arc4_router___claim_asset_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // auction/contract.py:16 // class Auction(ARC4Contract): txna ApplicationArgs 1 @@ -217,7 +217,7 @@ __puya_arc4_router_____algopy_default_create@11: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir index 22ed8e5563..9efadc17a6 100644 --- a/examples/auction/out_unoptimized/Auction.destructured.ir +++ b/examples/auction/out_unoptimized/Auction.destructured.ir @@ -32,10 +32,10 @@ contract examples.auction.contract.Auction: block@2: // opt_into_asset_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0) @@ -44,10 +44,10 @@ contract examples.auction.contract.Auction: block@3: // start_auction_route_L40 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: bytes = (txna ApplicationArgs 1) let tmp%15#0: uint64 = (btoi tmp%14#0) let tmp%16#0: bytes = (txna ApplicationArgs 2) @@ -62,19 +62,19 @@ contract examples.auction.contract.Auction: block@4: // opt_in_route_L62 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating examples.auction.contract.Auction.opt_in() return 1u block@5: // bid_route_L66 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -85,19 +85,19 @@ contract examples.auction.contract.Auction: block@6: // claim_bids_route_L82 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.auction.contract.Auction.claim_bids() return 1u block@7: // claim_asset_route_L97 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (== tmp%32#0 NoOp) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) let tmp%35#0: bool = (!= tmp%34#0 0u) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%36#0: bytes = (txna ApplicationArgs 1) let tmp%37#0: uint64 = (btoi tmp%36#0) let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0) @@ -113,7 +113,7 @@ contract examples.auction.contract.Auction: block@11: // __algopy_default_create_L1 let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (== tmp%40#0 0u) - (assert tmp%41#0) // is creating + (assert tmp%41#0) // can only call when creating examples.auction.contract.Auction.__algopy_default_create() return 1u block@12: // switch_case_default_L16 diff --git a/examples/auction/puya.log b/examples/auction/puya.log index b047c30db9..3072366120 100644 --- a/examples/auction/puya.log +++ b/examples/auction/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['auction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['auction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing auction/out/module.awst debug: Sealing block@0: // L12 @@ -1171,6 +1171,7 @@ debug: Found 1 edge set/s for examples.auction.contract.Auction.claim_bids debug: examples.auction.contract.Auction.claim_bids f-stack entry: [] debug: examples.auction.contract.Auction.claim_bids f-stack on first store: ['original_amount#0', 'amount#1'] info: Writing auction/out/Auction.arc32.json +info: Writing auction/out/Auction.arc56.json info: Writing auction/out/Auction.approval.teal info: Writing auction/out/Auction.clear.teal info: Writing auction/out/Auction.approval.bin diff --git a/examples/box_storage/out/BoxContract.approval.mir b/examples/box_storage/out/BoxContract.approval.mir index 42960caf55..6cef8213ad 100644 --- a/examples/box_storage/out/BoxContract.approval.mir +++ b/examples/box_storage/out/BoxContract.approval.mir @@ -45,9 +45,9 @@ __puya_arc4_router___set_boxes_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -68,9 +68,9 @@ __puya_arc4_router___check_keys_route@3: // @arc4.abimethod txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -79,9 +79,9 @@ __puya_arc4_router___delete_boxes_route@4: // @arc4.abimethod txn OnCompletion tmp%15#0 ! tmp%16#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%17#0 - assert // is not creating + assert // can only call when not creating callsub delete_boxes int 1 1 retsub 1 @@ -91,9 +91,9 @@ __puya_arc4_router___read_boxes_route@5: // @arc4.abimethod txn OnCompletion tmp%19#0 ! tmp%20#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%21#0 - assert // is not creating + assert // can only call when not creating callsub read_boxes elements_to_encode%0#0,elements_to_encode%1#0,elements_to_encode%2#0 l-load elements_to_encode%0#0 2 elements_to_encode%1#0,elements_to_encode%2#0,elements_to_encode%0#0 itob elements_to_encode%1#0,elements_to_encode%2#0,val_as_bytes%0#0 @@ -132,9 +132,9 @@ __puya_arc4_router___boxes_exist_route@6: // @arc4.abimethod txn OnCompletion tmp%24#0 ! tmp%25#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%26#0 - assert // is not creating + assert // can only call when not creating callsub boxes_exist elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0 byte 0x00 elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0,0x00 int 0 elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0,0x00,0 @@ -174,9 +174,9 @@ __puya_arc4_router___slice_box_route@7: // @arc4.abimethod txn OnCompletion tmp%29#0 ! tmp%30#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%31#0 - assert // is not creating + assert // can only call when not creating callsub slice_box int 1 1 retsub 1 @@ -186,9 +186,9 @@ __puya_arc4_router___arc4_box_route@8: // @arc4.abimethod txn OnCompletion tmp%33#0 ! tmp%34#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%35#0 - assert // is not creating + assert // can only call when not creating callsub arc4_box int 1 1 retsub 1 @@ -198,9 +198,9 @@ __puya_arc4_router___test_box_ref_route@9: // @arc4.abimethod txn OnCompletion tmp%37#0 ! tmp%38#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%39#0 - assert // is not creating + assert // can only call when not creating callsub test_box_ref int 1 1 retsub 1 @@ -210,9 +210,9 @@ __puya_arc4_router___box_map_test_route@10: // @arc4.abimethod txn OnCompletion tmp%41#0 ! tmp%42#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%43#0 - assert // is not creating + assert // can only call when not creating callsub box_map_test int 1 1 retsub 1 @@ -222,9 +222,9 @@ __puya_arc4_router___box_map_set_route@11: // @arc4.abimethod txn OnCompletion tmp%45#0 ! tmp%46#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%47#0 - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%49#0 @@ -244,9 +244,9 @@ __puya_arc4_router___box_map_get_route@12: // @arc4.abimethod txn OnCompletion tmp%53#0 ! tmp%54#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%55#0 - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%57#0 @@ -272,9 +272,9 @@ __puya_arc4_router___box_map_del_route@13: // @arc4.abimethod txn OnCompletion tmp%60#0 ! tmp%61#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%62#0 - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%64#0 @@ -290,9 +290,9 @@ __puya_arc4_router___box_map_exists_route@14: // @arc4.abimethod txn OnCompletion tmp%66#0 ! tmp%67#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%68#0 - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%70#0 @@ -321,7 +321,7 @@ __puya_arc4_router___bare_routing@17: __puya_arc4_router_____algopy_default_create@18: txn ApplicationID tmp%74#0 ! tmp%75#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/examples/box_storage/out/BoxContract.approval.teal b/examples/box_storage/out/BoxContract.approval.teal index 2e7d419bf5..4da7c1077c 100644 --- a/examples/box_storage/out/BoxContract.approval.teal +++ b/examples/box_storage/out/BoxContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___set_boxes_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -45,9 +45,9 @@ __puya_arc4_router___check_keys_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -56,9 +56,9 @@ __puya_arc4_router___delete_boxes_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub delete_boxes intc_0 // 1 retsub @@ -68,9 +68,9 @@ __puya_arc4_router___read_boxes_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub read_boxes uncover 2 itob @@ -106,9 +106,9 @@ __puya_arc4_router___boxes_exist_route@6: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub boxes_exist bytec 5 // 0x00 intc_1 // 0 @@ -147,9 +147,9 @@ __puya_arc4_router___slice_box_route@7: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub slice_box intc_0 // 1 retsub @@ -159,9 +159,9 @@ __puya_arc4_router___arc4_box_route@8: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub arc4_box intc_0 // 1 retsub @@ -171,9 +171,9 @@ __puya_arc4_router___test_box_ref_route@9: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_box_ref intc_0 // 1 retsub @@ -183,9 +183,9 @@ __puya_arc4_router___box_map_test_route@10: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub box_map_test intc_0 // 1 retsub @@ -195,9 +195,9 @@ __puya_arc4_router___box_map_set_route@11: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -215,9 +215,9 @@ __puya_arc4_router___box_map_get_route@12: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -243,9 +243,9 @@ __puya_arc4_router___box_map_del_route@13: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -261,9 +261,9 @@ __puya_arc4_router___box_map_exists_route@14: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -289,7 +289,7 @@ __puya_arc4_router___bare_routing@17: bnz __puya_arc4_router___after_if_else@21 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/box_storage/out/BoxContract.arc32.json b/examples/box_storage/out/BoxContract.arc32.json index 2d76cd02f8..e7c69b0684 100644 --- a/examples/box_storage/out/BoxContract.arc32.json +++ b/examples/box_storage/out/BoxContract.arc32.json @@ -67,7 +67,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jaGVja19rZXlzX3JvdXRlQDM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfYm94ZXNfcm91dGVANDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHJlYWRfYm94ZXMKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDBjCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hlc19leGlzdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMiAvLyAyCiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzRfYm94CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2JveF9yZWZfcm91dGVAOToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9ib3hfcmVmCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX3Rlc3Rfcm91dGVAMTA6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9nZXRfcm91dGVAMTI6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9nZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2RlbF9yb3V0ZUAxMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9leGlzdHMKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTc6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYm94ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NoZWNrX2tleXNfcm91dGVAMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX2JveGVzX3JvdXRlQDQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcmVhZF9ib3hlcwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMGMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveGVzX2V4aXN0X3JvdXRlQDY6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYm94ZXNfZXhpc3QKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgc3dhcAogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zbGljZV9ib3hfcm91dGVANzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNF9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYm94X3JlZl9yb3V0ZUA5OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYm94X3JlZgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2dldF9yb3V0ZUAxMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfZ2V0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9kZWxfcm91dGVAMTM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2V4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/box_storage/out/BoxContract.arc56.json b/examples/box_storage/out/BoxContract.arc56.json new file mode 100644 index 0000000000..d2ed0d114f --- /dev/null +++ b/examples/box_storage/out/BoxContract.arc56.json @@ -0,0 +1,475 @@ +{ + "name": "BoxContract", + "structs": {}, + "methods": [ + { + "name": "set_boxes", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "string", + "name": "c" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "check_keys", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete_boxes", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "read_boxes", + "args": [], + "returns": { + "type": "(uint64,byte[],string)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "boxes_exist", + "args": [], + "returns": { + "type": "(bool,bool,bool)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "slice_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "arc4_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_box_ref", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_test", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_set", + "args": [ + { + "type": "uint64", + "name": "key" + }, + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_get", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_del", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_exists", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": { + "box_a": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Ym94X2E=" + }, + "box_b": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "Yg==" + }, + "box_c": { + "keyType": "AVMBytes", + "valueType": "string", + "key": "Qk9YX0M=" + }, + "box_d": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X2Q=" + }, + "box_ref": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X3JlZg==" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "box_map": { + "keyType": "AVMUint64", + "valueType": "AVMString", + "prefix": "" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 1246 + ], + "errorMessage": "Blob exists" + }, + { + "pc": [ + 187, + 209, + 218, + 230, + 281, + 331, + 343, + 355, + 367, + 379, + 401, + 430, + 446 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 478 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 190, + 212, + 221, + 233, + 284, + 334, + 346, + 358, + 370, + 382, + 404, + 433, + 449 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 930, + 1093, + 1104, + 1116, + 1128 + ], + "errorMessage": "check Box exists" + }, + { + "pc": [ + 1376 + ], + "errorMessage": "check BoxMap entry exists" + }, + { + "pc": [ + 1249, + 1285 + ], + "errorMessage": "check BoxRef exists" + }, + { + "pc": [ + 540, + 550 + ], + "errorMessage": "check self.box_a exists" + }, + { + "pc": [ + 523, + 527, + 558, + 913 + ], + "errorMessage": "check self.box_b exists" + }, + { + "pc": [ + 566, + 919 + ], + "errorMessage": "check self.box_c exists" + }, + { + "pc": [ + 577 + ], + "errorMessage": "check self.box_d exists" + }, + { + "pc": [ + 1307, + 1314, + 1398 + ], + "errorMessage": "check self.box_map entry exists" + }, + { + "pc": [ + 534 + ], + "errorMessage": "direct reference should match copy" + }, + { + "pc": [ + 1174, + 1273 + ], + "errorMessage": "has data" + }, + { + "pc": [ + 1146, + 1152, + 1158, + 1164 + ], + "errorMessage": "no data" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYm94ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NoZWNrX2tleXNfcm91dGVAMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX2JveGVzX3JvdXRlQDQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcmVhZF9ib3hlcwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMGMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveGVzX2V4aXN0X3JvdXRlQDY6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYm94ZXNfZXhpc3QKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgc3dhcAogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zbGljZV9ib3hfcm91dGVANzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNF9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYm94X3JlZl9yb3V0ZUA5OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYm94X3JlZgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2dldF9yb3V0ZUAxMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfZ2V0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9kZWxfcm91dGVAMTM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2V4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAQACBSYNBUJPWF9DBGJsb2IFYm94X2QFYm94X2EBYgEAAWQEFR98dQEwBWhlbGxvBAACNDIHYm94X3JlZgdkZWZhdWx0iAABQ4oAATEbQQGCgg0EfTcpbgQzMl09BNVmxjIE+9qboATlo+1SBATvSXEEI+yzLATu91gWBLUykToEwp8WaQSciIwJBOb2hQYEjuLDZDYaAI4NAAIAGAAhAC0AYACSAJ4AqgC2AMIA2AD1AQUjiTEZFEQxGEQ2GgEXNhoCNhoDiAEXIokxGRREMRhEIokxGRREMRhEiAJjIokxGRREMRhEiAKYTwIWSwIVFlcGAk8DUEyAAgAMUEsBFYEMCBZXBgJQTFBMUCcHTFCwIokxGRREMRhEiAKGJwUjTwRUJwUjTwRUJwUjTwRUTCNTTwIiTwJUTCNTJExUJwdMULAiiTEZFEQxGESIAmUiiTEZFEQxGESIAtgiiTEZFEQxGESIAwgiiTEZFEQxGESIA5EiiTEZFEQxGEQ2GgEXNhoCVwIAiAPWIokxGRREMRhENhoBF4gD00kVFlcGAkxQJwdMULAiiTEZFEQxGEQ2GgEXiAO/IokxGRREMRhENhoBF4gDuCcFI08CVCcHTFCwIokxGUAABjEYFEQiiSOJigMAi/0WK0y/JwS8SCcEi/6/KLxIKIv/v4v+VwIAKrxIKksBvycEvkQnBL5EI1lMI1kSRCu+TBdMRIEDCBYrTL8rvUSBCBJEJwS9RIv+FRJEKL1Ei/8VTEsBEkQqvURLAhVMSwESRCgjIrqL/1cAARJEKL1IIgkoTCK6SwIiCUkiCIv/TgJSEkQovUgiSwEMSwEiTwJNCSgjTwK6IksDDyJLBE8CTUsDTAmL/yNPAlISRCi9SCRLAQwkTE0oI08CuiRLAw8kTwRPAk2L/yNPAlISRCojIrpLAlcAARJEKr1IIgkqTCK6SwEiCUkiCEsETgJSEkQqvUgiSwEMSwEiTwJNCSojTwK6IksCDyJLA08CTUsCTAlLAyNPAlISRCq9SCVLAQwlTE0qI08CuiVLAg8lSwNPAk1LAyNPAlISRCq9SCRLAQwkTE0qI08CuiRLAg8kTwNPAk1PAiNPAlISRImKAAArvEgnBLxIKLxIK75MF4EqTE8CTYEqEkQnBL4nCk4CTVcCAIACNDISRCi+JwpOAk0nChJEK75MF0wURBREiYoAAyuIAA0iCScEvkRXAgAovkSJigEBi/++TBdMRCIIiYoAAyu9RQEnBL1FASi9RQGJigAAJwi8SCcIgBNUZXN0aW5nIHRlc3RpbmcgMTIzvycIvUhJI0sCTYEHSwIMTwKBB08CTUsBCScITgK6gAdUZXN0aW5nEkQovEgogAcABUhlbGxvvyi9SCRLAQxLASRPAk2BCksCDE8CgQpPAk1LAQkoTgK6gAVIZWxsbxJEiYoAACcGgAQAAQIDvycGvkRXAAEnBahEJwa+RFcBAYABAahEJwa+RFcCAYABAqhEJwa+RFcDAYABA6hEiYoAACm9RQEURCm9RQEURCm9RQEURCm9RQEURCmBILlEKb1FAUQxADIKKSNLA7spgcA+0ykjSUsD0imBQCcJuykjgUW6SwFLA1AnCVASRCm8RCm+FESAABJEKb5LA04CTUsCEkRQKUy/Kb1FAUQpvUSBQBJEKYgAFYFAEkQnC4EguUgnC71FAUQnC7xIiYoBAYv/vUSJigAAIxZJvEhJgAZIbW1tbW2/Sb1EgQYSREm9RIEGEkQiFkm+JwxOAk0nDBJESb5FARRETL1FAURJvEhJJwm/gAAjiAAHJwkSRLxIiYoCAYv/IggWi/5MUL5EiYoCAIv+Fkm8SIv/v4mKAQGL/xa+RImKAQCL/xa8SImKAQGL/xa9RQGJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/box_storage/out/BoxContract.destructured.ir b/examples/box_storage/out/BoxContract.destructured.ir index fc48967125..9020472452 100644 --- a/examples/box_storage/out/BoxContract.destructured.ir +++ b/examples/box_storage/out/BoxContract.destructured.ir @@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out/BoxContract.ssa.ir b/examples/box_storage/out/BoxContract.ssa.ir index 3663cf9b35..3160737f17 100644 --- a/examples/box_storage/out/BoxContract.ssa.ir +++ b/examples/box_storage/out/BoxContract.ssa.ir @@ -26,10 +26,10 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -39,28 +39,28 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating examples.box_storage.contract.BoxContract.check_keys() return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -88,10 +88,10 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (== tmp%24#0 NoOp) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) let tmp%27#0: bool = (!= tmp%26#0 0u) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -109,46 +109,46 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (== tmp%29#0 NoOp) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) let tmp%32#0: bool = (!= tmp%31#0 0u) - (assert tmp%32#0) // is not creating + (assert tmp%32#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (== tmp%41#0 NoOp) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) let tmp%44#0: bool = (!= tmp%43#0 0u) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (== tmp%45#0 NoOp) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) let tmp%48#0: bool = (!= tmp%47#0 0u) - (assert tmp%48#0) // is not creating + (assert tmp%48#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -158,10 +158,10 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (== tmp%53#0 NoOp) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) let tmp%56#0: bool = (!= tmp%55#0 0u) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -175,10 +175,10 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (== tmp%60#0 NoOp) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) let tmp%63#0: bool = (!= tmp%62#0 0u) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -186,10 +186,10 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -207,7 +207,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (== tmp%74#0 0u) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating examples.box_storage.contract.BoxContract.__algopy_default_create() return 1u block@19: // switch_case_default_L8 diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir index 724953a488..53fb490666 100644 --- a/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir +++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir @@ -20,9 +20,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -32,25 +32,25 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating examples.box_storage.contract.BoxContract.check_keys() return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -74,9 +74,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -92,41 +92,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -136,9 +136,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -162,9 +162,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -178,7 +178,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir index 65497ece24..5bfe8bbceb 100644 --- a/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir +++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir @@ -18,9 +18,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,25 +30,25 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating examples.box_storage.contract.BoxContract.check_keys() return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -69,9 +69,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -86,41 +86,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -130,9 +130,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -146,9 +146,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -156,9 +156,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -172,7 +172,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir index bf671e0db4..8e9588244a 100644 --- a/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir +++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir index baddc6d5a2..521718d01b 100644 --- a/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir +++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir index fc48967125..9020472452 100644 --- a/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir +++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir @@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out_O2/BoxContract.approval.teal b/examples/box_storage/out_O2/BoxContract.approval.teal index b99ca97b68..98c8a9a16b 100644 --- a/examples/box_storage/out_O2/BoxContract.approval.teal +++ b/examples/box_storage/out_O2/BoxContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___set_boxes_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -35,18 +35,18 @@ __puya_arc4_router___set_boxes_route@2: __puya_arc4_router___check_keys_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub __puya_arc4_router___delete_boxes_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub delete_boxes intc_0 // 1 retsub @@ -54,9 +54,9 @@ __puya_arc4_router___delete_boxes_route@4: __puya_arc4_router___read_boxes_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub read_boxes uncover 2 itob @@ -90,9 +90,9 @@ __puya_arc4_router___read_boxes_route@5: __puya_arc4_router___boxes_exist_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub boxes_exist bytec 5 // 0x00 intc_1 // 0 @@ -129,9 +129,9 @@ __puya_arc4_router___boxes_exist_route@6: __puya_arc4_router___slice_box_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub slice_box intc_0 // 1 retsub @@ -139,9 +139,9 @@ __puya_arc4_router___slice_box_route@7: __puya_arc4_router___arc4_box_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub arc4_box intc_0 // 1 retsub @@ -149,9 +149,9 @@ __puya_arc4_router___arc4_box_route@8: __puya_arc4_router___test_box_ref_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_box_ref intc_0 // 1 retsub @@ -159,9 +159,9 @@ __puya_arc4_router___test_box_ref_route@9: __puya_arc4_router___box_map_test_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub box_map_test intc_0 // 1 retsub @@ -169,9 +169,9 @@ __puya_arc4_router___box_map_test_route@10: __puya_arc4_router___box_map_set_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -183,9 +183,9 @@ __puya_arc4_router___box_map_set_route@11: __puya_arc4_router___box_map_get_route@12: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi callsub box_map_get @@ -205,9 +205,9 @@ __puya_arc4_router___box_map_get_route@12: __puya_arc4_router___box_map_del_route@13: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi callsub box_map_del @@ -217,9 +217,9 @@ __puya_arc4_router___box_map_del_route@13: __puya_arc4_router___box_map_exists_route@14: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi callsub box_map_exists @@ -239,7 +239,7 @@ __puya_arc4_router___bare_routing@17: bnz __puya_arc4_router___after_if_else@21 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/box_storage/out_O2/BoxContract.destructured.ir b/examples/box_storage/out_O2/BoxContract.destructured.ir index fc48967125..9020472452 100644 --- a/examples/box_storage/out_O2/BoxContract.destructured.ir +++ b/examples/box_storage/out_O2/BoxContract.destructured.ir @@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (! tmp%74#0) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating return 1u block@21: // after_if_else_L8 return 0u diff --git a/examples/box_storage/out_unoptimized/BoxContract.approval.teal b/examples/box_storage/out_unoptimized/BoxContract.approval.teal index 7a3959adf3..095da0b933 100644 --- a/examples/box_storage/out_unoptimized/BoxContract.approval.teal +++ b/examples/box_storage/out_unoptimized/BoxContract.approval.teal @@ -53,11 +53,11 @@ __puya_arc4_router___set_boxes_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -79,11 +79,11 @@ __puya_arc4_router___check_keys_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub check_keys intc_1 // 1 retsub @@ -94,11 +94,11 @@ __puya_arc4_router___delete_boxes_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete_boxes intc_1 // 1 retsub @@ -109,11 +109,11 @@ __puya_arc4_router___read_boxes_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub read_boxes cover 2 swap @@ -157,11 +157,11 @@ __puya_arc4_router___boxes_exist_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub boxes_exist cover 2 swap @@ -209,11 +209,11 @@ __puya_arc4_router___slice_box_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub slice_box intc_1 // 1 retsub @@ -224,11 +224,11 @@ __puya_arc4_router___arc4_box_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub arc4_box intc_1 // 1 retsub @@ -239,11 +239,11 @@ __puya_arc4_router___test_box_ref_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_box_ref intc_1 // 1 retsub @@ -254,11 +254,11 @@ __puya_arc4_router___box_map_test_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub box_map_test intc_1 // 1 retsub @@ -269,11 +269,11 @@ __puya_arc4_router___box_map_set_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -292,11 +292,11 @@ __puya_arc4_router___box_map_get_route@12: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -323,11 +323,11 @@ __puya_arc4_router___box_map_del_route@13: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -344,11 +344,11 @@ __puya_arc4_router___box_map_exists_route@14: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // box_storage/contract.py:8 // class BoxContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -383,7 +383,7 @@ __puya_arc4_router_____algopy_default_create@18: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/box_storage/out_unoptimized/BoxContract.destructured.ir b/examples/box_storage/out_unoptimized/BoxContract.destructured.ir index 594aec4b7f..261d2d3099 100644 --- a/examples/box_storage/out_unoptimized/BoxContract.destructured.ir +++ b/examples/box_storage/out_unoptimized/BoxContract.destructured.ir @@ -26,10 +26,10 @@ contract examples.box_storage.contract.BoxContract: block@2: // set_boxes_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -39,28 +39,28 @@ contract examples.box_storage.contract.BoxContract: block@3: // check_keys_route_L48 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating examples.box_storage.contract.BoxContract.check_keys() return 1u block@4: // delete_boxes_route_L54 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating examples.box_storage.contract.BoxContract.delete_boxes() return 1u block@5: // read_boxes_route_L66 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes() let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0) let length%0#0: uint64 = (len elements_to_encode%1#0) @@ -84,10 +84,10 @@ contract examples.box_storage.contract.BoxContract: block@6: // boxes_exist_route_L70 let tmp%24#0: uint64 = (txn OnCompletion) let tmp%25#0: bool = (== tmp%24#0 NoOp) - (assert tmp%25#0) // OnCompletion is NoOp + (assert tmp%25#0) // OnCompletion is not NoOp let tmp%26#0: uint64 = (txn ApplicationID) let tmp%27#0: bool = (!= tmp%26#0 0u) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist() let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0) let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0) @@ -103,46 +103,46 @@ contract examples.box_storage.contract.BoxContract: block@7: // slice_box_route_L74 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (== tmp%29#0 NoOp) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) let tmp%32#0: bool = (!= tmp%31#0 0u) - (assert tmp%32#0) // is not creating + (assert tmp%32#0) // can only call when not creating examples.box_storage.contract.BoxContract.slice_box() return 1u block@8: // arc4_box_route_L83 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating examples.box_storage.contract.BoxContract.arc4_box() return 1u block@9: // test_box_ref_route_L93 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating examples.box_storage.contract.BoxContract.test_box_ref() return 1u block@10: // box_map_test_route_L141 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (== tmp%41#0 NoOp) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) let tmp%44#0: bool = (!= tmp%43#0 0u) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating examples.box_storage.contract.BoxContract.box_map_test() return 1u block@11: // box_map_set_route_L162 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (== tmp%45#0 NoOp) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) let tmp%48#0: bool = (!= tmp%47#0 0u) - (assert tmp%48#0) // is not creating + (assert tmp%48#0) // can only call when not creating let tmp%49#0: bytes = (txna ApplicationArgs 1) let tmp%50#0: uint64 = (btoi tmp%49#0) let tmp%51#0: bytes = (txna ApplicationArgs 2) @@ -152,10 +152,10 @@ contract examples.box_storage.contract.BoxContract: block@12: // box_map_get_route_L166 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (== tmp%53#0 NoOp) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) let tmp%56#0: bool = (!= tmp%55#0 0u) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0) @@ -169,10 +169,10 @@ contract examples.box_storage.contract.BoxContract: block@13: // box_map_del_route_L170 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (== tmp%60#0 NoOp) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) let tmp%63#0: bool = (!= tmp%62#0 0u) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%64#0: bytes = (txna ApplicationArgs 1) let tmp%65#0: uint64 = (btoi tmp%64#0) examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0) @@ -180,10 +180,10 @@ contract examples.box_storage.contract.BoxContract: block@14: // box_map_exists_route_L174 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0) @@ -201,7 +201,7 @@ contract examples.box_storage.contract.BoxContract: block@18: // __algopy_default_create_L1 let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (== tmp%74#0 0u) - (assert tmp%75#0) // is creating + (assert tmp%75#0) // can only call when creating examples.box_storage.contract.BoxContract.__algopy_default_create() return 1u block@19: // switch_case_default_L8 diff --git a/examples/box_storage/puya.log b/examples/box_storage/puya.log index fe20507477..5ab445610d 100644 --- a/examples/box_storage/puya.log +++ b/examples/box_storage/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['box_storage'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['box_storage'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv box_storage/contract.py:137:9 warning: expression result is ignored box_storage/contract.py:139:9 warning: expression result is ignored @@ -3016,6 +3016,7 @@ debug: Inserted box_map_exists_block@0.ops[6]: 'l-store-copy maybe_exists%0#0 1' debug: Replaced box_map_exists_block@0.ops[9]: 'v-load maybe_exists%0#0' with 'l-load maybe_exists%0#0' debug: Found 3 edge set/s for examples.box_storage.contract.BoxContract.__puya_arc4_router__ info: Writing box_storage/out/BoxContract.arc32.json +info: Writing box_storage/out/BoxContract.arc56.json info: Writing box_storage/out/BoxContract.approval.teal info: Writing box_storage/out/BoxContract.clear.teal info: Writing box_storage/out/BoxContract.approval.bin diff --git a/examples/calculator/puya.log b/examples/calculator/puya.log index 5ffc94d805..5d73287b54 100644 --- a/examples/calculator/puya.log +++ b/examples/calculator/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['calculator'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['calculator'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing calculator/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/global_state/puya.log b/examples/global_state/puya.log index 3b1b785fcb..6776bdcb90 100644 --- a/examples/global_state/puya.log +++ b/examples/global_state/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['global_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['global_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing global_state/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/hello_world/puya.log b/examples/hello_world/puya.log index 7c180b7731..95e846f3b2 100644 --- a/examples/hello_world/puya.log +++ b/examples/hello_world/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing hello_world/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/hello_world_arc4/out/HelloWorldContract.approval.mir b/examples/hello_world_arc4/out/HelloWorldContract.approval.mir index 62fa77b311..ba2c8a93b4 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.approval.mir +++ b/examples/hello_world_arc4/out/HelloWorldContract.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___hello_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // hello_world_arc4/contract.py:9 // class HelloWorldContract(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -66,7 +66,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%11#0 ! tmp%12#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/examples/hello_world_arc4/out/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out/HelloWorldContract.approval.teal index e8b5466cb7..5bcab5519d 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.approval.teal +++ b/examples/hello_world_arc4/out/HelloWorldContract.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___hello_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // hello_world_arc4/contract.py:9 // class HelloWorldContract(ARC4Contract): txna ApplicationArgs 1 @@ -54,7 +54,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/hello_world_arc4/out/HelloWorldContract.arc32.json b/examples/hello_world_arc4/out/HelloWorldContract.arc32.json index 4044021872..966adc7ba2 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.arc32.json +++ b/examples/hello_world_arc4/out/HelloWorldContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsbwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGhlbGxvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/hello_world_arc4/out/HelloWorldContract.arc56.json b/examples/hello_world_arc4/out/HelloWorldContract.arc56.json new file mode 100644 index 0000000000..d4b3c07a88 --- /dev/null +++ b/examples/hello_world_arc4/out/HelloWorldContract.arc56.json @@ -0,0 +1,107 @@ +{ + "name": "HelloWorldContract", + "structs": {}, + "methods": [ + { + "name": "hello", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 75 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGhlbGxvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAAGIAAFDigABMRtBADKABAK+zhE2GgCOAQACIokxGRREMRhENhoBVwIAiAAgSRUWVwYCTFCABBUffHVMULAjiTEZQAAGMRgURCOJIomKAQGAB0hlbGxvLCCL/1CJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir index f2fea01a83..63cc073c78 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir +++ b/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir @@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@2: // hello_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0) @@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir b/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir index 033f7f3f2e..74084d8c9a 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir +++ b/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir @@ -16,10 +16,10 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@2: // hello_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0) @@ -40,7 +40,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating examples.hello_world_arc4.contract.HelloWorldContract.__algopy_default_create() return 1u block@7: // switch_case_default_L9 diff --git a/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir b/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir index f2fea01a83..63cc073c78 100644 --- a/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir +++ b/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@2: // hello_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0) @@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal index 45cce1c8b4..006d7de069 100644 --- a/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal +++ b/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___hello_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub hello @@ -44,7 +44,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir index f2fea01a83..63cc073c78 100644 --- a/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir +++ b/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir @@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@2: // hello_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0) @@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal index c59d2896df..ddb27fcf9f 100644 --- a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal +++ b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal @@ -27,11 +27,11 @@ __puya_arc4_router___hello_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // hello_world_arc4/contract.py:9 // class HelloWorldContract(ARC4Contract): txna ApplicationArgs 1 @@ -68,7 +68,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir index 033f7f3f2e..74084d8c9a 100644 --- a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir +++ b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir @@ -16,10 +16,10 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@2: // hello_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0) @@ -40,7 +40,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating examples.hello_world_arc4.contract.HelloWorldContract.__algopy_default_create() return 1u block@7: // switch_case_default_L9 diff --git a/examples/hello_world_arc4/puya.log b/examples/hello_world_arc4/puya.log index 1d778d7d32..db708443bc 100644 --- a/examples/hello_world_arc4/puya.log +++ b/examples/hello_world_arc4/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world_arc4'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world_arc4'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing hello_world_arc4/out/module.awst debug: Sealing block@0: // L12 @@ -586,6 +586,7 @@ debug: Inserted hello_block@0.ops[3]: 'l-store-copy tmp%0#0 0' debug: Replaced hello_block@0.ops[5]: 'v-load tmp%0#0' with 'l-load tmp%0#0' debug: Found 3 edge set/s for examples.hello_world_arc4.contract.HelloWorldContract.__puya_arc4_router__ info: Writing hello_world_arc4/out/HelloWorldContract.arc32.json +info: Writing hello_world_arc4/out/HelloWorldContract.arc56.json info: Writing hello_world_arc4/out/HelloWorldContract.approval.teal info: Writing hello_world_arc4/out/HelloWorldContract.clear.teal info: Writing hello_world_arc4/out/HelloWorldContract.approval.bin diff --git a/examples/local_state/puya.log b/examples/local_state/puya.log index c1e40a7a55..338e2023a2 100644 --- a/examples/local_state/puya.log +++ b/examples/local_state/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['local_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['local_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing local_state/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/merkle/out/MerkleTree.approval.mir b/examples/merkle/out/MerkleTree.approval.mir index 413d03897e..6a8de05a99 100644 --- a/examples/merkle/out/MerkleTree.approval.mir +++ b/examples/merkle/out/MerkleTree.approval.mir @@ -34,10 +34,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -52,9 +52,9 @@ __puya_arc4_router___verify_route@3: // @arc4.abimethod txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%12#0 diff --git a/examples/merkle/out/MerkleTree.approval.teal b/examples/merkle/out/MerkleTree.approval.teal index 346e511416..d715c32e04 100644 --- a/examples/merkle/out/MerkleTree.approval.teal +++ b/examples/merkle/out/MerkleTree.approval.teal @@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -43,9 +43,9 @@ __puya_arc4_router___verify_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/examples/merkle/out/MerkleTree.arc32.json b/examples/merkle/out/MerkleTree.arc32.json index 3c6dfa9d92..40a12cdd88 100644 --- a/examples/merkle/out/MerkleTree.arc32.json +++ b/examples/merkle/out/MerkleTree.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3JvdXRlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jcmVhdGUocm9vdDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIHJvb3Q6IEJ5dGVzMzIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMgogICAgLy8gc2VsZi5yb290ID0gcm9vdC5ieXRlcwogICAgYnl0ZWNfMCAvLyAicm9vdCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLnZlcmlmeShwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNC0xNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMzMikgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE2CiAgICAvLyByZXR1cm4gc2VsZi5yb290ID09IGNvbXB1dGVfcm9vdF9oYXNoKHByb29mLCBsZWFmLmJ5dGVzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucm9vdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvbXB1dGVfcm9vdF9oYXNoCiAgICBmcmFtZV9idXJ5IC0yCiAgICA9PQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0LmNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBieXRlcywgbGVhZjogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKY29tcHV0ZV9yb290X2hhc2g6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY29tcHV0ZV9yb290X2hhc2gocHJvb2Y6IFByb29mLCBsZWFmOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCgpjb21wdXRlX3Jvb3RfaGFzaF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGNvbXB1dGVfcm9vdF9oYXNoX2FmdGVyX2ZvckA0CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjMKICAgIC8vIGNvbXB1dGVkID0gaGFzaF9wYWlyKGNvbXB1dGVkLCBwcm9vZltpZHhdLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgaGFzaF9wYWlyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxCgpjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANDoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyNAogICAgLy8gcmV0dXJuIGNvbXB1dGVkCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lmhhc2hfcGFpcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoX3BhaXI6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjctMjgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaGFzaF9wYWlyKGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPAogICAgYnogaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYiBoYXNoX3BhaXJfdGVybmFyeV9tZXJnZUAzCgpoYXNoX3BhaXJfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KGEgKyBiIGlmIEJpZ1VJbnQuZnJvbV9ieXRlcyhhKSA8IEJpZ1VJbnQuZnJvbV9ieXRlcyhiKSBlbHNlIGIgKyBhKQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAoKaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIHNoYTI1NgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZlcmlmeQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgTWVya2xlVHJlZShhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lk1lcmtsZVRyZWUuY3JlYXRlKHJvb3Q6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmLCByb290OiBCeXRlczMyKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTIKICAgIC8vIHNlbGYucm9vdCA9IHJvb3QuYnl0ZXMKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS52ZXJpZnkocHJvb2Y6IGJ5dGVzLCBsZWFmOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnk6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQtMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHZlcmlmeShzZWxmLCBwcm9vZjogUHJvb2YsIGxlYWY6IEJ5dGVzMzIpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIHNlbGYucm9vdCA9PSBjb21wdXRlX3Jvb3RfaGFzaChwcm9vZiwgbGVhZi5ieXRlcykKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyb290IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJvb3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb21wdXRlX3Jvb3RfaGFzaAogICAgZnJhbWVfYnVyeSAtMgogICAgPT0KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5jb21wdXRlX3Jvb3RfaGFzaChwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmNvbXB1dGVfcm9vdF9oYXNoOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQoKY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShwcm9vZi5sZW5ndGgpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANAogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBjb21wdXRlZCA9IGhhc2hfcGFpcihjb21wdXRlZCwgcHJvb2ZbaWR4XS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBjYWxsc3ViIGhhc2hfcGFpcgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNvbXB1dGVfcm9vdF9oYXNoX2Zvcl9oZWFkZXJAMQoKY29tcHV0ZV9yb290X2hhc2hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjQKICAgIC8vIHJldHVybiBjb21wdXRlZAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5oYXNoX3BhaXIoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKaGFzaF9wYWlyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGhhc2hfcGFpcihhOiBCeXRlcywgYjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIGJ6IGhhc2hfcGFpcl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGIgaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMwoKaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKCmhhc2hfcGFpcl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBzaGEyNTYKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/merkle/out/MerkleTree.arc56.json b/examples/merkle/out/MerkleTree.arc56.json new file mode 100644 index 0000000000..ac98e02f4c --- /dev/null +++ b/examples/merkle/out/MerkleTree.arc56.json @@ -0,0 +1,143 @@ +{ + "name": "MerkleTree", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "byte[32]", + "name": "root" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify", + "args": [ + { + "type": "byte[32][]", + "name": "proof" + }, + { + "type": "byte[32]", + "name": "leaf" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "root": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cm9vdA==" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 67 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 55 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 70 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 114 + ], + "errorMessage": "check self.root exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZlcmlmeQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgTWVya2xlVHJlZShhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lk1lcmtsZVRyZWUuY3JlYXRlKHJvb3Q6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmLCByb290OiBCeXRlczMyKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTIKICAgIC8vIHNlbGYucm9vdCA9IHJvb3QuYnl0ZXMKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS52ZXJpZnkocHJvb2Y6IGJ5dGVzLCBsZWFmOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnk6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQtMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHZlcmlmeShzZWxmLCBwcm9vZjogUHJvb2YsIGxlYWY6IEJ5dGVzMzIpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIHNlbGYucm9vdCA9PSBjb21wdXRlX3Jvb3RfaGFzaChwcm9vZiwgbGVhZi5ieXRlcykKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyb290IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJvb3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb21wdXRlX3Jvb3RfaGFzaAogICAgZnJhbWVfYnVyeSAtMgogICAgPT0KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5jb21wdXRlX3Jvb3RfaGFzaChwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmNvbXB1dGVfcm9vdF9oYXNoOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQoKY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShwcm9vZi5sZW5ndGgpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANAogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBjb21wdXRlZCA9IGhhc2hfcGFpcihjb21wdXRlZCwgcHJvb2ZbaWR4XS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBjYWxsc3ViIGhhc2hfcGFpcgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNvbXB1dGVfcm9vdF9oYXNoX2Zvcl9oZWFkZXJAMQoKY29tcHV0ZV9yb290X2hhc2hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjQKICAgIC8vIHJldHVybiBjb21wdXRlZAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5oYXNoX3BhaXIoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKaGFzaF9wYWlyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGhhc2hfcGFpcihhOiBCeXRlcywgYjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIGJ6IGhhc2hfcGFpcl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGIgaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMwoKaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKCmhhc2hfcGFpcl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBzaGEyNTYKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEgJgEEcm9vdIgAAUOKAAExG0EASYICBIQkIDsEwCkK1TYaAI4CAAIAEiKJMRkURDEYFEQ2GgGIACYjiTEZFEQxGEQ2GgE2GgKIAByAAQAiTwJUgAQVH3x1TFCwI4kiiYoBACiL/2eJigIBIihlRIv+i/+IAASM/hKJigICi/4iWSKL/4sBiwAMQQAdi/5XAgCLAUlOAiQLJFiLAkyIABKMAiMIjAFC/9uLAov+jAGMAImKAgGL/ov/pEEACIv+i/9QQgAFi/+L/lABiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/merkle/out/MerkleTree.destructured.ir b/examples/merkle/out/MerkleTree.destructured.ir index da2243e555..d0306eadf4 100644 --- a/examples/merkle/out/MerkleTree.destructured.ir +++ b/examples/merkle/out/MerkleTree.destructured.ir @@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree: block@2: // create_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.merkle.contract.MerkleTree.create(tmp%7#0) return 1u block@3: // verify_route_L14 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0) diff --git a/examples/merkle/out/MerkleTree.ssa.ir b/examples/merkle/out/MerkleTree.ssa.ir index fbbad61d1e..e92b3e84f7 100644 --- a/examples/merkle/out/MerkleTree.ssa.ir +++ b/examples/merkle/out/MerkleTree.ssa.ir @@ -16,20 +16,20 @@ contract examples.merkle.contract.MerkleTree: block@2: // create_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.merkle.contract.MerkleTree.create(tmp%7#0) return 1u block@3: // verify_route_L14 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0) diff --git a/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir b/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir index cee6b41a69..10e5af4c57 100644 --- a/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir +++ b/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir @@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree: block@2: // create_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.merkle.contract.MerkleTree.create(tmp%7#0) return 1u block@3: // verify_route_L14 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0) diff --git a/examples/merkle/out_O2/MerkleTree.approval.teal b/examples/merkle/out_O2/MerkleTree.approval.teal index 6312f7abdd..9876c35926 100644 --- a/examples/merkle/out_O2/MerkleTree.approval.teal +++ b/examples/merkle/out_O2/MerkleTree.approval.teal @@ -21,10 +21,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating txna ApplicationArgs 1 callsub create intc_1 // 1 @@ -33,9 +33,9 @@ __puya_arc4_router___create_route@2: __puya_arc4_router___verify_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 callsub verify diff --git a/examples/merkle/out_O2/MerkleTree.destructured.ir b/examples/merkle/out_O2/MerkleTree.destructured.ir index da2243e555..d0306eadf4 100644 --- a/examples/merkle/out_O2/MerkleTree.destructured.ir +++ b/examples/merkle/out_O2/MerkleTree.destructured.ir @@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree: block@2: // create_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.merkle.contract.MerkleTree.create(tmp%7#0) return 1u block@3: // verify_route_L14 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0) diff --git a/examples/merkle/out_unoptimized/MerkleTree.approval.teal b/examples/merkle/out_unoptimized/MerkleTree.approval.teal index 539a3dc009..45e7238a58 100644 --- a/examples/merkle/out_unoptimized/MerkleTree.approval.teal +++ b/examples/merkle/out_unoptimized/MerkleTree.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -49,11 +49,11 @@ __puya_arc4_router___verify_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // merkle/contract.py:9 // class MerkleTree(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/examples/merkle/out_unoptimized/MerkleTree.destructured.ir b/examples/merkle/out_unoptimized/MerkleTree.destructured.ir index 10c2f53428..4631ecfc08 100644 --- a/examples/merkle/out_unoptimized/MerkleTree.destructured.ir +++ b/examples/merkle/out_unoptimized/MerkleTree.destructured.ir @@ -16,20 +16,20 @@ contract examples.merkle.contract.MerkleTree: block@2: // create_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.merkle.contract.MerkleTree.create(tmp%7#0) return 1u block@3: // verify_route_L14 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0) diff --git a/examples/merkle/puya.log b/examples/merkle/puya.log index b2436746ce..060e09c6ae 100644 --- a/examples/merkle/puya.log +++ b/examples/merkle/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['merkle'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['merkle'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing merkle/out/module.awst debug: Sealing block@0: // L12 @@ -751,6 +751,7 @@ debug: shared x-stack for hash_pair_ternary_false@2 -> hash_pair_ternary_merge@3 debug: examples.merkle.contract.compute_root_hash f-stack entry: [] debug: examples.merkle.contract.compute_root_hash f-stack on first store: ['tmp%0#0', 'idx#0', 'computed#1'] info: Writing merkle/out/MerkleTree.arc32.json +info: Writing merkle/out/MerkleTree.arc56.json info: Writing merkle/out/MerkleTree.approval.teal info: Writing merkle/out/MerkleTree.clear.teal info: Writing merkle/out/MerkleTree.approval.bin diff --git a/examples/sizes.txt b/examples/sizes.txt index a0ceeac4a6..02dc48118f 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -22,6 +22,7 @@ arc4_types/Arc4TuplesType 954 173 - | 657 77 - arc4_types/MutableParams2 334 202 - | 193 97 - arc_28/EventEmitter 186 133 - | 100 64 - + arc_56 678 465 - | 355 190 - asset/Reference 268 261 - | 144 141 - auction/Auction 592 522 - | 328 281 - augmented_assignment/Augmented 151 156 - | 77 78 - @@ -133,4 +134,4 @@ unssa/UnSSA 432 368 - | 241 204 - voting/VotingRoundApp 1590 1483 - | 733 649 - with_reentrancy/WithReentrancy 255 242 - | 132 122 - - Total 70619 54284 54225 | 33750 22171 22127 \ No newline at end of file + Total 71297 54749 54690 | 34105 22361 22317 \ No newline at end of file diff --git a/examples/struct_in_box/out/ExampleContract.approval.mir b/examples/struct_in_box/out/ExampleContract.approval.mir index b4397f848e..1e9dc933c4 100644 --- a/examples/struct_in_box/out/ExampleContract.approval.mir +++ b/examples/struct_in_box/out/ExampleContract.approval.mir @@ -35,9 +35,9 @@ __puya_arc4_router___add_user_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -52,9 +52,9 @@ __puya_arc4_router___attach_asset_to_user_route@3: // @arc4.abimethod() txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 tmp%12#0 @@ -74,9 +74,9 @@ __puya_arc4_router___get_user_route@4: // @arc4.abimethod() txn OnCompletion tmp%16#0 ! tmp%17#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%18#0 - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 tmp%20#0 @@ -100,7 +100,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router_____algopy_default_create@8: txn ApplicationID tmp%24#0 ! tmp%25#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/examples/struct_in_box/out/ExampleContract.approval.teal b/examples/struct_in_box/out/ExampleContract.approval.teal index 98a53adbd3..37a55b2278 100644 --- a/examples/struct_in_box/out/ExampleContract.approval.teal +++ b/examples/struct_in_box/out/ExampleContract.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___add_user_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -41,9 +41,9 @@ __puya_arc4_router___attach_asset_to_user_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -61,9 +61,9 @@ __puya_arc4_router___get_user_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -84,7 +84,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/struct_in_box/out/ExampleContract.arc32.json b/examples/struct_in_box/out/ExampleContract.arc32.json index 6f2e34573c..2cb76bad67 100644 --- a/examples/struct_in_box/out/ExampleContract.arc32.json +++ b/examples/struct_in_box/out/ExampleContract.arc32.json @@ -55,7 +55,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfdXNlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYXR0YWNoX2Fzc2V0X3RvX3VzZXJfcm91dGVAMzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXR0YWNoX2Fzc2V0X3RvX3VzZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQ6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hZGRfdXNlcih1c2VyOiBieXRlcykgLT4gdm9pZDoKYWRkX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF91c2VyKHNlbGYsIHVzZXI6IFVzZXJTdHJ1Y3QpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5ib3hfZXhpc3RzKHVzZXIuaWQpLCAiVXNlciB3aXRoIGlkIG11c3Qgbm90IGV4aXN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgYm94X2V4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIGZyYW1lX2J1cnkgLTEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmJveF9leGlzdHModXNlcl9pZDogYnl0ZXMpIC0+IHVpbnQ2NDoKYm94X2V4aXN0czoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjYtMjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYm94X2V4aXN0cyhzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOAogICAgLy8gX2RhdGEsIGV4aXN0cyA9IG9wLkJveC5nZXQodXNlcl9pZC5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC53cml0ZV90b19ib3godXNlcjogYnl0ZXMpIC0+IGJ5dGVzOgp3cml0ZV90b19ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHdyaXRlX3RvX2JveChzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIwCiAgICAvLyBib3hfa2V5ID0gdXNlci5pZC5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjEtMjIKICAgIC8vICMgRGVsZXRlIGV4aXN0aW5nIGRhdGEsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcmVzaXppbmcgdGhlIGJveAogICAgLy8gb3AuQm94LmRlbGV0ZShib3hfa2V5KQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjQKICAgIC8vIG9wLkJveC5wdXQoYm94X2tleSwgdXNlci5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hdHRhY2hfYXNzZXRfdG9fdXNlcih1c2VyX2lkOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYXR0YWNoX2Fzc2V0X3RvX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGF0dGFjaF9hc3NldF90b191c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0LCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzgKICAgIC8vIHVzZXIgPSBzZWxmLnJlYWRfZnJvbV9ib3godXNlcl9pZCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiByZWFkX2Zyb21fYm94CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM5CiAgICAvLyB1c2VyLmFzc2V0ID0gYXJjNC5VSW50NjQoYXNzZXQuaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLndyaXRlX3RvX2JveCh1c2VyKQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QucmVhZF9mcm9tX2JveCh1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CnJlYWRfZnJvbV9ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEyLTEzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlYWRfZnJvbV9ib3goc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IFVzZXJTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTQKICAgIC8vIGJveF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBleGlzdHMsICJVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdCIKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIFVzZXJTdHJ1Y3QuZnJvbV9ieXRlcyhib3hfZGF0YSkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmdldF91c2VyKHVzZXJfaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF91c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXR1cm4gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF91c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGF0dGFjaF9hc3NldF90b191c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfdXNlcl9yb3V0ZUA0OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYWRkX3VzZXIodXNlcjogYnl0ZXMpIC0+IHZvaWQ6CmFkZF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfdXNlcihzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYm94X2V4aXN0cyh1c2VyLmlkKSwgIlVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjYWxsc3ViIGJveF9leGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggaWQgbXVzdCBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzQKICAgIC8vIHNlbGYud3JpdGVfdG9fYm94KHVzZXIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBmcmFtZV9idXJ5IC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5ib3hfZXhpc3RzKHVzZXJfaWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmJveF9leGlzdHM6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJveF9leGlzdHMoc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjgKICAgIC8vIF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGJ1cnkgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3Qud3JpdGVfdG9fYm94KHVzZXI6IGJ5dGVzKSAtPiBieXRlczoKd3JpdGVfdG9fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxOC0xOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB3cml0ZV90b19ib3goc2VsZiwgdXNlcjogVXNlclN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyMAogICAgLy8gYm94X2tleSA9IHVzZXIuaWQuYnl0ZXMKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIERlbGV0ZSBleGlzdGluZyBkYXRhLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlc2l6aW5nIHRoZSBib3gKICAgIC8vIG9wLkJveC5kZWxldGUoYm94X2tleSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBvcC5Cb3gucHV0KGJveF9rZXksIHVzZXIuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYXR0YWNoX2Fzc2V0X3RvX3VzZXIodXNlcl9pZDogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmF0dGFjaF9hc3NldF90b191c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNi0zNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhdHRhY2hfYXNzZXRfdG9fdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM4CiAgICAvLyB1c2VyID0gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozOQogICAgLy8gdXNlci5hc3NldCA9IGFyYzQuVUludDY0KGFzc2V0LmlkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LnJlYWRfZnJvbV9ib3godXNlcl9pZDogYnl0ZXMpIC0+IGJ5dGVzOgpyZWFkX2Zyb21fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZWFkX2Zyb21fYm94KHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBib3hfZGF0YSwgZXhpc3RzID0gb3AuQm94LmdldCh1c2VyX2lkLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QiCiAgICBhc3NlcnQgLy8gVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTYKICAgIC8vIHJldHVybiBVc2VyU3RydWN0LmZyb21fYnl0ZXMoYm94X2RhdGEpCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5nZXRfdXNlcih1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gVXNlclN0cnVjdDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0NAogICAgLy8gcmV0dXJuIHNlbGYucmVhZF9mcm9tX2JveCh1c2VyX2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlYWRfZnJvbV9ib3gKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/struct_in_box/out/ExampleContract.arc56.json b/examples/struct_in_box/out/ExampleContract.arc56.json new file mode 100644 index 0000000000..977e89f1a5 --- /dev/null +++ b/examples/struct_in_box/out/ExampleContract.arc56.json @@ -0,0 +1,186 @@ +{ + "name": "ExampleContract", + "structs": { + "UserStruct": [ + { + "name": "name", + "type": "string" + }, + { + "name": "id", + "type": "uint64" + }, + { + "name": "asset", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "add_user", + "args": [ + { + "type": "(string,uint64,uint64)", + "struct": "UserStruct", + "name": "user" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "attach_asset_to_user", + "args": [ + { + "type": "uint64", + "name": "user_id" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_user", + "args": [ + { + "type": "uint64", + "name": "user_id" + } + ], + "returns": { + "type": "(string,uint64,uint64)", + "struct": "UserStruct" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 65, + 86 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 132 + ], + "errorMessage": "User with id must not exist" + }, + { + "pc": [ + 191 + ], + "errorMessage": "User with that id does not exist" + }, + { + "pc": [ + 115 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 53, + 68, + 89 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF91c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGF0dGFjaF9hc3NldF90b191c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfdXNlcl9yb3V0ZUA0OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYWRkX3VzZXIodXNlcjogYnl0ZXMpIC0+IHZvaWQ6CmFkZF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfdXNlcihzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYm94X2V4aXN0cyh1c2VyLmlkKSwgIlVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjYWxsc3ViIGJveF9leGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggaWQgbXVzdCBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzQKICAgIC8vIHNlbGYud3JpdGVfdG9fYm94KHVzZXIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBmcmFtZV9idXJ5IC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5ib3hfZXhpc3RzKHVzZXJfaWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmJveF9leGlzdHM6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJveF9leGlzdHMoc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjgKICAgIC8vIF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGJ1cnkgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3Qud3JpdGVfdG9fYm94KHVzZXI6IGJ5dGVzKSAtPiBieXRlczoKd3JpdGVfdG9fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxOC0xOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB3cml0ZV90b19ib3goc2VsZiwgdXNlcjogVXNlclN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyMAogICAgLy8gYm94X2tleSA9IHVzZXIuaWQuYnl0ZXMKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIERlbGV0ZSBleGlzdGluZyBkYXRhLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlc2l6aW5nIHRoZSBib3gKICAgIC8vIG9wLkJveC5kZWxldGUoYm94X2tleSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBvcC5Cb3gucHV0KGJveF9rZXksIHVzZXIuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYXR0YWNoX2Fzc2V0X3RvX3VzZXIodXNlcl9pZDogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmF0dGFjaF9hc3NldF90b191c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNi0zNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhdHRhY2hfYXNzZXRfdG9fdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM4CiAgICAvLyB1c2VyID0gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozOQogICAgLy8gdXNlci5hc3NldCA9IGFyYzQuVUludDY0KGFzc2V0LmlkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LnJlYWRfZnJvbV9ib3godXNlcl9pZDogYnl0ZXMpIC0+IGJ5dGVzOgpyZWFkX2Zyb21fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZWFkX2Zyb21fYm94KHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBib3hfZGF0YSwgZXhpc3RzID0gb3AuQm94LmdldCh1c2VyX2lkLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QiCiAgICBhc3NlcnQgLy8gVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTYKICAgIC8vIHJldHVybiBVc2VyU3RydWN0LmZyb21fYnl0ZXMoYm94X2RhdGEpCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5nZXRfdXNlcih1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gVXNlclN0cnVjdDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0NAogICAgLy8gcmV0dXJuIHNlbGYucmVhZF9mcm9tX2JveCh1c2VyX2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlYWRfZnJvbV9ib3gKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBAFqCAwTahTS9BE606fEEFlRYgDYaAI4DAAIAEQAmI4kxGRREMRhENhoBiAA8IokxGRREMRhENhoBNhoCF8AwiABWIokxGRREMRhENhoBiABhgAQVH3x1TFCwIokxGUAABjEYFEQiiSOJigEAi/9XAgiIAAoURIv/iAAMjP+JigEBi/++RQGJigEBi/9XAghJvEiL/7+L/4mKAgCL/ogACov/FlwKiP/fSImKAQGL/75EiYoBAYv/iP/wiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/struct_in_box/out/ExampleContract.destructured.ir b/examples/struct_in_box/out/ExampleContract.destructured.ir index 9a9d7c9ab6..6dfbb2f9ad 100644 --- a/examples/struct_in_box/out/ExampleContract.destructured.ir +++ b/examples/struct_in_box/out/ExampleContract.destructured.ir @@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract: block@2: // add_user_route_L31 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0) return 1u block@3: // attach_asset_to_user_route_L36 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let tmp%14#0: uint64 = (btoi tmp%13#0) @@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract: block@4: // get_user_route_L42 let tmp%16#0: uint64 = (txn OnCompletion) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp + (assert tmp%17#0) // OnCompletion is not NoOp let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating let tmp%20#0: bytes = (txna ApplicationArgs 1) let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0) let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) @@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract: block@8: // __algopy_default_create_L1 let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // is creating + (assert tmp%25#0) // can only call when creating return 1u block@11: // after_if_else_L10 return 0u diff --git a/examples/struct_in_box/out/ExampleContract.ssa.ir b/examples/struct_in_box/out/ExampleContract.ssa.ir index 9f54dac2b5..8e67e11546 100644 --- a/examples/struct_in_box/out/ExampleContract.ssa.ir +++ b/examples/struct_in_box/out/ExampleContract.ssa.ir @@ -16,20 +16,20 @@ contract examples.struct_in_box.contract.ExampleContract: block@2: // add_user_route_L31 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0) return 1u block@3: // attach_asset_to_user_route_L36 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let tmp%14#0: uint64 = (btoi tmp%13#0) @@ -39,10 +39,10 @@ contract examples.struct_in_box.contract.ExampleContract: block@4: // get_user_route_L42 let tmp%16#0: uint64 = (txn OnCompletion) let tmp%17#0: bool = (== tmp%16#0 NoOp) - (assert tmp%17#0) // OnCompletion is NoOp + (assert tmp%17#0) // OnCompletion is not NoOp let tmp%18#0: uint64 = (txn ApplicationID) let tmp%19#0: bool = (!= tmp%18#0 0u) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%20#0: bytes = (txna ApplicationArgs 1) let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0) let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) @@ -58,7 +58,7 @@ contract examples.struct_in_box.contract.ExampleContract: block@8: // __algopy_default_create_L1 let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (== tmp%24#0 0u) - (assert tmp%25#0) // is creating + (assert tmp%25#0) // can only call when creating examples.struct_in_box.contract.ExampleContract.__algopy_default_create() return 1u block@9: // switch_case_default_L10 diff --git a/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir b/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir index d8c91094b8..9d5f64c604 100644 --- a/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir +++ b/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir @@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract: block@2: // add_user_route_L31 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0) return 1u block@3: // attach_asset_to_user_route_L36 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let tmp%14#0: uint64 = (btoi tmp%13#0) @@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract: block@4: // get_user_route_L42 let tmp%16#0: uint64 = (txn OnCompletion) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp + (assert tmp%17#0) // OnCompletion is not NoOp let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating let tmp%20#0: bytes = (txna ApplicationArgs 1) let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0) let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) @@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract: block@8: // __algopy_default_create_L1 let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // is creating + (assert tmp%25#0) // can only call when creating return 1u block@11: // after_if_else_L10 return 0u diff --git a/examples/struct_in_box/out_O2/ExampleContract.approval.teal b/examples/struct_in_box/out_O2/ExampleContract.approval.teal index 5e3bec670d..3bab8fa517 100644 --- a/examples/struct_in_box/out_O2/ExampleContract.approval.teal +++ b/examples/struct_in_box/out_O2/ExampleContract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___add_user_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub add_user intc_0 // 1 @@ -31,9 +31,9 @@ __puya_arc4_router___add_user_route@2: __puya_arc4_router___attach_asset_to_user_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 btoi @@ -45,9 +45,9 @@ __puya_arc4_router___attach_asset_to_user_route@3: __puya_arc4_router___get_user_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub get_user pushbytes 0x151f7c75 @@ -62,7 +62,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/examples/struct_in_box/out_O2/ExampleContract.destructured.ir b/examples/struct_in_box/out_O2/ExampleContract.destructured.ir index 9a9d7c9ab6..6dfbb2f9ad 100644 --- a/examples/struct_in_box/out_O2/ExampleContract.destructured.ir +++ b/examples/struct_in_box/out_O2/ExampleContract.destructured.ir @@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract: block@2: // add_user_route_L31 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0) return 1u block@3: // attach_asset_to_user_route_L36 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let tmp%14#0: uint64 = (btoi tmp%13#0) @@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract: block@4: // get_user_route_L42 let tmp%16#0: uint64 = (txn OnCompletion) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp + (assert tmp%17#0) // OnCompletion is not NoOp let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating let tmp%20#0: bytes = (txna ApplicationArgs 1) let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0) let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) @@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract: block@8: // __algopy_default_create_L1 let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (! tmp%24#0) - (assert tmp%25#0) // is creating + (assert tmp%25#0) // can only call when creating return 1u block@11: // after_if_else_L10 return 0u diff --git a/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal b/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal index 8d6cf0a54f..97951268eb 100644 --- a/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal +++ b/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___add_user_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -49,11 +49,11 @@ __puya_arc4_router___attach_asset_to_user_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -72,11 +72,11 @@ __puya_arc4_router___get_user_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // struct_in_box/contract.py:10 // class ExampleContract(ARC4Contract): txna ApplicationArgs 1 @@ -106,7 +106,7 @@ __puya_arc4_router_____algopy_default_create@8: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir b/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir index c688ca022e..af460e84f3 100644 --- a/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir +++ b/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir @@ -16,20 +16,20 @@ contract examples.struct_in_box.contract.ExampleContract: block@2: // add_user_route_L31 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0) return 1u block@3: // attach_asset_to_user_route_L36 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) let tmp%14#0: uint64 = (btoi tmp%13#0) @@ -39,10 +39,10 @@ contract examples.struct_in_box.contract.ExampleContract: block@4: // get_user_route_L42 let tmp%16#0: uint64 = (txn OnCompletion) let tmp%17#0: bool = (== tmp%16#0 NoOp) - (assert tmp%17#0) // OnCompletion is NoOp + (assert tmp%17#0) // OnCompletion is not NoOp let tmp%18#0: uint64 = (txn ApplicationID) let tmp%19#0: bool = (!= tmp%18#0 0u) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%20#0: bytes = (txna ApplicationArgs 1) let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0) let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) @@ -58,7 +58,7 @@ contract examples.struct_in_box.contract.ExampleContract: block@8: // __algopy_default_create_L1 let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (== tmp%24#0 0u) - (assert tmp%25#0) // is creating + (assert tmp%25#0) // can only call when creating examples.struct_in_box.contract.ExampleContract.__algopy_default_create() return 1u block@9: // switch_case_default_L10 diff --git a/examples/struct_in_box/puya.log b/examples/struct_in_box/puya.log index d0943c6207..eaa0ad30da 100644 --- a/examples/struct_in_box/puya.log +++ b/examples/struct_in_box/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['struct_in_box'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['struct_in_box'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv struct_in_box/contract.py:22:9 warning: expression result is ignored info: writing struct_in_box/out/module.awst @@ -820,6 +820,7 @@ debug: Inserted get_user_block@0.ops[2]: 'l-store-copy tmp%0#0 0' debug: Replaced get_user_block@0.ops[4]: 'v-load tmp%0#0' with 'l-load tmp%0#0' debug: Found 3 edge set/s for examples.struct_in_box.contract.ExampleContract.__puya_arc4_router__ info: Writing struct_in_box/out/ExampleContract.arc32.json +info: Writing struct_in_box/out/ExampleContract.arc56.json info: Writing struct_in_box/out/ExampleContract.approval.teal info: Writing struct_in_box/out/ExampleContract.clear.teal info: Writing struct_in_box/out/ExampleContract.approval.bin diff --git a/examples/tictactoe/out/TicTacToeContract.approval.mir b/examples/tictactoe/out/TicTacToeContract.approval.mir index 029d248ca2..0d681a7f73 100644 --- a/examples/tictactoe/out/TicTacToeContract.approval.mir +++ b/examples/tictactoe/out/TicTacToeContract.approval.mir @@ -36,7 +36,7 @@ __puya_arc4_router___new_game_route@2: // @arc4.abimethod(create="allow") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%5#0 @@ -59,9 +59,9 @@ __puya_arc4_router___join_game_route@3: // @arc4.abimethod txn OnCompletion tmp%6#0 ! tmp%7#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%8#0 - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%10#0 @@ -84,9 +84,9 @@ __puya_arc4_router___whose_turn_route@4: // @arc4.abimethod txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating callsub whose_turn tmp%15#0 byte 0x151f7c75 tmp%15#0,0x151f7c75 l-load tmp%15#0 1 0x151f7c75,tmp%15#0 @@ -100,9 +100,9 @@ __puya_arc4_router___play_route@5: // @arc4.abimethod txn OnCompletion tmp%17#0 ! tmp%18#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%19#0 - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%21#0 diff --git a/examples/tictactoe/out/TicTacToeContract.approval.teal b/examples/tictactoe/out/TicTacToeContract.approval.teal index 4314fba860..2adeb568ab 100644 --- a/examples/tictactoe/out/TicTacToeContract.approval.teal +++ b/examples/tictactoe/out/TicTacToeContract.approval.teal @@ -25,7 +25,7 @@ __puya_arc4_router___new_game_route@2: // @arc4.abimethod(create="allow") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -46,9 +46,9 @@ __puya_arc4_router___join_game_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -69,9 +69,9 @@ __puya_arc4_router___whose_turn_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub whose_turn pushbytes 0x151f7c75 swap @@ -85,9 +85,9 @@ __puya_arc4_router___play_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/examples/tictactoe/out/TicTacToeContract.arc32.json b/examples/tictactoe/out/TicTacToeContract.arc32.json index 5ec783ea7e..4ada161df8 100644 --- a/examples/tictactoe/out/TicTacToeContract.arc32.json +++ b/examples/tictactoe/out/TicTacToeContract.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICBjYWxsc3ViIG5ld19nYW1lCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHdob3NlX3R1cm4KICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGxheQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubmV3X2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpuZXdfZ2FtZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAtMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIC8vIGRlZiBuZXdfZ2FtZShzZWxmLCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjIKICAgIC8vIGlmIFR4bi5hcHBsaWNhdGlvbl9pZDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBuZXdfZ2FtZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjMtMjUKICAgIC8vICMgaWYgYSBjaGFsbGVuZ2VyIGhhcyBqb2luZWQsIGRvbid0IGFsbG93IHN0YXJ0aW5nIGEgbmV3IGdhbWUKICAgIC8vICMgdW50aWwgdGhpcyBvbmUgaXMgY29tcGxldGUKICAgIC8vIGlmIHNlbGYuY2hhbGxlbmdlcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjI2CiAgICAvLyBhc3NlcnQgc2VsZi53aW5uZXIsICJHYW1lIGlzbid0IG92ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEdhbWUgaXNuJ3Qgb3ZlcgoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNy0yOAogICAgLy8gIyByZXNldCBjaGFsbGVuZ2VyIGFuZCB3aW5uZXIKICAgIC8vIGRlbCBzZWxmLmNoYWxsZW5nZXIudmFsdWUKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyOQogICAgLy8gZGVsIHNlbGYud2lubmVyLnZhbHVlCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMAogICAgLy8gc2VsZi5ob3N0ID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMxCiAgICAvLyBzZWxmLmdhbWUgPSBHYW1lLmZyb21fYnl0ZXMob3AuYnplcm8oOSkpCiAgICBpbnRjXzMgLy8gOQogICAgYnplcm8KICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBuZXdfZ2FtZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCiAgICBiIG5ld19nYW1lX2Jvb2xfbWVyZ2VAOAoKbmV3X2dhbWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKCm5ld19nYW1lX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNAogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IGFyYzQuVUludDgoSE9TVCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICAqCiAgICBzd2FwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIHJlcGxhY2UzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAyCiAgICByZXBsYWNlMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM1CiAgICAvLyBzZWxmLnR1cm5zID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5qb2luX2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpqb2luX2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3LTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBqb2luX2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNoYWxsZW5nZXIsICJIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlciIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEhvc3QgYWxyZWFkeSBoYXMgYSBjaGFsbGVuZ2VyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQwCiAgICAvLyBzZWxmLmNoYWxsZW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDEKICAgIC8vIHNlbGYubWFrZV9tb3ZlKGFyYzQuVUludDgoQ0hBTExFTkdFUiksIG1vdmUpCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG1ha2VfbW92ZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5tYWtlX21vdmUocGxheWVyOiBieXRlcywgbW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgptYWtlX21vdmU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYwLTYxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG1ha2VfbW92ZShzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWtlX21vdmVfYm9vbF9tZXJnZUA0CgptYWtlX21vdmVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCm1ha2VfbW92ZV9ib29sX21lcmdlQDQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjQKICAgIC8vIGFzc2VydCBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID09IEVNUFRZLCAiU3F1YXJlIGlzIGFscmVhZHkgdGFrZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI9PQogICAgYXNzZXJ0IC8vIFNxdWFyZSBpcyBhbHJlYWR5IHRha2VuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY1CiAgICAvLyBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID0gcGxheWVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NgogICAgLy8gc2VsZi50dXJucyArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NwogICAgLy8gaWYgc2VsZi5kaWRfd2luKHBsYXllciwgY29sdW1uPWNvbHVtbiwgcm93PXJvdyk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRpZF93aW4KICAgIGJ6IG1ha2VfbW92ZV9lbHNlX2JvZHlANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OAogICAgLy8gc2VsZi53aW5uZXIudmFsdWUgPSBwbGF5ZXIKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOQoKbWFrZV9tb3ZlX2Vsc2VfYm9keUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OQogICAgLy8gZWxpZiBzZWxmLnR1cm5zID09IDk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOQogICAgPT0KICAgIGJ6IG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzAKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gYXJjNC5VSW50OChEUkFXKQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGFwcF9nbG9iYWxfcHV0CgptYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5kaWRfd2luKHBsYXllcjogYnl0ZXMsIGNvbHVtbjogdWludDY0LCByb3c6IHVpbnQ2NCkgLT4gdWludDY0OgpkaWRfd2luOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3Mi03MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkaWRfd2luKHNlbGYsIHBsYXllcjogYXJjNC5VSW50OCwgY29sdW1uOiBVSW50NjQsIHJvdzogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NAogICAgLy8gZyA9IHNlbGYuZ2FtZS5jb3B5KCkKICAgIGR1cG4gMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzYKICAgIC8vIGlmIGdbcm93XVswXSA9PSBnW3Jvd11bMV0gPT0gZ1tyb3ddWzJdOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNQogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NwogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc5CiAgICAvLyBpZiBnWzBdW2NvbHVtbl0gPT0gZ1sxXVtjb2x1bW5dID09IGdbMl1bY29sdW1uXToKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAzIDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4MAogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgyLTgzCiAgICAvLyAjIGlmIHBsYXllciBvd25zIGNlbnRlciwgY2hlY2sgZGlhZ29uYWxzCiAgICAvLyBpZiBwbGF5ZXIgPT0gZ1sxXVsxXToKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODQKICAgIC8vIGlmIGdbMF1bMF0gPT0gcGxheWVyID09IGdbMl1bMl06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODUKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODYKICAgIC8vIGlmIGdbMF1bMl0gPT0gcGxheWVyID09IGdbMl1bMF06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODgKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC53aG9zZV90dXJuKCkgLT4gYnl0ZXM6Cndob3NlX3R1cm46CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB3aG9zZV90dXJuKHNlbGYpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAwIDEKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KEhPU1QpIGlmIHNlbGYudHVybnMgJSAyIGVsc2UgYXJjNC5VSW50OChDSEFMTEVOR0VSKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgcHVzaGludCAyIC8vIDIKICAgICUKICAgIGJ5dGVjIDUgLy8gMHgwMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5wbGF5KG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKcGxheToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBsYXkoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0OQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLndpbm5lciwgIkdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gR2FtZSBpcyBhbHJlYWR5IGZpbmlzaGVkCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUwCiAgICAvLyBpZiBzZWxmLnR1cm5zICUgMjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieiBwbGF5X2Vsc2VfYm9keUAyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmhvc3QsICJJdCBpcyB0aGUgaG9zdCdzIHR1cm4iCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ob3N0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgaG9zdCdzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTIKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoSE9TVCkKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgYiBwbGF5X2FmdGVyX2lmX2Vsc2VAMwoKcGxheV9lbHNlX2JvZHlAMjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY2hhbGxlbmdlci5nZXQoCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU1CiAgICAvLyBkZWZhdWx0PUFjY291bnQoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0LTU2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgLy8gICAgIGRlZmF1bHQ9QWNjb3VudCgpCiAgICAvLyApLCAiSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgY2hhbGxlbmdlcidzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTcKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGVjIDUgLy8gMHgwMgoKcGxheV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU4CiAgICAvLyBzZWxmLm1ha2VfbW92ZShwbGF5ZXIsIG1vdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgY2FsbHN1YiBuZXdfZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fam9pbl9nYW1lX3JvdXRlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgd2hvc2VfdHVybgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wbGF5X3JvdXRlQDU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBsYXkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm5ld19nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbmV3X2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwLTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICAvLyBkZWYgbmV3X2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIyCiAgICAvLyBpZiBUeG4uYXBwbGljYXRpb25faWQ6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIzLTI1CiAgICAvLyAjIGlmIGEgY2hhbGxlbmdlciBoYXMgam9pbmVkLCBkb24ndCBhbGxvdyBzdGFydGluZyBhIG5ldyBnYW1lCiAgICAvLyAjIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlCiAgICAvLyBpZiBzZWxmLmNoYWxsZW5nZXI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJ6IG5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNgogICAgLy8gYXNzZXJ0IHNlbGYud2lubmVyLCAiR2FtZSBpc24ndCBvdmVyIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBHYW1lIGlzbid0IG92ZXIKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjctMjgKICAgIC8vICMgcmVzZXQgY2hhbGxlbmdlciBhbmQgd2lubmVyCiAgICAvLyBkZWwgc2VsZi5jaGFsbGVuZ2VyLnZhbHVlCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9kZWwKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjkKICAgIC8vIGRlbCBzZWxmLndpbm5lci52YWx1ZQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9kZWwKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzAKICAgIC8vIHNlbGYuaG9zdCA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMQogICAgLy8gc2VsZi5nYW1lID0gR2FtZS5mcm9tX2J5dGVzKG9wLmJ6ZXJvKDkpKQogICAgaW50Y18zIC8vIDkKICAgIGJ6ZXJvCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IG5ld19nYW1lX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgYiBuZXdfZ2FtZV9ib29sX21lcmdlQDgKCm5ld19nYW1lX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCgpuZXdfZ2FtZV9ib29sX21lcmdlQDg6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzQKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNQogICAgLy8gc2VsZi50dXJucyA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Quam9pbl9nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKam9pbl9nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNy0zOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgam9pbl9nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jaGFsbGVuZ2VyLCAiSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MAogICAgLy8gc2VsZi5jaGFsbGVuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQxCiAgICAvLyBzZWxmLm1ha2VfbW92ZShhcmM0LlVJbnQ4KENIQUxMRU5HRVIpLCBtb3ZlKQogICAgYnl0ZWMgNSAvLyAweDAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubWFrZV9tb3ZlKHBsYXllcjogYnl0ZXMsIG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbWFrZV9tb3ZlOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MC02MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBtYWtlX21vdmUoc2VsZiwgcGxheWVyOiBhcmM0LlVJbnQ4LCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGR1cAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANAoKbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCgptYWtlX21vdmVfYm9vbF9tZXJnZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBhc3NlcnQgLy8gTW92ZSBtdXN0IGJlIGluIHJhbmdlCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY0CiAgICAvLyBhc3NlcnQgc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9PSBFTVBUWSwgIlNxdWFyZSBpcyBhbHJlYWR5IHRha2VuIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBiPT0KICAgIGFzc2VydCAvLyBTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NQogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IHBsYXllcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMwogICAgcmVwbGFjZTMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjYKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjcKICAgIC8vIGlmIHNlbGYuZGlkX3dpbihwbGF5ZXIsIGNvbHVtbj1jb2x1bW4sIHJvdz1yb3cpOgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkaWRfd2luCiAgICBieiBtYWtlX21vdmVfZWxzZV9ib2R5QDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjgKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gcGxheWVyCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKCm1ha2VfbW92ZV9lbHNlX2JvZHlANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjkKICAgIC8vIGVsaWYgc2VsZi50dXJucyA9PSA5OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18zIC8vIDkKICAgID09CiAgICBieiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjcwCiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IGFyYzQuVUludDgoRFJBVykKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIHB1c2hieXRlcyAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzItNzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzQKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc2CiAgICAvLyBpZiBnW3Jvd11bMF0gPT0gZ1tyb3ddWzFdID09IGdbcm93XVsyXToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDUKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3OQogICAgLy8gaWYgZ1swXVtjb2x1bW5dID09IGdbMV1bY29sdW1uXSA9PSBnWzJdW2NvbHVtbl06CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDAgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMyAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODAKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4Mi04MwogICAgLy8gIyBpZiBwbGF5ZXIgb3ducyBjZW50ZXIsIGNoZWNrIGRpYWdvbmFscwogICAgLy8gaWYgcGxheWVyID09IGdbMV1bMV06CiAgICBmcmFtZV9kaWcgMgogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg3CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg4CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgYnogcGxheV9lbHNlX2JvZHlAMgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5ob3N0LCAiSXQgaXMgdGhlIGhvc3QncyB0dXJuIgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaG9zdCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGhvc3QncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUyCiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIGIgcGxheV9hZnRlcl9pZl9lbHNlQDMKCnBsYXlfZWxzZV9ib2R5QDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgdHhuIFNlbmRlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NQogICAgLy8gZGVmYXVsdD1BY2NvdW50KCkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NC01NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIC8vICAgICBkZWZhdWx0PUFjY291bnQoKQogICAgLy8gKSwgIkl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzZWxlY3QKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU3CiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KENIQUxMRU5HRVIpCiAgICBieXRlYyA1IC8vIDB4MDIKCnBsYXlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1OAogICAgLy8gc2VsZi5tYWtlX21vdmUocGxheWVyLCBtb3ZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/examples/tictactoe/out/TicTacToeContract.arc56.json b/examples/tictactoe/out/TicTacToeContract.arc56.json new file mode 100644 index 0000000000..671d7b38dd --- /dev/null +++ b/examples/tictactoe/out/TicTacToeContract.arc56.json @@ -0,0 +1,268 @@ +{ + "name": "TicTacToeContract", + "structs": {}, + "methods": [ + { + "name": "new_game", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "join_game", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "whose_turn", + "args": [], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "play", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "challenger": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y2hhbGxlbmdlcg==" + }, + "winner": { + "keyType": "AVMString", + "valueType": "uint8", + "key": "d2lubmVy" + }, + "host": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "aG9zdA==" + }, + "game": { + "keyType": "AVMString", + "valueType": "uint8[3][3]", + "key": "Z2FtZQ==" + }, + "turns": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHVybnM=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 636 + ], + "errorMessage": "Game is already finished" + }, + { + "pc": [ + 214 + ], + "errorMessage": "Game isn't over" + }, + { + "pc": [ + 301 + ], + "errorMessage": "Host already has a challenger" + }, + { + "pc": [ + 267, + 281, + 372, + 386 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 670 + ], + "errorMessage": "It is the challenger's turn" + }, + { + "pc": [ + 655 + ], + "errorMessage": "It is the host's turn" + }, + { + "pc": [ + 251, + 339 + ], + "errorMessage": "Move must be in range" + }, + { + "pc": [ + 99, + 121, + 146, + 167 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 361 + ], + "errorMessage": "Square is already taken" + }, + { + "pc": [ + 124, + 149, + 170 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 255, + 276, + 343, + 365, + 381, + 448 + ], + "errorMessage": "check self.game exists" + }, + { + "pc": [ + 653 + ], + "errorMessage": "check self.host exists" + }, + { + "pc": [ + 396, + 424, + 615, + 640 + ], + "errorMessage": "check self.turns exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgY2FsbHN1YiBuZXdfZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fam9pbl9nYW1lX3JvdXRlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgd2hvc2VfdHVybgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wbGF5X3JvdXRlQDU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBsYXkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm5ld19nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbmV3X2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwLTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICAvLyBkZWYgbmV3X2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIyCiAgICAvLyBpZiBUeG4uYXBwbGljYXRpb25faWQ6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIzLTI1CiAgICAvLyAjIGlmIGEgY2hhbGxlbmdlciBoYXMgam9pbmVkLCBkb24ndCBhbGxvdyBzdGFydGluZyBhIG5ldyBnYW1lCiAgICAvLyAjIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlCiAgICAvLyBpZiBzZWxmLmNoYWxsZW5nZXI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJ6IG5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNgogICAgLy8gYXNzZXJ0IHNlbGYud2lubmVyLCAiR2FtZSBpc24ndCBvdmVyIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBHYW1lIGlzbid0IG92ZXIKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjctMjgKICAgIC8vICMgcmVzZXQgY2hhbGxlbmdlciBhbmQgd2lubmVyCiAgICAvLyBkZWwgc2VsZi5jaGFsbGVuZ2VyLnZhbHVlCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9kZWwKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjkKICAgIC8vIGRlbCBzZWxmLndpbm5lci52YWx1ZQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9kZWwKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzAKICAgIC8vIHNlbGYuaG9zdCA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMQogICAgLy8gc2VsZi5nYW1lID0gR2FtZS5mcm9tX2J5dGVzKG9wLmJ6ZXJvKDkpKQogICAgaW50Y18zIC8vIDkKICAgIGJ6ZXJvCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IG5ld19nYW1lX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgYiBuZXdfZ2FtZV9ib29sX21lcmdlQDgKCm5ld19nYW1lX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCgpuZXdfZ2FtZV9ib29sX21lcmdlQDg6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzQKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNQogICAgLy8gc2VsZi50dXJucyA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Quam9pbl9nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKam9pbl9nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNy0zOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgam9pbl9nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jaGFsbGVuZ2VyLCAiSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MAogICAgLy8gc2VsZi5jaGFsbGVuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQxCiAgICAvLyBzZWxmLm1ha2VfbW92ZShhcmM0LlVJbnQ4KENIQUxMRU5HRVIpLCBtb3ZlKQogICAgYnl0ZWMgNSAvLyAweDAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubWFrZV9tb3ZlKHBsYXllcjogYnl0ZXMsIG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbWFrZV9tb3ZlOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MC02MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBtYWtlX21vdmUoc2VsZiwgcGxheWVyOiBhcmM0LlVJbnQ4LCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGR1cAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANAoKbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCgptYWtlX21vdmVfYm9vbF9tZXJnZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBhc3NlcnQgLy8gTW92ZSBtdXN0IGJlIGluIHJhbmdlCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY0CiAgICAvLyBhc3NlcnQgc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9PSBFTVBUWSwgIlNxdWFyZSBpcyBhbHJlYWR5IHRha2VuIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBiPT0KICAgIGFzc2VydCAvLyBTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NQogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IHBsYXllcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMwogICAgcmVwbGFjZTMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjYKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjcKICAgIC8vIGlmIHNlbGYuZGlkX3dpbihwbGF5ZXIsIGNvbHVtbj1jb2x1bW4sIHJvdz1yb3cpOgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkaWRfd2luCiAgICBieiBtYWtlX21vdmVfZWxzZV9ib2R5QDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjgKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gcGxheWVyCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKCm1ha2VfbW92ZV9lbHNlX2JvZHlANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjkKICAgIC8vIGVsaWYgc2VsZi50dXJucyA9PSA5OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18zIC8vIDkKICAgID09CiAgICBieiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjcwCiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IGFyYzQuVUludDgoRFJBVykKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIHB1c2hieXRlcyAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzItNzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzQKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc2CiAgICAvLyBpZiBnW3Jvd11bMF0gPT0gZ1tyb3ddWzFdID09IGdbcm93XVsyXToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDUKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3OQogICAgLy8gaWYgZ1swXVtjb2x1bW5dID09IGdbMV1bY29sdW1uXSA9PSBnWzJdW2NvbHVtbl06CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDAgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMyAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODAKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4Mi04MwogICAgLy8gIyBpZiBwbGF5ZXIgb3ducyBjZW50ZXIsIGNoZWNrIGRpYWdvbmFscwogICAgLy8gaWYgcGxheWVyID09IGdbMV1bMV06CiAgICBmcmFtZV9kaWcgMgogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg3CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg4CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgYnogcGxheV9lbHNlX2JvZHlAMgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5ob3N0LCAiSXQgaXMgdGhlIGhvc3QncyB0dXJuIgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaG9zdCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGhvc3QncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUyCiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIGIgcGxheV9hZnRlcl9pZl9lbHNlQDMKCnBsYXlfZWxzZV9ib2R5QDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgdHhuIFNlbmRlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NQogICAgLy8gZGVmYXVsdD1BY2NvdW50KCkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NC01NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIC8vICAgICBkZWZhdWx0PUFjY291bnQoKQogICAgLy8gKSwgIkl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzZWxlY3QKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU3CiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KENIQUxMRU5HRVIpCiAgICBieXRlYyA1IC8vIDB4MDIKCnBsYXlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1OAogICAgLy8gc2VsZi5tYWtlX21vdmUocGxheWVyLCBtb3ZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEDCSYHBGdhbWUFdHVybnMKY2hhbGxlbmdlcgZ3aW5uZXIBAQECBGhvc3SIAAFDigABMRtBAIKCBASWqXGBBBegebMEu58RRwSe6/WONhoAjgQAAgAYADEARiKJMRkURDYaAUlXAAgXTFcICBeIAEsjiTEZFEQxGEQ2GgFJVwAIF0xXCAgXiACXI4kxGRREMRhEiAHIgAQVH3x1TFCwI4kxGRREMRhENhoBSVcACBdMVwgIF4gBuCOJIomKAgCAADEYQQASIiplRQFBAAYiK2VFAUQqaStpJwYxAGclryhMZ4v+JAxJjABBAAuL/yQMQQAEI0IAASJEIihlRIv/JAtMSwEkWIsARIv+JwRdIihlRIv/JAxETgJdKExnKSJniYoCACIqZUUBFEQqMQBnJwWL/ov/iAABiYoDAIv+JAxJQQALi/8kDEEABCNCAAEiRCIoZUSL/yQLTEsBJFiL/iNYgAEAqEQiKGVESwEkWIsARIv+i/1dIihlRIv/JAxETgJdKExnIillRCMIKUxni/2L/ov/iAAZQQAHK4v9Z0IADiIpZUQlEkEABSuAAQNniYoDASJHAyhlTElPAkSL/yQLJFhHAlcAAUxXAQFJTgKoQQAPiwRXAgGLBahBAAQjjACJiwNJVwADSYwBi/4jWExXAwNJjAKL/iNYSYwAqEEAE4sDVwYDi/4jWIsAqEEABCOMAImLAlcBAYv9qEEAOosBVwABi/2oQQASiwNXBgNXAgGL/ahBAAQjjACJiwFXAgGL/ahBABKLA1cGA1cAAYv9qEEABCOMAIkijACJigABIillRIECGCcFJwRPAk2JigIAIitlRQEURCIpZUSBAhhBAA4xACInBmVEEkQnBEIADDEAMgMiKmVNEkQnBYv+i/+I/pSJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/tictactoe/out/TicTacToeContract.destructured.ir b/examples/tictactoe/out/TicTacToeContract.destructured.ir index c03fedb479..4ebe058e5d 100644 --- a/examples/tictactoe/out/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out/TicTacToeContract.destructured.ir @@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (! tmp%6#0) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) - (assert tmp%8#0) // is not creating + (assert tmp%8#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.ir b/examples/tictactoe/out/TicTacToeContract.ssa.ir index 6c24a9b87f..46f3fc325d 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.ir @@ -26,7 +26,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = (extract3 tmp%5#0 0u 8u) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -37,10 +37,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (== tmp%6#0 NoOp) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (!= tmp%8#0 0u) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = (extract3 tmp%10#0 0u 8u) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -51,10 +51,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -62,10 +62,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = (extract3 tmp%21#0 0u 8u) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir index 2a8548f0f5..2122c95c0b 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir @@ -20,7 +20,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -31,9 +31,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (! tmp%6#0) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) - (assert tmp%8#0) // is not creating + (assert tmp%8#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -44,9 +44,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -54,9 +54,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir index 6357ffc4ce..ecd20f1716 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir @@ -18,7 +18,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -29,9 +29,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (! tmp%6#0) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) - (assert tmp%8#0) // is not creating + (assert tmp%8#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -42,9 +42,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -52,9 +52,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir index e9e5754b9c..fbe8823b0a 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir @@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (! tmp%6#0) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) - (assert tmp%8#0) // is not creating + (assert tmp%8#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out_O2/TicTacToeContract.approval.teal b/examples/tictactoe/out_O2/TicTacToeContract.approval.teal index 1bc59d705c..a6a1b576f5 100644 --- a/examples/tictactoe/out_O2/TicTacToeContract.approval.teal +++ b/examples/tictactoe/out_O2/TicTacToeContract.approval.teal @@ -21,7 +21,7 @@ __puya_arc4_router__: __puya_arc4_router___new_game_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -36,9 +36,9 @@ __puya_arc4_router___new_game_route@2: __puya_arc4_router___join_game_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -53,9 +53,9 @@ __puya_arc4_router___join_game_route@3: __puya_arc4_router___whose_turn_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub whose_turn pushbytes 0x151f7c75 swap @@ -67,9 +67,9 @@ __puya_arc4_router___whose_turn_route@4: __puya_arc4_router___play_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds diff --git a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir index 83e72b7bac..bb8b7d8f91 100644 --- a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir @@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (! tmp%6#0) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) - (assert tmp%8#0) // is not creating + (assert tmp%8#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal index 7f8a10fe29..0069f8781a 100644 --- a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal +++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal @@ -44,7 +44,7 @@ __puya_arc4_router___new_game_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -70,11 +70,11 @@ __puya_arc4_router___join_game_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -100,11 +100,11 @@ __puya_arc4_router___whose_turn_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub whose_turn pushbytes 0x151f7c75 swap @@ -119,11 +119,11 @@ __puya_arc4_router___play_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // tictactoe/tictactoe.py:15 // class TicTacToeContract(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir index 70c2037d75..7acade54e2 100644 --- a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir @@ -26,7 +26,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@2: // new_game_route_L20 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = (extract3 tmp%5#0 0u 8u) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -37,10 +37,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@3: // join_game_route_L37 let tmp%6#0: uint64 = (txn OnCompletion) let tmp%7#0: bool = (== tmp%6#0 NoOp) - (assert tmp%7#0) // OnCompletion is NoOp + (assert tmp%7#0) // OnCompletion is not NoOp let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (!= tmp%8#0 0u) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%10#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = (extract3 tmp%10#0 0u 8u) // on error: Index access is out of bounds let item0%1%0#0: uint64 = (btoi item0%1#0) @@ -51,10 +51,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@4: // whose_turn_route_L43 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -62,10 +62,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: block@5: // play_route_L47 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%21#0: bytes = (txna ApplicationArgs 1) let item0%2#0: bytes = (extract3 tmp%21#0 0u 8u) // on error: Index access is out of bounds let item0%2%0#0: uint64 = (btoi item0%2#0) diff --git a/examples/tictactoe/puya.log b/examples/tictactoe/puya.log index 8d57e535e2..dad6a4250c 100644 --- a/examples/tictactoe/puya.log +++ b/examples/tictactoe/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tictactoe'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tictactoe'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing tictactoe/out/module.awst debug: Sealing block@0: // L12 @@ -1609,6 +1609,7 @@ debug: examples.tictactoe.tictactoe.TicTacToeContract.make_move f-stack on first debug: examples.tictactoe.tictactoe.TicTacToeContract.did_win f-stack entry: ['awst_tmp%1#0', 'tmp%5#0', 'tmp%6#0'] debug: examples.tictactoe.tictactoe.TicTacToeContract.did_win f-stack on first store: ['g#0', 'tmp%0#0', 'awst_tmp%0#0'] info: Writing tictactoe/out/TicTacToeContract.arc32.json +info: Writing tictactoe/out/TicTacToeContract.arc56.json info: Writing tictactoe/out/TicTacToeContract.approval.teal info: Writing tictactoe/out/TicTacToeContract.clear.teal info: Writing tictactoe/out/TicTacToeContract.approval.bin diff --git a/examples/voting/out/VotingRoundApp.approval.mir b/examples/voting/out/VotingRoundApp.approval.mir index c20475fbb8..eb594c7e0c 100644 --- a/examples/voting/out/VotingRoundApp.approval.mir +++ b/examples/voting/out/VotingRoundApp.approval.mir @@ -66,10 +66,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -106,9 +106,9 @@ __puya_arc4_router___bootstrap_route@3: // @arc4.abimethod txn OnCompletion tmp%22#0 ! tmp%23#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%24#0 - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex tmp%26#0 @@ -131,9 +131,9 @@ __puya_arc4_router___close_route@4: // @arc4.abimethod txn OnCompletion tmp%27#0 ! tmp%28#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%29#0 - assert // is not creating + assert // can only call when not creating callsub close int 1 1 retsub 1 @@ -143,9 +143,9 @@ __puya_arc4_router___get_preconditions_route@5: // @arc4.abimethod(readonly=True) txn OnCompletion tmp%31#0 ! tmp%32#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%33#0 - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 tmp%35#0 @@ -165,9 +165,9 @@ __puya_arc4_router___vote_route@6: // @arc4.abimethod txn OnCompletion tmp%39#0 ! tmp%40#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%41#0 - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex tmp%43#0 diff --git a/examples/voting/out/VotingRoundApp.approval.teal b/examples/voting/out/VotingRoundApp.approval.teal index a79b0f336b..66b0cf93f0 100644 --- a/examples/voting/out/VotingRoundApp.approval.teal +++ b/examples/voting/out/VotingRoundApp.approval.teal @@ -49,10 +49,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 @@ -81,9 +81,9 @@ __puya_arc4_router___bootstrap_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex @@ -105,9 +105,9 @@ __puya_arc4_router___close_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub close intc_1 // 1 retsub @@ -117,9 +117,9 @@ __puya_arc4_router___get_preconditions_route@5: // @arc4.abimethod(readonly=True) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 @@ -139,9 +139,9 @@ __puya_arc4_router___vote_route@6: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex diff --git a/examples/voting/out/VotingRoundApp.arc32.json b/examples/voting/out/VotingRoundApp.arc32.json index d647abb975..fb3ef3afc4 100644 --- a/examples/voting/out/VotingRoundApp.arc32.json +++ b/examples/voting/out/VotingRoundApp.arc32.json @@ -51,7 +51,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBleHRyYWN0IDIgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm9vdHN0cmFwX3JvdXRlQDM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wcmVjb25kaXRpb25zCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZvdGVfcm91dGVANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZvdGUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY3JlYXRlKHZvdGVfaWQ6IGJ5dGVzLCBzbmFwc2hvdF9wdWJsaWNfa2V5OiBieXRlcywgbWV0YWRhdGFfaXBmc19jaWQ6IGJ5dGVzLCBzdGFydF90aW1lOiB1aW50NjQsIGVuZF90aW1lOiB1aW50NjQsIG9wdGlvbl9jb3VudHM6IGJ5dGVzLCBxdW9ydW06IHVpbnQ2NCwgbmZ0X2ltYWdlX3VybDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTgtNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHZvdGVfaWQ6IFN0cmluZywKICAgIC8vICAgICBzbmFwc2hvdF9wdWJsaWNfa2V5OiBCeXRlcywKICAgIC8vICAgICBtZXRhZGF0YV9pcGZzX2NpZDogU3RyaW5nLAogICAgLy8gICAgIHN0YXJ0X3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBlbmRfdGltZTogVUludDY0LAogICAgLy8gICAgIG9wdGlvbl9jb3VudHM6IFZvdGVJbmRleEFycmF5LAogICAgLy8gICAgIHF1b3J1bTogVUludDY0LAogICAgLy8gICAgIG5mdF9pbWFnZV91cmw6IFN0cmluZywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDggMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MAogICAgLy8gYXNzZXJ0IHN0YXJ0X3RpbWUgPCBlbmRfdGltZSwgIkVuZCB0aW1lIHNob3VsZCBiZSBhZnRlciBzdGFydCB0aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIDwKICAgIGFzc2VydCAvLyBFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MQogICAgLy8gYXNzZXJ0IGVuZF90aW1lID49IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCAiRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUiCiAgICBmcmFtZV9kaWcgLTQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID49CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzMKICAgIC8vIHNlbGYudm90ZV9pZCA9IHZvdGVfaWQKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBmcmFtZV9kaWcgLTgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc0CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXkgPSBzbmFwc2hvdF9wdWJsaWNfa2V5CiAgICBieXRlYyA2IC8vICJzbmFwc2hvdF9wdWJsaWNfa2V5IgogICAgZnJhbWVfZGlnIC03CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NQogICAgLy8gc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCA9IG1ldGFkYXRhX2lwZnNfY2lkCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzYKICAgIC8vIHNlbGYuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUKICAgIGJ5dGVjIDggLy8gInN0YXJ0X3RpbWUiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc3CiAgICAvLyBzZWxmLmVuZF90aW1lID0gZW5kX3RpbWUKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OAogICAgLy8gc2VsZi5xdW9ydW0gPSBxdW9ydW0KICAgIGJ5dGVjIDEwIC8vICJxdW9ydW0iCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc5CiAgICAvLyBzZWxmLm5mdF9pbWFnZV91cmwgPSBuZnRfaW1hZ2VfdXJsCiAgICBieXRlYyAxMSAvLyAibmZ0X2ltYWdlX3VybCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODAKICAgIC8vIHNlbGYuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBzdG9yZV9vcHRpb25fY291bnRzCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzOiBieXRlcykgLT4gYnl0ZXM6CnN0b3JlX29wdGlvbl9jb3VudHM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNy0yMTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc3RvcmVfb3B0aW9uX2NvdW50cyhzZWxmLCBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTkKICAgIC8vIGFzc2VydCBvcHRpb25fY291bnRzLmxlbmd0aCwgIm9wdGlvbl9jb3VudHMgc2hvdWxkIGJlIG5vbi1lbXB0eSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGFzc2VydCAvLyBvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIwCiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGggPD0gMTEyLCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucyIKICAgIHB1c2hpbnQgMTEyIC8vIDExMgogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMgogICAgLy8gdG90YWxfb3B0aW9ucyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMwogICAgLy8gZm9yIGl0ZW0gaW4gb3B0aW9uX2NvdW50czoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogc3RvcmVfb3B0aW9uX2NvdW50c19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjQKICAgIC8vIHRvdGFsX29wdGlvbnMgKz0gaXRlbS5uYXRpdmUKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDEKCnN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNQogICAgLy8gYXNzZXJ0IHRvdGFsX29wdGlvbnMgPD0gMTI4LCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucyIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTI4IC8vIDEyOAogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMjggdm90ZSBvcHRpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNwogICAgLy8gc2VsZi5vcHRpb25fY291bnRzID0gb3B0aW9uX2NvdW50cy5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9vcHRpb25zID0gdG90YWxfb3B0aW9ucwogICAgYnl0ZWMgMTIgLy8gInRvdGFsX29wdGlvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuYm9vdHN0cmFwKGZ1bmRfbWluX2JhbF9yZXE6IHVpbnQ2NCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaXNfYm9vdHN0cmFwcGVkLCAiTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NQogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQgPSBUcnVlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg3LTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIlBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTEKICAgIC8vIHRhbGx5X2JveF9zaXplID0gc2VsZi50b3RhbF9vcHRpb25zICogVk9URV9DT1VOVF9CWVRFUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX29wdGlvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDEtMTAyCiAgICAvLyAjIHRhbGx5IGJveCB2YWx1ZQogICAgLy8gKyAodGFsbHlfYm94X3NpemUgKiBCT1hfQllURV9NSU5fQkFMQU5DRSkKICAgIGR1cAogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMAogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAyMDM5MDAgLy8gMjAzOTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMgogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNAogICAgLy8gbG9nKG1pbl9iYWxhbmNlX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNgogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA1LTEwNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLmFtb3VudCA9PSBtaW5fYmFsYW5jZV9yZXEKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudCIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDgKICAgIC8vIGFzc2VydCBzZWxmLnRhbGx5X2JveC5jcmVhdGUoc2l6ZT10YWxseV9ib3hfc2l6ZSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY2xvc2UoKSAtPiB2b2lkOgpjbG9zZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEwLTExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDAwLCBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDIwMDAwIC8vIDIwMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNsb3NlX3RpbWUsICJBbHJlYWR5IGNsb3NlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgY2xvc2VkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNAogICAgLy8gc2VsZi5jbG9zZV90aW1lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTkKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE4CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICBwdXNoYnl0ZXMgIntcInN0YW5kYXJkXCI6XCJhcmM2OVwiLFwiZGVzY3JpcHRpb25cIjpcIlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE5CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgcHVzaGJ5dGVzICIuXCIsXCJwcm9wZXJ0aWVzXCI6e1wibWV0YWRhdGFcIjpcImlwZnM6Ly8iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjAKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIxCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMgogICAgLy8gKyAnIiwiaWQiOiInCiAgICBwdXNoYnl0ZXMgIlwiLFwiaWRcIjpcIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIzCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBwdXNoYnl0ZXMgIlwiLFwicXVvcnVtXCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI0CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjUKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnF1b3J1bSBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI1CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjYKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgcHVzaGJ5dGVzICIsXCJ2b3RlckNvdW50XCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI2CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNwogICAgLy8gKyBpdG9hKHNlbGYudm90ZXJfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyOAogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgcHVzaGJ5dGVzICIsXCJ0YWxsaWVzXCI6WyIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMQogICAgLy8gY3VycmVudF9pbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZHVwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKY2xvc2VfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCwgcXVlc3Rpb25fb3B0aW9ucyBpbiB1ZW51bWVyYXRlKHNlbGYub3B0aW9uX2NvdW50cyk6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDgKICAgIDwKICAgIGJ6IGNsb3NlX2FmdGVyX2ZvckAxNAogICAgZnJhbWVfZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMzCiAgICAvLyBpZiBxdWVzdGlvbl9pbmRleCA+IDA6CiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM0CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM1CiAgICAvLyBpZiBxdWVzdGlvbl9vcHRpb25zID4gMDoKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYj4KICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzYKICAgIC8vIG5vdGUgKz0gIlsiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICJbIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMQogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpjbG9zZV9mb3JfaGVhZGVyQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM4CiAgICAvLyBpZiBvcHRpb25faW5kZXggPiAwOgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzkKICAgIC8vIG5vdGUgKz0gIiwiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICIsIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAOToKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MAogICAgLy8gdm90ZXNfZm9yX29wdGlvbiA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goY3VycmVudF9pbmRleCkKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQxCiAgICAvLyBub3RlICs9IGl0b2Eodm90ZXNfZm9yX29wdGlvbikKICAgIGNhbGxzdWIgaXRvYQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQyCiAgICAvLyBjdXJyZW50X2luZGV4ICs9IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBjbG9zZV9mb3JfaGVhZGVyQDYKCmNsb3NlX2FmdGVyX2ZvckAxMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQzCiAgICAvLyBub3RlICs9ICJdIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXSIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgNQogICAgZnJhbWVfZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDkKICAgIGIgY2xvc2VfZm9yX2hlYWRlckAxCgpjbG9zZV9hZnRlcl9mb3JAMTQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NAogICAgLy8gbm90ZSArPSAiXX19IgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXX19IgogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1NAogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUwCiAgICAvLyBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgcHVzaGJ5dGVzICJbVk9URSBSRVNVTFRdICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTIKICAgIC8vIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmZ0X2ltYWdlX3VybCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MQogICAgLy8gdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICBwdXNoYnl0ZXMgIlZPVEVSU0xUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDkKICAgIC8vIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0OAogICAgLy8gZGVjaW1hbHM9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ3CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NQogICAgLy8gc2VsZi5uZnRfYXNzZXRfaWQgPSAoCiAgICBwdXNoYnl0ZXMgIm5mdF9hc3NldF9pZCIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NS0xNTgKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIHRvdGFsPTEsCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5pdG9hKGk6IHVpbnQ2NCkgLT4gYnl0ZXM6Cml0b2E6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0OS0yNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXRvYShpOiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU0CiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2ldKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTEKICAgIC8vIGRpZ2l0cyA9IEJ5dGVzKGIiMDEyMzQ1Njc4OSIpCiAgICBieXRlYyAxMyAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAvCiAgICBjYWxsc3ViIGl0b2EKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaSAlIHJhZGl4XSkKICAgICUKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXg6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRfdm90ZV9mcm9tX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM5LTI0MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdm90ZV9mcm9tX2JveChzZWxmLCBpbmRleDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQxCiAgICAvLyByZXR1cm4gb3AuYnRvaShzZWxmLnRhbGx5X2JveC5leHRyYWN0KGluZGV4LCBWT1RFX0NPVU5UX0JZVEVTKSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5nZXRfcHJlY29uZGl0aW9ucyhzaWduYXR1cmU6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3ByZWNvbmRpdGlvbnM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MC0xNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wcmVjb25kaXRpb25zKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IFZvdGluZ1ByZWNvbmRpdGlvbnM6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYzCiAgICAvLyBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjQKICAgIC8vIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY1CiAgICAvLyBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICBjYWxsc3ViIGFscmVhZHlfdm90ZWQKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2CiAgICAvLyBjdXJyZW50X3RpbWU9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjItMTY3CiAgICAvLyByZXR1cm4gVm90aW5nUHJlY29uZGl0aW9ucygKICAgIC8vICAgICBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgLy8gICAgIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIC8vICAgICBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICAvLyAgICAgY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90aW5nX29wZW4oKSAtPiB1aW50NjQ6CnZvdGluZ19vcGVuOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDUtMjA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHZvdGluZ19vcGVuKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDgKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4LTIxMAogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDkKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJueiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEwCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXJ0X3RpbWUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgPD0KICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVuZF90aW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCiAgICBiIHZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANgoKdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKCnZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA3LTIxMQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgLy8gICAgIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyAgICAgYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmU6IGJ5dGVzKSAtPiB1aW50NjQ6CmFsbG93ZWRfdG9fdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMwLTIzMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxvd2VkX3RvX3ZvdGUoc2VsZiwgc2lnbmF0dXJlOiBCeXRlcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzIKICAgIC8vIGVuc3VyZV9idWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNAogICAgLy8gVHhuLnNlbmRlci5ieXRlcywKICAgIHR4biBTZW5kZXIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM2CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5IGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzMtMjM3CiAgICAvLyByZXR1cm4gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKAogICAgLy8gICAgIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICAvLyAgICAgc2lnbmF0dXJlLAogICAgLy8gICAgIHNlbGYuc25hcHNob3RfcHVibGljX2tleSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgZWQyNTUxOXZlcmlmeV9iYXJlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFscmVhZHlfdm90ZWQoKSAtPiB1aW50NjQ6CmFscmVhZHlfdm90ZWQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMy0yMTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxyZWFkeV92b3RlZChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgaW4gc2VsZi52b3Rlc19ieV9hY2NvdW50CiAgICB0eG4gU2VuZGVyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90ZShmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQsIHNpZ25hdHVyZTogYnl0ZXMsIGFuc3dlcl9pZHM6IGJ5dGVzKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjktMTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB2b3RlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgc2lnbmF0dXJlOiBCeXRlcywKICAgIC8vICAgICBhbnN3ZXJfaWRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzYKICAgIC8vIGVuc3VyZV9idWRnZXQoNzcwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA3NzAwIC8vIDc3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc3LTE3OAogICAgLy8gIyBDaGVjayB2b3RpbmcgcHJlY29uZGl0aW9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZSksICJOb3QgYWxsb3dlZCB0byB2b3RlIgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFsbG93ZWRfdG9fdm90ZQogICAgYXNzZXJ0IC8vIE5vdCBhbGxvd2VkIHRvIHZvdGUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc5CiAgICAvLyBhc3NlcnQgc2VsZi52b3Rpbmdfb3BlbigpLCAiVm90aW5nIG5vdCBvcGVuIgogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgYXNzZXJ0IC8vIFZvdGluZyBub3Qgb3BlbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hbHJlYWR5X3ZvdGVkKCksICJBbHJlYWR5IHZvdGVkIgogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSB2b3RlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODEKICAgIC8vIHF1ZXN0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50cy5sZW5ndGgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODIKICAgIC8vIGFzc2VydCBhbnN3ZXJfaWRzLmxlbmd0aCA9PSBxdWVzdGlvbnNfY291bnQsICJOdW1iZXIgb2YgYW5zd2VycyBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4NQogICAgLy8gKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAzNCAvLyAzNAogICAgKwogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODQKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIHB1c2hpbnQgMjUwMCAvLyAyNTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODYKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIC8vICAgICAoMzIgKyAyICsgVk9URV9JTkRFWF9CWVRFUyAqIGFuc3dlcl9pZHMubGVuZ3RoKSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFCiAgICAvLyApCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4OAogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTg3LTE4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MQogICAgLy8gbG9nKG1pbl9iYWxfcmVxKQogICAgZHVwCiAgICBpdG9iCiAgICBsb2cKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBhc3NlcnQgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbF9yZXEsICJQYXltZW50IG11c3QgYmUgdGhlIGV4YWN0IG1pbiBiYWxhbmNlIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTMtMTk0CiAgICAvLyAjIFJlY29yZCB0aGUgdm90ZSBmb3IgZWFjaCBxdWVzdGlvbgogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZHVwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk1CiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHZvdGVfYWZ0ZXJfZm9yQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk2LTE5NwogICAgLy8gIyBMb2FkIHRoZSB1c2VyJ3Mgdm90ZSBmb3IgdGhpcyBxdWVzdGlvbgogICAgLy8gYW5zd2VyX29wdGlvbl9pbmRleCA9IGFuc3dlcl9pZHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTgKICAgIC8vIG9wdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTkKICAgIC8vIGFzc2VydCBhbnN3ZXJfb3B0aW9uX2luZGV4IDwgb3B0aW9uc19jb3VudCwgIkFuc3dlciBvcHRpb24gaW5kZXggaW52YWxpZCIKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAwCiAgICAvLyBzZWxmLmluY3JlbWVudF92b3RlX2luX2JveChjdW11bGF0aXZlX29mZnNldCArIGFuc3dlcl9vcHRpb25faW5kZXgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGNhbGxzdWIgaW5jcmVtZW50X3ZvdGVfaW5fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMQogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgKz0gb3B0aW9uc19jb3VudAogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMgogICAgLy8gc2VsZi52b3Rlc19ieV9hY2NvdW50W1R4bi5zZW5kZXJdID0gYW5zd2VyX2lkcy5jb3B5KCkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAzCiAgICAvLyBzZWxmLnZvdGVyX2NvdW50ICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2b3Rlcl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3Rlcl9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18xIC8vICJ2b3Rlcl9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB2b3RlX2Zvcl9oZWFkZXJAMQoKdm90ZV9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuaW5jcmVtZW50X3ZvdGVfaW5fYm94KGluZGV4OiB1aW50NjQpIC0+IHZvaWQ6CmluY3JlbWVudF92b3RlX2luX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpbmNyZW1lbnRfdm90ZV9pbl9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDUKICAgIC8vIGN1cnJlbnRfdm90ZSA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ2CiAgICAvLyBzZWxmLnRhbGx5X2JveC5yZXBsYWNlKGluZGV4LCBvcC5pdG9iKGN1cnJlbnRfdm90ZSArIDEpKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9yb3V0ZUA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdm90ZV9yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB2b3RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNyZWF0ZSh2b3RlX2lkOiBieXRlcywgc25hcHNob3RfcHVibGljX2tleTogYnl0ZXMsIG1ldGFkYXRhX2lwZnNfY2lkOiBieXRlcywgc3RhcnRfdGltZTogdWludDY0LCBlbmRfdGltZTogdWludDY0LCBvcHRpb25fY291bnRzOiBieXRlcywgcXVvcnVtOiB1aW50NjQsIG5mdF9pbWFnZV91cmw6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBTdHJpbmcsCiAgICAvLyAgICAgc25hcHNob3RfcHVibGljX2tleTogQnl0ZXMsCiAgICAvLyAgICAgbWV0YWRhdGFfaXBmc19jaWQ6IFN0cmluZywKICAgIC8vICAgICBzdGFydF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgZW5kX3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICAgICBxdW9ydW06IFVJbnQ2NCwKICAgIC8vICAgICBuZnRfaW1hZ2VfdXJsOiBTdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzAKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjczCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgZnJhbWVfZGlnIC04CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NAogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5ID0gc25hcHNob3RfcHVibGljX2tleQogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGZyYW1lX2RpZyAtNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzUKICAgIC8vIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgPSBtZXRhZGF0YV9pcGZzX2NpZAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBmcmFtZV9kaWcgLTYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc2CiAgICAvLyBzZWxmLnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5lbmRfdGltZSA9IGVuZF90aW1lCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzgKICAgIC8vIHNlbGYucXVvcnVtID0gcXVvcnVtCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gc2VsZi5uZnRfaW1hZ2VfdXJsID0gbmZ0X2ltYWdlX3VybAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgwCiAgICAvLyBzZWxmLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50cy5jb3B5KCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgc3RvcmVfb3B0aW9uX2NvdW50cwogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzdG9yZV9vcHRpb25fY291bnRzOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTctMjE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN0b3JlX29wdGlvbl9jb3VudHMoc2VsZiwgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXkpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE5CiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGgsICJvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBhc3NlcnQgLy8gb3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoIDw9IDExMiwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDExMiBxdWVzdGlvbnMiCiAgICBwdXNoaW50IDExMiAvLyAxMTIKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjIKICAgIC8vIHRvdGFsX29wdGlvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjMKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjI0CiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0ubmF0aXZlCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxCgpzdG9yZV9vcHRpb25fY291bnRzX2FmdGVyX2ZvckA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIGFzc2VydCB0b3RhbF9vcHRpb25zIDw9IDEyOCwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDEyOCB2b3RlIG9wdGlvbnMiCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBwdXNoaW50IDEyOCAvLyAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjcKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjgKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmJvb3RzdHJhcChmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODItODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmLCBmdW5kX21pbl9iYWxfcmVxOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmlzX2Jvb3RzdHJhcHBlZCwgIk11c3Qgbm90IGJlIGFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODUKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkID0gVHJ1ZQogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg4CiAgICAvLyBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Ny04OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkxCiAgICAvLyB0YWxseV9ib3hfc2l6ZSA9IHNlbGYudG90YWxfb3B0aW9ucyAqIFZPVEVfQ09VTlRfQllURVMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfb3B0aW9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9vcHRpb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTAxLTEwMgogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDAKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMjAzOTAwIC8vIDIwMzkwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDIKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDQKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDYKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNS0xMDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA4CiAgICAvLyBhc3NlcnQgc2VsZi50YWxseV9ib3guY3JlYXRlKHNpemU9dGFsbHlfYm94X3NpemUpCiAgICBieXRlYyA0IC8vICJWIgogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsb3NlKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMC0xMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMgogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAyMDAwMCAvLyAyMDAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jbG9zZV90aW1lLCAiQWxyZWFkeSBjbG9zZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGNsb3NlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQKICAgIC8vIHNlbGYuY2xvc2VfdGltZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE5CiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgcHVzaGJ5dGVzICJ7XCJzdGFuZGFyZFwiOlwiYXJjNjlcIixcImRlc2NyaXB0aW9uXCI6XCJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjAKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIHB1c2hieXRlcyAiLlwiLFwicHJvcGVydGllc1wiOntcIm1ldGFkYXRhXCI6XCJpcGZzOi8vIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTIwCiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMQogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjEKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjIKICAgIC8vICsgJyIsImlkIjoiJwogICAgcHVzaGJ5dGVzICJcIixcImlkXCI6XCIiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjIKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVfaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjMKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgcHVzaGJ5dGVzICJcIixcInF1b3J1bVwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI1CiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInF1b3J1bSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5xdW9ydW0gZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI2CiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIHB1c2hieXRlcyAiLFwidm90ZXJDb3VudFwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjcKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZvdGVyX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVyX2NvdW50IGV4aXN0cwogICAgY2FsbHN1YiBpdG9hCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjcKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjgKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIHB1c2hieXRlcyAiLFwidGFsbGllc1wiOlsiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjgKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzEKICAgIC8vIGN1cnJlbnRfaW5kZXggPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMgogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4LCBxdWVzdGlvbl9vcHRpb25zIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCmNsb3NlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2RpZyA4CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTQKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDkKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMwogICAgLy8gaWYgcXVlc3Rpb25faW5kZXggPiAwOgogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNAogICAgLy8gbm90ZSArPSAiLCIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIiwiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNQogICAgLy8gaWYgcXVlc3Rpb25fb3B0aW9ucyA+IDA6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI+CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM2CiAgICAvLyBub3RlICs9ICJbIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiWyIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDEKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKY2xvc2VfZm9yX2hlYWRlckA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzcKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMubmF0aXZlKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOAogICAgLy8gaWYgb3B0aW9uX2luZGV4ID4gMDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM5CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDk6CiAgICBmcmFtZV9kaWcgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDAKICAgIC8vIHZvdGVzX2Zvcl9vcHRpb24gPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGN1cnJlbnRfaW5kZXgpCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MQogICAgLy8gbm90ZSArPSBpdG9hKHZvdGVzX2Zvcl9vcHRpb24pCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MgogICAgLy8gY3VycmVudF9pbmRleCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgY2xvc2VfZm9yX2hlYWRlckA2CgpjbG9zZV9hZnRlcl9mb3JAMTE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MwogICAgLy8gbm90ZSArPSAiXSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl0iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2RpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA5CiAgICBiIGNsb3NlX2Zvcl9oZWFkZXJAMQoKY2xvc2VfYWZ0ZXJfZm9yQDE0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQKICAgIC8vIG5vdGUgKz0gIl19fSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl19fSIKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYtMTU2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MAogICAgLy8gYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIHB1c2hieXRlcyAiW1ZPVEUgUkVTVUxUXSAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUyCiAgICAvLyB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJuZnRfaW1hZ2VfdXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5mdF9pbWFnZV91cmwgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTEKICAgIC8vIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgcHVzaGJ5dGVzICJWT1RFUlNMVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ5CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDgKICAgIC8vIGRlY2ltYWxzPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NwogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgcHVzaGJ5dGVzICJuZnRfYXNzZXRfaWQiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTcKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldC5pZAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUtMTU4CiAgICAvLyBzZWxmLm5mdF9hc3NldF9pZCA9ICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICB0b3RhbD0xLAogICAgLy8gICAgICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hc3NldC5pZAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuaXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDktMjUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUzCiAgICAvLyBpZiBpIDwgcmFkaXg6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIDwKICAgIGJ6IGl0b2FfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTQKICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaV0pCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgcmV0c3ViCgppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnRjXzIgLy8gMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAlCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjIDEzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmdldF92b3RlX2Zyb21fYm94KGluZGV4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0X3ZvdGVfZnJvbV9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzOS0yNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3ZvdGVfZnJvbV9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MQogICAgLy8gcmV0dXJuIG9wLmJ0b2koc2VsZi50YWxseV9ib3guZXh0cmFjdChpbmRleCwgVk9URV9DT1VOVF9CWVRFUykpCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ByZWNvbmRpdGlvbnMoc2lnbmF0dXJlOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wcmVjb25kaXRpb25zOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcHJlY29uZGl0aW9ucyhzZWxmLCBzaWduYXR1cmU6IEJ5dGVzKSAtPiBWb3RpbmdQcmVjb25kaXRpb25zOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MwogICAgLy8gaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY0CiAgICAvLyBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWxsb3dlZF90b192b3RlCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NQogICAgLy8gaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NgogICAgLy8gY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYyLTE2NwogICAgLy8gcmV0dXJuIFZvdGluZ1ByZWNvbmRpdGlvbnMoCiAgICAvLyAgICAgaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIC8vICAgICBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICAvLyAgICAgaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgLy8gICAgIGN1cnJlbnRfdGltZT1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGluZ19vcGVuKCkgLT4gdWludDY0Ogp2b3Rpbmdfb3BlbjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA1LTIwNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2b3Rpbmdfb3BlbihzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwOC0yMTAKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA5CiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMAogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAic3RhcnRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFydF90aW1lIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIDw9CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lbmRfdGltZSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQogICAgYiB2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDYKCnZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCgp2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNy0yMTEKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vICAgICBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gICAgIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlOiBieXRlcykgLT4gdWludDY0OgphbGxvd2VkX3RvX3ZvdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMC0yMzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsb3dlZF90b192b3RlKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDApCiAgICBwdXNoaW50IDIwMDAgLy8gMjAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzQKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNgogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc25hcHNob3RfcHVibGljX2tleSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMzLTIzNwogICAgLy8gcmV0dXJuIG9wLmVkMjU1MTl2ZXJpZnlfYmFyZSgKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzLAogICAgLy8gICAgIHNpZ25hdHVyZSwKICAgIC8vICAgICBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbHJlYWR5X3ZvdGVkKCkgLT4gdWludDY0OgphbHJlYWR5X3ZvdGVkOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFscmVhZHlfdm90ZWQoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTUKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyIGluIHNlbGYudm90ZXNfYnlfYWNjb3VudAogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGUoZnVuZF9taW5fYmFsX3JlcTogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzLCBhbnN3ZXJfaWRzOiBieXRlcykgLT4gdm9pZDoKdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdm90ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHNpZ25hdHVyZTogQnl0ZXMsCiAgICAvLyAgICAgYW5zd2VyX2lkczogVm90ZUluZGV4QXJyYXksCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDc3MDAsIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzcwMCAvLyA3NzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3Ny0xNzgKICAgIC8vICMgQ2hlY2sgdm90aW5nIHByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpLCAiTm90IGFsbG93ZWQgdG8gdm90ZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGFzc2VydCAvLyBOb3QgYWxsb3dlZCB0byB2b3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IHNlbGYudm90aW5nX29wZW4oKSwgIlZvdGluZyBub3Qgb3BlbiIKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGFzc2VydCAvLyBWb3Rpbmcgbm90IG9wZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWxyZWFkeV92b3RlZCgpLCAiQWxyZWFkeSB2b3RlZCIKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgdm90ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgxCiAgICAvLyBxdWVzdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgyCiAgICAvLyBhc3NlcnQgYW5zd2VyX2lkcy5sZW5ndGggPT0gcXVlc3Rpb25zX2NvdW50LCAiTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgICsKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg0CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBwdXNoaW50IDI1MDAgLy8gMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg2CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4Ny0xODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTEKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MgogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGR1cAoKdm90ZV9mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5Ni0xOTcKICAgIC8vICMgTG9hZCB0aGUgdXNlcidzIHZvdGUgZm9yIHRoaXMgcXVlc3Rpb24KICAgIC8vIGFuc3dlcl9vcHRpb25faW5kZXggPSBhbnN3ZXJfaWRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk4CiAgICAvLyBvcHRpb25zX2NvdW50ID0gc2VsZi5vcHRpb25fY291bnRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk5CiAgICAvLyBhc3NlcnQgYW5zd2VyX29wdGlvbl9pbmRleCA8IG9wdGlvbnNfY291bnQsICJBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQiCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMAogICAgLy8gc2VsZi5pbmNyZW1lbnRfdm90ZV9pbl9ib3goY3VtdWxhdGl2ZV9vZmZzZXQgKyBhbnN3ZXJfb3B0aW9uX2luZGV4KQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgdW5jb3ZlciAzCiAgICArCiAgICBjYWxsc3ViIGluY3JlbWVudF92b3RlX2luX2JveAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDEKICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9wdGlvbnNfY291bnQKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDIKICAgIC8vIHNlbGYudm90ZXNfYnlfYWNjb3VudFtUeG4uc2VuZGVyXSA9IGFuc3dlcl9pZHMuY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMwogICAgLy8gc2VsZi52b3Rlcl9jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogdWludDY0KSAtPiB2b2lkOgppbmNyZW1lbnRfdm90ZV9pbl9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5jcmVtZW50X3ZvdGVfaW5fYm94KHNlbGYsIGluZGV4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ1CiAgICAvLyBjdXJyZW50X3ZvdGUgPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGluZGV4KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NgogICAgLy8gc2VsZi50YWxseV9ib3gucmVwbGFjZShpbmRleCwgb3AuaXRvYihjdXJyZW50X3ZvdGUgKyAxKSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/examples/voting/out/VotingRoundApp.arc56.json b/examples/voting/out/VotingRoundApp.arc56.json new file mode 100644 index 0000000000..62932282bc --- /dev/null +++ b/examples/voting/out/VotingRoundApp.arc56.json @@ -0,0 +1,495 @@ +{ + "name": "VotingRoundApp", + "structs": { + "VotingPreconditions": [ + { + "name": "is_voting_open", + "type": "uint64" + }, + { + "name": "is_allowed_to_vote", + "type": "uint64" + }, + { + "name": "has_already_voted", + "type": "uint64" + }, + { + "name": "current_time", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "string", + "name": "vote_id" + }, + { + "type": "byte[]", + "name": "snapshot_public_key" + }, + { + "type": "string", + "name": "metadata_ipfs_cid" + }, + { + "type": "uint64", + "name": "start_time" + }, + { + "type": "uint64", + "name": "end_time" + }, + { + "type": "uint8[]", + "name": "option_counts" + }, + { + "type": "uint64", + "name": "quorum" + }, + { + "type": "string", + "name": "nft_image_url" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "bootstrap", + "args": [ + { + "type": "pay", + "name": "fund_min_bal_req" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "close", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_preconditions", + "args": [ + { + "type": "byte[]", + "name": "signature" + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64)", + "struct": "VotingPreconditions" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "vote", + "args": [ + { + "type": "pay", + "name": "fund_min_bal_req" + }, + { + "type": "byte[]", + "name": "signature" + }, + { + "type": "uint8[]", + "name": "answer_ids" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 8, + "bytes": 5 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "is_bootstrapped": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNfYm9vdHN0cmFwcGVk" + }, + "voter_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dm90ZXJfY291bnQ=" + }, + "close_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2xvc2VfdGltZQ==" + }, + "vote_id": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "dm90ZV9pZA==" + }, + "snapshot_public_key": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "c25hcHNob3RfcHVibGljX2tleQ==" + }, + "metadata_ipfs_cid": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "bWV0YWRhdGFfaXBmc19jaWQ=" + }, + "start_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhcnRfdGltZQ==" + }, + "end_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZW5kX3RpbWU=" + }, + "quorum": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cXVvcnVt" + }, + "nft_image_url": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "bmZ0X2ltYWdlX3VybA==" + }, + "nft_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bmZ0X2Fzc2V0X2lk" + }, + "option_counts": { + "keyType": "AVMString", + "valueType": "uint8[]", + "key": "b3B0aW9uX2NvdW50cw==" + }, + "total_options": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfb3B0aW9ucw==" + } + }, + "local": {}, + "box": { + "tally_box": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Vg==" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "votes_by_account": { + "keyType": "AVMBytes", + "valueType": "uint8[]", + "prefix": "" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 602 + ], + "errorMessage": "Already closed" + }, + { + "pc": [ + 1282 + ], + "errorMessage": "Already voted" + }, + { + "pc": [ + 1364 + ], + "errorMessage": "Answer option index invalid" + }, + { + "pc": [ + 469 + ], + "errorMessage": "Can't have more than 112 questions" + }, + { + "pc": [ + 512 + ], + "errorMessage": "Can't have more than 128 vote options" + }, + { + "pc": [ + 408 + ], + "errorMessage": "End time should be after start time" + }, + { + "pc": [ + 414 + ], + "errorMessage": "End time should be in the future" + }, + { + "pc": [ + 534 + ], + "errorMessage": "Must not be already bootstrapped" + }, + { + "pc": [ + 1273 + ], + "errorMessage": "Not allowed to vote" + }, + { + "pc": [ + 1298 + ], + "errorMessage": "Number of answers incorrect" + }, + { + "pc": [ + 257, + 309, + 331, + 343, + 370 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 571 + ], + "errorMessage": "Payment must be for the exact min balance requirement" + }, + { + "pc": [ + 1326 + ], + "errorMessage": "Payment must be the exact min balance" + }, + { + "pc": [ + 545, + 1317 + ], + "errorMessage": "Payment must be to app address" + }, + { + "pc": [ + 1277 + ], + "errorMessage": "Voting not open" + }, + { + "pc": [ + 261 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 312, + 334, + 346, + 373 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1213 + ], + "errorMessage": "check self.end_time exists" + }, + { + "pc": [ + 532, + 1182 + ], + "errorMessage": "check self.is_bootstrapped exists" + }, + { + "pc": [ + 747 + ], + "errorMessage": "check self.metadata_ipfs_cid exists" + }, + { + "pc": [ + 1034 + ], + "errorMessage": "check self.nft_image_url exists" + }, + { + "pc": [ + 836, + 1286, + 1353 + ], + "errorMessage": "check self.option_counts exists" + }, + { + "pc": [ + 783 + ], + "errorMessage": "check self.quorum exists" + }, + { + "pc": [ + 1243 + ], + "errorMessage": "check self.snapshot_public_key exists" + }, + { + "pc": [ + 1199 + ], + "errorMessage": "check self.start_time exists" + }, + { + "pc": [ + 550 + ], + "errorMessage": "check self.total_options exists" + }, + { + "pc": [ + 611, + 763, + 1011 + ], + "errorMessage": "check self.vote_id exists" + }, + { + "pc": [ + 808, + 1388 + ], + "errorMessage": "check self.voter_count exists" + }, + { + "pc": [ + 465 + ], + "errorMessage": "option_counts should be non-empty" + }, + { + "pc": [ + 322, + 383 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9yb3V0ZUA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdm90ZV9yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB2b3RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNyZWF0ZSh2b3RlX2lkOiBieXRlcywgc25hcHNob3RfcHVibGljX2tleTogYnl0ZXMsIG1ldGFkYXRhX2lwZnNfY2lkOiBieXRlcywgc3RhcnRfdGltZTogdWludDY0LCBlbmRfdGltZTogdWludDY0LCBvcHRpb25fY291bnRzOiBieXRlcywgcXVvcnVtOiB1aW50NjQsIG5mdF9pbWFnZV91cmw6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBTdHJpbmcsCiAgICAvLyAgICAgc25hcHNob3RfcHVibGljX2tleTogQnl0ZXMsCiAgICAvLyAgICAgbWV0YWRhdGFfaXBmc19jaWQ6IFN0cmluZywKICAgIC8vICAgICBzdGFydF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgZW5kX3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICAgICBxdW9ydW06IFVJbnQ2NCwKICAgIC8vICAgICBuZnRfaW1hZ2VfdXJsOiBTdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzAKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjczCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgZnJhbWVfZGlnIC04CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NAogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5ID0gc25hcHNob3RfcHVibGljX2tleQogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGZyYW1lX2RpZyAtNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzUKICAgIC8vIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgPSBtZXRhZGF0YV9pcGZzX2NpZAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBmcmFtZV9kaWcgLTYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc2CiAgICAvLyBzZWxmLnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5lbmRfdGltZSA9IGVuZF90aW1lCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzgKICAgIC8vIHNlbGYucXVvcnVtID0gcXVvcnVtCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gc2VsZi5uZnRfaW1hZ2VfdXJsID0gbmZ0X2ltYWdlX3VybAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgwCiAgICAvLyBzZWxmLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50cy5jb3B5KCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgc3RvcmVfb3B0aW9uX2NvdW50cwogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzdG9yZV9vcHRpb25fY291bnRzOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTctMjE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN0b3JlX29wdGlvbl9jb3VudHMoc2VsZiwgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXkpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE5CiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGgsICJvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBhc3NlcnQgLy8gb3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoIDw9IDExMiwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDExMiBxdWVzdGlvbnMiCiAgICBwdXNoaW50IDExMiAvLyAxMTIKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjIKICAgIC8vIHRvdGFsX29wdGlvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjMKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjI0CiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0ubmF0aXZlCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxCgpzdG9yZV9vcHRpb25fY291bnRzX2FmdGVyX2ZvckA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIGFzc2VydCB0b3RhbF9vcHRpb25zIDw9IDEyOCwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDEyOCB2b3RlIG9wdGlvbnMiCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBwdXNoaW50IDEyOCAvLyAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjcKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjgKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmJvb3RzdHJhcChmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODItODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmLCBmdW5kX21pbl9iYWxfcmVxOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmlzX2Jvb3RzdHJhcHBlZCwgIk11c3Qgbm90IGJlIGFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODUKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkID0gVHJ1ZQogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg4CiAgICAvLyBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Ny04OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkxCiAgICAvLyB0YWxseV9ib3hfc2l6ZSA9IHNlbGYudG90YWxfb3B0aW9ucyAqIFZPVEVfQ09VTlRfQllURVMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfb3B0aW9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9vcHRpb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTAxLTEwMgogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDAKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMjAzOTAwIC8vIDIwMzkwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDIKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDQKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDYKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNS0xMDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA4CiAgICAvLyBhc3NlcnQgc2VsZi50YWxseV9ib3guY3JlYXRlKHNpemU9dGFsbHlfYm94X3NpemUpCiAgICBieXRlYyA0IC8vICJWIgogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsb3NlKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMC0xMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMgogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAyMDAwMCAvLyAyMDAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jbG9zZV90aW1lLCAiQWxyZWFkeSBjbG9zZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGNsb3NlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQKICAgIC8vIHNlbGYuY2xvc2VfdGltZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE5CiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgcHVzaGJ5dGVzICJ7XCJzdGFuZGFyZFwiOlwiYXJjNjlcIixcImRlc2NyaXB0aW9uXCI6XCJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjAKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIHB1c2hieXRlcyAiLlwiLFwicHJvcGVydGllc1wiOntcIm1ldGFkYXRhXCI6XCJpcGZzOi8vIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTIwCiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMQogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjEKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjIKICAgIC8vICsgJyIsImlkIjoiJwogICAgcHVzaGJ5dGVzICJcIixcImlkXCI6XCIiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjIKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVfaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjMKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgcHVzaGJ5dGVzICJcIixcInF1b3J1bVwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI1CiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInF1b3J1bSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5xdW9ydW0gZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI2CiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIHB1c2hieXRlcyAiLFwidm90ZXJDb3VudFwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjcKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZvdGVyX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVyX2NvdW50IGV4aXN0cwogICAgY2FsbHN1YiBpdG9hCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjcKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjgKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIHB1c2hieXRlcyAiLFwidGFsbGllc1wiOlsiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjgKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzEKICAgIC8vIGN1cnJlbnRfaW5kZXggPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMgogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4LCBxdWVzdGlvbl9vcHRpb25zIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCmNsb3NlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2RpZyA4CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTQKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDkKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMwogICAgLy8gaWYgcXVlc3Rpb25faW5kZXggPiAwOgogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNAogICAgLy8gbm90ZSArPSAiLCIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIiwiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNQogICAgLy8gaWYgcXVlc3Rpb25fb3B0aW9ucyA+IDA6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI+CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM2CiAgICAvLyBub3RlICs9ICJbIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiWyIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDEKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKY2xvc2VfZm9yX2hlYWRlckA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzcKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMubmF0aXZlKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOAogICAgLy8gaWYgb3B0aW9uX2luZGV4ID4gMDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM5CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDk6CiAgICBmcmFtZV9kaWcgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDAKICAgIC8vIHZvdGVzX2Zvcl9vcHRpb24gPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGN1cnJlbnRfaW5kZXgpCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MQogICAgLy8gbm90ZSArPSBpdG9hKHZvdGVzX2Zvcl9vcHRpb24pCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MgogICAgLy8gY3VycmVudF9pbmRleCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgY2xvc2VfZm9yX2hlYWRlckA2CgpjbG9zZV9hZnRlcl9mb3JAMTE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MwogICAgLy8gbm90ZSArPSAiXSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl0iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2RpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA5CiAgICBiIGNsb3NlX2Zvcl9oZWFkZXJAMQoKY2xvc2VfYWZ0ZXJfZm9yQDE0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQKICAgIC8vIG5vdGUgKz0gIl19fSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl19fSIKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYtMTU2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MAogICAgLy8gYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIHB1c2hieXRlcyAiW1ZPVEUgUkVTVUxUXSAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUyCiAgICAvLyB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJuZnRfaW1hZ2VfdXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5mdF9pbWFnZV91cmwgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTEKICAgIC8vIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgcHVzaGJ5dGVzICJWT1RFUlNMVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ5CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDgKICAgIC8vIGRlY2ltYWxzPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NwogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgcHVzaGJ5dGVzICJuZnRfYXNzZXRfaWQiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTcKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldC5pZAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUtMTU4CiAgICAvLyBzZWxmLm5mdF9hc3NldF9pZCA9ICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICB0b3RhbD0xLAogICAgLy8gICAgICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hc3NldC5pZAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuaXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDktMjUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUzCiAgICAvLyBpZiBpIDwgcmFkaXg6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIDwKICAgIGJ6IGl0b2FfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTQKICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaV0pCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgcmV0c3ViCgppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnRjXzIgLy8gMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAlCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjIDEzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmdldF92b3RlX2Zyb21fYm94KGluZGV4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0X3ZvdGVfZnJvbV9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzOS0yNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3ZvdGVfZnJvbV9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MQogICAgLy8gcmV0dXJuIG9wLmJ0b2koc2VsZi50YWxseV9ib3guZXh0cmFjdChpbmRleCwgVk9URV9DT1VOVF9CWVRFUykpCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ByZWNvbmRpdGlvbnMoc2lnbmF0dXJlOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wcmVjb25kaXRpb25zOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcHJlY29uZGl0aW9ucyhzZWxmLCBzaWduYXR1cmU6IEJ5dGVzKSAtPiBWb3RpbmdQcmVjb25kaXRpb25zOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MwogICAgLy8gaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY0CiAgICAvLyBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWxsb3dlZF90b192b3RlCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NQogICAgLy8gaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NgogICAgLy8gY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYyLTE2NwogICAgLy8gcmV0dXJuIFZvdGluZ1ByZWNvbmRpdGlvbnMoCiAgICAvLyAgICAgaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIC8vICAgICBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICAvLyAgICAgaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgLy8gICAgIGN1cnJlbnRfdGltZT1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGluZ19vcGVuKCkgLT4gdWludDY0Ogp2b3Rpbmdfb3BlbjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA1LTIwNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2b3Rpbmdfb3BlbihzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwOC0yMTAKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA5CiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMAogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAic3RhcnRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFydF90aW1lIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIDw9CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lbmRfdGltZSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQogICAgYiB2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDYKCnZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCgp2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNy0yMTEKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vICAgICBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gICAgIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlOiBieXRlcykgLT4gdWludDY0OgphbGxvd2VkX3RvX3ZvdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMC0yMzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsb3dlZF90b192b3RlKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDApCiAgICBwdXNoaW50IDIwMDAgLy8gMjAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzQKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNgogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc25hcHNob3RfcHVibGljX2tleSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMzLTIzNwogICAgLy8gcmV0dXJuIG9wLmVkMjU1MTl2ZXJpZnlfYmFyZSgKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzLAogICAgLy8gICAgIHNpZ25hdHVyZSwKICAgIC8vICAgICBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbHJlYWR5X3ZvdGVkKCkgLT4gdWludDY0OgphbHJlYWR5X3ZvdGVkOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFscmVhZHlfdm90ZWQoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTUKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyIGluIHNlbGYudm90ZXNfYnlfYWNjb3VudAogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGUoZnVuZF9taW5fYmFsX3JlcTogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzLCBhbnN3ZXJfaWRzOiBieXRlcykgLT4gdm9pZDoKdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdm90ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHNpZ25hdHVyZTogQnl0ZXMsCiAgICAvLyAgICAgYW5zd2VyX2lkczogVm90ZUluZGV4QXJyYXksCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDc3MDAsIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzcwMCAvLyA3NzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3Ny0xNzgKICAgIC8vICMgQ2hlY2sgdm90aW5nIHByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpLCAiTm90IGFsbG93ZWQgdG8gdm90ZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGFzc2VydCAvLyBOb3QgYWxsb3dlZCB0byB2b3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IHNlbGYudm90aW5nX29wZW4oKSwgIlZvdGluZyBub3Qgb3BlbiIKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGFzc2VydCAvLyBWb3Rpbmcgbm90IG9wZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWxyZWFkeV92b3RlZCgpLCAiQWxyZWFkeSB2b3RlZCIKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgdm90ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgxCiAgICAvLyBxdWVzdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgyCiAgICAvLyBhc3NlcnQgYW5zd2VyX2lkcy5sZW5ndGggPT0gcXVlc3Rpb25zX2NvdW50LCAiTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgICsKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg0CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBwdXNoaW50IDI1MDAgLy8gMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg2CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4Ny0xODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTEKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MgogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGR1cAoKdm90ZV9mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5Ni0xOTcKICAgIC8vICMgTG9hZCB0aGUgdXNlcidzIHZvdGUgZm9yIHRoaXMgcXVlc3Rpb24KICAgIC8vIGFuc3dlcl9vcHRpb25faW5kZXggPSBhbnN3ZXJfaWRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk4CiAgICAvLyBvcHRpb25zX2NvdW50ID0gc2VsZi5vcHRpb25fY291bnRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk5CiAgICAvLyBhc3NlcnQgYW5zd2VyX29wdGlvbl9pbmRleCA8IG9wdGlvbnNfY291bnQsICJBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQiCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMAogICAgLy8gc2VsZi5pbmNyZW1lbnRfdm90ZV9pbl9ib3goY3VtdWxhdGl2ZV9vZmZzZXQgKyBhbnN3ZXJfb3B0aW9uX2luZGV4KQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgdW5jb3ZlciAzCiAgICArCiAgICBjYWxsc3ViIGluY3JlbWVudF92b3RlX2luX2JveAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDEKICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9wdGlvbnNfY291bnQKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDIKICAgIC8vIHNlbGYudm90ZXNfYnlfYWNjb3VudFtUeG4uc2VuZGVyXSA9IGFuc3dlcl9pZHMuY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMwogICAgLy8gc2VsZi52b3Rlcl9jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogdWludDY0KSAtPiB2b2lkOgppbmNyZW1lbnRfdm90ZV9pbl9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5jcmVtZW50X3ZvdGVfaW5fYm94KHNlbGYsIGluZGV4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ1CiAgICAvLyBjdXJyZW50X3ZvdGUgPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGluZGV4KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NgogICAgLy8gc2VsZi50YWxseV9ib3gucmVwbGFjZShpbmRleCwgb3AuaXRvYihjdXJyZW50X3ZvdGUgKyAxKSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEKCCYPD2lzX2Jvb3RzdHJhcHBlZAt2b3Rlcl9jb3VudAd2b3RlX2lkDW9wdGlvbl9jb3VudHMBVgpjbG9zZV90aW1lE3NuYXBzaG90X3B1YmxpY19rZXkRbWV0YWRhdGFfaXBmc19jaWQKc3RhcnRfdGltZQhlbmRfdGltZQZxdW9ydW0NbmZ0X2ltYWdlX3VybA10b3RhbF9vcHRpb25zCjAxMjM0NTY3ODkDBoEBMRhAAAOIAASIAAtDigAAKCJnKSJniYoAATEbQQC8ggUErol/awSk6NFkBJZWBHoEvLFYlgSEpTxuNhoAjgUAAgA2AEwAWABzIokxGRREMRgURDYaAVcCADYaAlcCADYaA1cCADYaBBc2GgUXNhoGNhoHFzYaCFcCAIgAYCOJMRkURDEYRDEWIwlJOBAjEkSIAMgjiTEZFEQxGESIAPAjiTEZFEQxGEQ2GgFXAgCIAxOABBUffHVMULAjiTEZFEQxGEQxFiMJSTgQIxJENhoBVwIANhoCiANeI4kiiYoIAIv7i/wMRIv8MgcPRCqL+GcnBov5ZycHi/pnJwiL+2cnCYv8ZycKi/5nJwuL/2eL/YgAAkiJigEBi/8iWUcCRIFwDkQiSYsCiwAMQQAZi/9XAgCLAklOAiNYF4sBCIwBIwiMAkL/34sBSYGAAQ5EK4v/ZycMTGeL/4wAiYoBACIoZUQURCgjZ4v/OAcyChJEIicMZUQlC0mBkAMLgfy4DAhJFrCL/zgIEkQnBEy5RImKAAAiSYAARwKBoJwBIogDOiInBWVFARREJwUyB2ciKmVEgFh7InN0YW5kYXJkIjoiYXJjNjkiLCJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgTFCAJC4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovL1AiJwdlRFCACCIsImlkIjoiUCIqZURQgAsiLCJxdW9ydW0iOlAiJwplRIgBLlCADiwidm90ZXJDb3VudCI6UCIpZUSIARVQgAwsInRhbGxpZXMiOltQIkkrZUxJTwJEIlkiiwmLCAxBAJWLB1cCAIsJSU4CI1iMAYsFjABBAAiLBYABLFCMAIsASYwFiwGAAQCliwaMAkyMAEEAUosFgAFbUIwFiwEXjAQijAOLA4sEDEEALosFjACLA0EACIsFgAEsUIwAiwCLBklOAogAt4gAiVCMBSMIjAaLAyMIjANC/8qLBYABXVCLBowCjACLAowGiwCMBYsJIwiMCUL/Y4sFgANdfX1QsTIAIiplRIAOW1ZPVEUgUkVTVUxUXSBMUCInC2VETwOyBbIngAhWT1RFUlNMVLIlsiYisiQisiMjsiKBA7IQsgGzgAxuZnRfYXNzZXRfaWS0PGeJigEBi/8kDEEADIv/IwgnDYv/TwJSiYv/JAqI/+OL/yQYSSMIJw1OAlJQiYoBAScEi/8luheJigEBiAAZFov/iABIFogAWhYyBxZPA08DUE8CUExQiYoAAYAAIihlREEAJiInBWVFAUAAHSInCGVEMgdJjAAOQQAPIicJZUSLAA9BAAQjQgABIkyJigEBgdAPIogAuDEAIicGZUSL/0yEiYoAATEAvUUBiYoDAIGUPCKIAJmL/oj/0kSI/5lEiP/gFEQiK2VEIllJi/8iWUlPAhJEgSIIgZADC4HEEwiL/TgHMgoSREkWsIv9OAgSRCJJiwKLAAxBAECL/1cCAIsCSU4CI1gXIitlRFcCAEsCI1gXSgxEiwFJTwMIiAAcCIwBMQBJvEiL/78iKWVEIwgpTGcjCIwCQv+4iYoBAIv/iP7qIwgWJwSL/08Cu4mKAgCL/iQIiwAyDA1BACqxgQayEIEFshknDrIeJw6yH4v/jQIAAwAJQgAKIrIBQgAEMgCyAbNC/86J", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/examples/voting/out/VotingRoundApp.destructured.ir b/examples/voting/out/VotingRoundApp.destructured.ir index 9738284368..8d939f84e9 100644 --- a/examples/voting/out/VotingRoundApp.destructured.ir +++ b/examples/voting/out/VotingRoundApp.destructured.ir @@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (! tmp%31#0) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) - (assert tmp%33#0) // is not creating + (assert tmp%33#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (! tmp%39#0) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/out/VotingRoundApp.ssa.ir b/examples/voting/out/VotingRoundApp.ssa.ir index bfef64a81a..f2cce53732 100644 --- a/examples/voting/out/VotingRoundApp.ssa.ir +++ b/examples/voting/out/VotingRoundApp.ssa.ir @@ -28,10 +28,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -52,10 +52,10 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -66,19 +66,19 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 NoOp) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (== tmp%31#0 NoOp) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (!= tmp%33#0 0u) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -88,10 +88,10 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (== tmp%39#0 NoOp) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) let tmp%42#0: bool = (!= tmp%41#0 0u) - (assert tmp%42#0) // is not creating + (assert tmp%42#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir index eaff42d5cd..02efa8d6b8 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir @@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (! tmp%31#0) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) - (assert tmp%33#0) // is not creating + (assert tmp%33#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (! tmp%39#0) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir index 47afb93cd6..d1f91a0494 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir @@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (! tmp%31#0) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) - (assert tmp%33#0) // is not creating + (assert tmp%33#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (! tmp%39#0) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/out_O2/VotingRoundApp.approval.teal b/examples/voting/out_O2/VotingRoundApp.approval.teal index 5481ece2a3..5240d8a732 100644 --- a/examples/voting/out_O2/VotingRoundApp.approval.teal +++ b/examples/voting/out_O2/VotingRoundApp.approval.teal @@ -38,10 +38,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -64,9 +64,9 @@ __puya_arc4_router___create_route@2: __puya_arc4_router___bootstrap_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - @@ -82,9 +82,9 @@ __puya_arc4_router___bootstrap_route@3: __puya_arc4_router___close_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub close intc_1 // 1 retsub @@ -92,9 +92,9 @@ __puya_arc4_router___close_route@4: __puya_arc4_router___get_preconditions_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub get_preconditions @@ -108,9 +108,9 @@ __puya_arc4_router___get_preconditions_route@5: __puya_arc4_router___vote_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_1 // 1 - diff --git a/examples/voting/out_O2/VotingRoundApp.destructured.ir b/examples/voting/out_O2/VotingRoundApp.destructured.ir index 9738284368..8d939f84e9 100644 --- a/examples/voting/out_O2/VotingRoundApp.destructured.ir +++ b/examples/voting/out_O2/VotingRoundApp.destructured.ir @@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (! tmp%31#0) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) - (assert tmp%33#0) // is not creating + (assert tmp%33#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (! tmp%39#0) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal index af54f8d3ad..28dd8b2c04 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal +++ b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal @@ -56,11 +56,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 @@ -98,11 +98,11 @@ __puya_arc4_router___bootstrap_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex @@ -125,11 +125,11 @@ __puya_arc4_router___close_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub close intc_1 // 1 retsub @@ -140,11 +140,11 @@ __puya_arc4_router___get_preconditions_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txna ApplicationArgs 1 @@ -165,11 +165,11 @@ __puya_arc4_router___vote_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // voting/voting.py:49 // class VotingRoundApp(ARC4Contract): txn GroupIndex diff --git a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir index 3a67bea71c..0668fdb348 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir +++ b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir @@ -28,10 +28,10 @@ contract examples.voting.voting.VotingRoundApp: block@2: // create_route_L58 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -52,10 +52,10 @@ contract examples.voting.voting.VotingRoundApp: block@3: // bootstrap_route_L82 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -66,19 +66,19 @@ contract examples.voting.voting.VotingRoundApp: block@4: // close_route_L110 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 NoOp) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating examples.voting.voting.VotingRoundApp.close() return 1u block@5: // get_preconditions_route_L160 let tmp%31#0: uint64 = (txn OnCompletion) let tmp%32#0: bool = (== tmp%31#0 NoOp) - (assert tmp%32#0) // OnCompletion is NoOp + (assert tmp%32#0) // OnCompletion is not NoOp let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (!= tmp%33#0 0u) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%35#0: bytes = (txna ApplicationArgs 1) let tmp%36#0: bytes = ((extract 2 0) tmp%35#0) let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0) @@ -88,10 +88,10 @@ contract examples.voting.voting.VotingRoundApp: block@6: // vote_route_L169 let tmp%39#0: uint64 = (txn OnCompletion) let tmp%40#0: bool = (== tmp%39#0 NoOp) - (assert tmp%40#0) // OnCompletion is NoOp + (assert tmp%40#0) // OnCompletion is not NoOp let tmp%41#0: uint64 = (txn ApplicationID) let tmp%42#0: bool = (!= tmp%41#0 0u) - (assert tmp%42#0) // is not creating + (assert tmp%42#0) // can only call when not creating let tmp%43#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) diff --git a/examples/voting/puya.log b/examples/voting/puya.log index 59e69d29f2..aee850c902 100644 --- a/examples/voting/puya.log +++ b/examples/voting/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['voting'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['voting'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing voting/out/module.awst debug: Sealing block@0: // L12 @@ -2049,6 +2049,7 @@ debug: examples.voting.voting.VotingRoundApp.vote f-stack on first store: ['ques debug: _puya_lib.util.ensure_budget f-stack entry: [] debug: _puya_lib.util.ensure_budget f-stack on first store: ['required_budget_with_buffer#0'] info: Writing voting/out/VotingRoundApp.arc32.json +info: Writing voting/out/VotingRoundApp.arc56.json info: Writing voting/out/VotingRoundApp.approval.teal info: Writing voting/out/VotingRoundApp.clear.teal info: Writing voting/out/VotingRoundApp.approval.bin diff --git a/scripts/compile_all_examples.py b/scripts/compile_all_examples.py index 4cc607dcd1..2a8adce0ab 100755 --- a/scripts/compile_all_examples.py +++ b/scripts/compile_all_examples.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import argparse +import json import operator import os import re @@ -235,6 +236,11 @@ def checked_compile( ) bin_files_written = re.findall(r"info: Writing (.+\.bin)", result.stdout) + # normalize ARC-56 output + arc56_files_written = re.findall(r"info: Writing (.+\.arc56\.json)", result.stdout) + for arc56_file in arc56_files_written: + _normalize_arc56(root / arc56_file) + if write_logs: if p.is_dir(): log_path = p / "puya.log" @@ -252,6 +258,15 @@ def checked_compile( ) +def _normalize_arc56(path: Path) -> None: + arc56 = json.loads(path.read_text()) + compiler_version = arc56.get("compilerInfo", {}).get("compilerVersion", {}) + compiler_version["major"] = 99 + compiler_version["minor"] = 99 + compiler_version["patch"] = 99 + path.write_text(json.dumps(arc56, indent=4), encoding="utf8") + + def _load_template_vars(path: Path) -> Iterable[str]: if path.exists(): for line in path.read_text("utf8").splitlines(): @@ -294,6 +309,7 @@ def _compile_for_level(arg: tuple[Path, int]) -> tuple[CompilationResult, int]: "--output-memory-ir", "--output-client", "--output-source-map", + "--output-arc56", ] out_suffix = SUFFIX_O1 write_logs = True diff --git a/src/puya/arc32.py b/src/puya/arc32.py index 5d8f44503a..73f9aa2d2e 100644 --- a/src/puya/arc32.py +++ b/src/puya/arc32.py @@ -10,6 +10,7 @@ ARC4BareMethod, ARC4CreateOption, ARC4MethodConfig, + ARC4Struct, ContractMetaData, ContractState, OnCompletionAction, @@ -39,7 +40,7 @@ def _encode_source(teal_text: str) -> str: def _encode_schema_declaration(state: ContractState) -> JSONDict: return { "type": state.storage_type.name, - "key": state.key.decode("utf-8"), # TODO: support not utf8 keys? + "key": state.key_or_prefix.decode("utf-8"), # TODO: support not utf8 keys? "descr": state.description, } @@ -97,12 +98,12 @@ def _encode_default_arg( return { "source": "global-state", # TODO: handle non utf-8 bytes - "data": state.key.decode("utf-8"), + "data": state.key_or_prefix.decode("utf-8"), } if state := metadata.local_state.get(source): return { "source": "local-state", - "data": state.key.decode("utf-8"), + "data": state.key_or_prefix.decode("utf-8"), } for method in metadata.arc4_methods: if isinstance(method, ARC4ABIMethod) and method.name == source: @@ -115,6 +116,9 @@ def _encode_default_arg( def _encode_arc32_method_hint(metadata: ContractMetaData, method: ARC4ABIMethod) -> JSONDict: + structs = {a.name: metadata.structs[a.struct] for a in method.args if a.struct} + if method.returns.struct: + structs["output"] = metadata.structs[method.returns.struct] return { # deprecated by ARC-22 "read_only": True if method.config.readonly else None, @@ -127,18 +131,18 @@ def _encode_arc32_method_hint(metadata: ContractMetaData, method: ARC4ABIMethod) else None ), "call_config": _encode_call_config(method.config), - "structs": _encode_arc32_method_structs(method), + "structs": _encode_arc32_method_structs(structs), } -def _encode_arc32_method_structs(method: ARC4ABIMethod) -> JSONDict | None: - if len(method.config.structs): +def _encode_arc32_method_structs(structs: Mapping[str, ARC4Struct]) -> JSONDict | None: + if len(structs): return { struct_purpose: { "name": struct_def.name, - "elements": struct_def.elements, + "elements": [[f.name, f.type] for f in struct_def.fields], } - for struct_purpose, struct_def in method.config.structs.items() + for struct_purpose, struct_def in structs.items() } return None diff --git a/src/puya/arc56.py b/src/puya/arc56.py new file mode 100644 index 0000000000..899779dd41 --- /dev/null +++ b/src/puya/arc56.py @@ -0,0 +1,328 @@ +import base64 +import itertools +import typing +from collections import defaultdict +from collections.abc import Iterable, Mapping, Sequence +from importlib.metadata import version as metadata_version + +from cattrs.preconf.json import make_converter +from packaging import version + +from puya import ( + arc56_models as models, + log, +) +from puya.errors import InternalError +from puya.models import ( + ARC4ABIMethod, + ARC4BareMethod, + ARC4CreateOption, + ARC4Struct, + CompiledProgram, + ContractMetaData, + ContractState, + DebugInfo, +) +from puya.utils import unique + +# TODO: use puya once the backend is shipped as separate package +_ALGOPY_VERSION = version.parse(metadata_version("puyapy")) +logger = log.get_logger(__name__) + + +def create_arc56_json( + *, + metadata: ContractMetaData, + approval_program: CompiledProgram, + clear_program: CompiledProgram, + template_prefix: str, +) -> str: + assert approval_program.debug_info is not None + assert clear_program.debug_info is not None + + converter = make_converter(omit_if_default=True) + bare_methods = [m for m in metadata.arc4_methods if isinstance(m, ARC4BareMethod)] + abi_methods = [m for m in metadata.arc4_methods if isinstance(m, ARC4ABIMethod)] + + # use shorter name for structs unless there is a collision + aliases = _StructAliases(metadata.structs.values()) + + schema = metadata.state_totals + app_spec = models.Contract( + arcs=(22, 28), + name=metadata.name, + desc=metadata.description, + networks={}, # TODO: for users to fill in? + structs={ + aliases.resolve(n): [ + models.StructField( + name=e.name, + type=aliases.resolve(e.struct) or e.type, + ) + for e in s.fields + ] + for n, s in metadata.structs.items() + }, + methods=[ + models.Method( + name=m.config.name, + desc=m.desc, + args=[ + models.MethodArg( + type=a.type_, + name=a.name, + desc=a.desc, + struct=aliases.resolve(a.struct), + defaultValue=_encode_default_arg( + metadata, m.config.default_args.get(a.name) + ), + ) + for a in m.args + ], + returns=models.MethodReturns( + type=m.returns.type_, + desc=m.returns.desc, + struct=aliases.resolve(m.returns.struct), + ), + actions=_method_actions(m), + readonly=m.config.readonly, + events=[_struct_to_event(aliases, struct) for struct in m.events], + recommendations=models.MethodRecommendations( + innerTransactionCount=None, # TODO: collect itxn count? + # TODO: users will fill these other ones in? + boxes=None, + accounts=None, + apps=None, + assets=None, + ), + ) + for m in abi_methods + ], + state=models.ContractState( + schema={ + "global": {"ints": schema.global_uints, "bytes": schema.global_bytes}, + "local": {"ints": schema.local_uints, "bytes": schema.local_bytes}, + }, + keys={ + "global": _storage_keys(aliases, metadata.global_state), + "local": _storage_keys(aliases, metadata.local_state), + "box": _storage_keys(aliases, metadata.boxes), + }, + maps={ + # note: at present there is no way of defining global/local maps + "global": _storage_maps(aliases, metadata.global_state), + "local": _storage_maps(aliases, metadata.local_state), + "box": _storage_maps(aliases, metadata.boxes), + }, + ), + bareActions=_combine_actions(list(map(_method_actions, bare_methods))), + sourceInfo={ + "approval": models.ProgramSourceInfo( + sourceInfo=_get_source_info(approval_program.debug_info), + pcOffsetMethod="cblocks" if approval_program.debug_info.op_pc_offset else "none", + ), + "clear": models.ProgramSourceInfo( + sourceInfo=_get_source_info(clear_program.debug_info), + pcOffsetMethod="cblocks" if clear_program.debug_info.op_pc_offset else "none", + ), + }, + source={ + "approval": _encode_str(approval_program.teal_src), + "clear": _encode_str(clear_program.teal_src), + }, + byteCode=( + { + "approval": _encode_bytes(approval_program.bytecode), + "clear": _encode_bytes(clear_program.bytecode), + } + if approval_program.bytecode and clear_program.bytecode + else None + ), + compilerInfo=( + _compiler_info() if approval_program.bytecode and clear_program.bytecode else None + ), + events=[ + _struct_to_event(aliases, struct) + for struct in unique( + e for m in metadata.arc4_methods if isinstance(m, ARC4ABIMethod) for e in m.events + ) + ], + templateVariables={ + name.removeprefix(template_prefix): models.TemplateVariable( + type=aliases.resolve(metadata.template_variable_types[name]), + value=( + _encode_bytes(value.to_bytes(length=8) if isinstance(value, int) else value) + if value is not None + else None + ), + ) + for program in (approval_program, clear_program) + for name, value in program.template_variables.items() + }, + # TODO: provide a way for contracts to declare "public" scratch vars + scratchVariables=None, + ) + return converter.dumps(app_spec, indent=4) + + +def _get_source_info(debug_info: DebugInfo) -> Sequence[models.SourceInfo]: + errors = defaultdict[str, list[int]](list) + for pc, event in debug_info.pc_events.items(): + if error := event.get("error"): + errors[error].append(pc) + return [ + models.SourceInfo( + pc=errors[error], + errorMessage=error, + ) + for error in sorted(errors) + ] + + +class _StructAliases: + def __init__(self, structs: Iterable[ARC4Struct]) -> None: + self.aliases = dict[str, str]() + for struct in structs: + self.aliases[struct.fullname] = ( + struct.fullname + if struct.name in self.aliases or struct.name in models.AVMType + else struct.name + ) + + def resolve[T: str | None](self, struct: T) -> T: + return self.aliases.get(struct, struct) # type: ignore[arg-type, return-value] + + +def _struct_to_event(structs: _StructAliases, struct: ARC4Struct) -> models.Event: + return models.Event( + name=struct.name, + desc=struct.desc, + args=[ + models.EventArg( + name=f.name, + type=f.type, + struct=structs.resolve(f.struct), + ) + for f in struct.fields + ], + ) + + +def _storage_keys( + structs: _StructAliases, state: Mapping[str, ContractState] +) -> models.StorageKeys: + return { + n: models.StorageKey( + desc=m.description, + keyType=structs.resolve(m.arc56_key_type), + valueType=structs.resolve(m.arc56_value_type), + key=_encode_bytes(m.key_or_prefix), + ) + for n, m in state.items() + if not m.is_map + } + + +def _storage_maps( + structs: _StructAliases, state: Mapping[str, ContractState] +) -> models.StorageMaps: + return { + n: models.StorageMap( + desc=m.description, + keyType=structs.resolve(m.arc56_key_type), + valueType=structs.resolve(m.arc56_value_type), + prefix=_encode_bytes(m.key_or_prefix), + ) + for n, m in state.items() + if m.is_map + } + + +def _method_actions(method: ARC4BareMethod | ARC4ABIMethod) -> models.MethodActions: + config = method.config + return models.MethodActions( + create=[ + oca.name + for oca in config.allowed_completion_types + if config.create != ARC4CreateOption.disallow and allowed_create_oca(oca.name) + ], + call=[ + oca.name + for oca in config.allowed_completion_types + if config.create != ARC4CreateOption.require and allowed_call_oca(oca.name) + ], + ) + + +def _encode_default_arg( + metadata: ContractMetaData, source: str | None +) -> models.MethodArgDefaultValue | None: + if source is None: + return None + if (state := metadata.global_state.get(source)) and not state.is_map: + return models.MethodArgDefaultValue( + data=_encode_bytes(state.key_or_prefix), + type=state.arc56_key_type, + source=models.DefaultValueSource.global_, + ) + if (state := metadata.local_state.get(source)) and not state.is_map: + return models.MethodArgDefaultValue( + data=_encode_bytes(state.key_or_prefix), + type=state.arc56_key_type, + source=models.DefaultValueSource.local_, + ) + if (state := metadata.boxes.get(source)) and not state.is_map: + return models.MethodArgDefaultValue( + data=_encode_bytes(state.key_or_prefix), + type=state.arc56_key_type, + source=models.DefaultValueSource.box, + ) + for method in metadata.arc4_methods: + if isinstance(method, ARC4ABIMethod) and method.name == source: + return models.MethodArgDefaultValue( + data=method.signature, + source=models.DefaultValueSource.method, + ) + # TODO: constants + raise InternalError(f"Cannot find {source=!r} on {metadata.ref}") + + +def _combine_actions(actions: Sequence[models.MethodActions]) -> models.MethodActions: + return models.MethodActions( + create=sorted(set(itertools.chain.from_iterable(a.create for a in actions))), + call=sorted(set(itertools.chain.from_iterable(a.call for a in actions))), + ) + + +def allowed_create_oca( + oca: str, +) -> typing.TypeGuard[typing.Literal["NoOp", "OptIn", "DeleteApplication"]]: + return oca in ("NoOp", "OptIn", "DeleteApplication") + + +def allowed_call_oca( + oca: str, +) -> typing.TypeGuard[ + typing.Literal["NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication"] +]: + return oca in ("NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication") + + +def _encode_str(value: str) -> str: + return _encode_bytes(value.encode("utf8")) + + +def _encode_bytes(value: bytes) -> str: + return base64.b64encode(value).decode("utf-8") + + +def _compiler_info() -> models.CompilerInfo: + return models.CompilerInfo( + compiler="puya", + compilerVersion=models.CompilerVersion( + major=_ALGOPY_VERSION.major, + minor=_ALGOPY_VERSION.minor, + patch=_ALGOPY_VERSION.micro, + commitHash=None, + ), + ) diff --git a/src/puya/arc56_models.py b/src/puya/arc56_models.py new file mode 100644 index 0000000000..c5eb67231d --- /dev/null +++ b/src/puya/arc56_models.py @@ -0,0 +1,364 @@ +# ruff: noqa: N815 +import enum +import typing +from collections.abc import Mapping, Sequence + +import attrs + +ABIType = str +"""An ABI-encoded type""" +StructName = str +"""The name of a defined struct""" +ProgramType = typing.Literal["approval", "clear"] + + +class AVMType(enum.StrEnum): + """A native AVM type""" + + bytes = "AVMBytes" + """Raw byteslice without the length prefixed that is specified in ARC-4""" + string = "AVMString" + """A utf-8 string without the length prefix that is specified in ARC-4""" + uint64 = "AVMUint64" + """A 64-bit unsigned integer""" + + +@attrs.frozen +class SourceInfo: + pc: Sequence[int] + """The program counter value(s). Could be offset if pcOffsetMethod is not 'none'""" + errorMessage: str + """A human-readable string that describes the error when the program fails at the given PC""" + + +@attrs.frozen +class ProgramSourceInfo: + sourceInfo: Sequence[SourceInfo] + """The source information for the program""" + pcOffsetMethod: typing.Literal["none", "cblocks"] + """ + How the program counter offset is calculated + none: The pc values in sourceInfo are not offset + cblocks: The pc values in sourceInfo are offset by the PC of the first op after the + last cblock at the top of the program + """ + + +@attrs.frozen(kw_only=True) +class StorageKey: + """Describes a single key in app storage""" + + desc: str | None = None + """Description of what this storage key holds""" + keyType: ABIType | AVMType | StructName + """The type of the key""" + valueType: ABIType | AVMType | StructName + """The type of the value""" + key: str + """The base64-encoded key""" + + +@attrs.frozen(kw_only=True) +class StorageMap: + """Describes a mapping of key-value pairs in storage""" + + desc: str | None = None + """Description of what the key-value pairs in this mapping hold""" + keyType: ABIType | AVMType | StructName + """The type of the keys in the map""" + valueType: ABIType | AVMType | StructName + """The type of the values in the map""" + prefix: str | None = None + """The base64-encoded prefix of the map keys""" + + +@attrs.frozen +class StructField: + """Information about a single field in a struct""" + + name: str + """The name of the struct field""" + type: ABIType | StructName | Sequence["StructField"] + """The type of the struct field's value""" + + +@attrs.frozen +class EventArg: + type: ABIType + """ + The type of the argument. + The `struct` field should also be checked to determine if this arg is a struct. + """ + name: str | None = None + """Optional, user-friendly name for the argument""" + desc: str | None = None + """Optional, user-friendly description for the argument""" + struct: StructName | None = None + """ + If the type is a struct, the name of the struct + Note: this is a separate field to maintain backwards compatability with ARC-23 + """ + + +@attrs.frozen(kw_only=True) +class Event: + name: str + """The name of the event""" + desc: str | None = None + """Optional, user-friendly description for the event""" + args: Sequence[EventArg] + """The arguments of the event, in order""" + + +class DefaultValueSource(enum.Enum): + box = "box" + """The data key signifies the box key to read the value from""" + global_ = "global" + """The data key signifies the global state key to read the value from""" + local_ = "local" + """The data key signifies the local state key to read the value from (for the sender)""" + literal = "literal" + """the value is a literal and should be passed directly as the argument""" + method = "method" + """ + The utf8 signature of the method in this contract to call to get the default value. + If the method has arguments, they all must have default values. + The method **MUST** be readonly so simulate can be used to get the default value. + """ + + +@attrs.frozen(kw_only=True) +class MethodArgDefaultValue: + source: DefaultValueSource + """Where the default value is coming from""" + type: ABIType | AVMType | None = None + """ + How the data is encoded. + This is the encoding for the data provided here, not the arg type. + Not relevant if source is method + """ + data: str + """Base64 encoded bytes or uint64""" + + +@attrs.frozen(kw_only=True) +class MethodArg: + type: ABIType + """ + The type of the argument. + The `struct` field should also be checked to determine if this arg is a struct. + """ + struct: StructName | None = None + """ + If the type is a struct, the name of the struct. + Note: this is a separate field to maintain backwards compatability with ARC-4 + """ + name: str | None = None + """Optional, user-friendly name for the argument""" + desc: str | None = None + """Optional, user-friendly description for the argument""" + defaultValue: MethodArgDefaultValue | None = None + + +@attrs.frozen(kw_only=True) +class MethodReturns: + type: ABIType + """ + The type of the return value, or "void" to indicate no return value. + The `struct` field should also be checked to determine if this return value is a struct. + """ + struct: StructName | None = None + """ + If the type is a struct, the name of the struct + """ + desc: str | None = None + """Optional, user-friendly description for the return value""" + + +@attrs.frozen +class MethodActions: + """An action is a combination of call/create and an OnComplete""" + + create: Sequence[typing.Literal["NoOp", "OptIn", "DeleteApplication"]] + """OnCompletes this method allows when appID === 0""" + call: Sequence[ + typing.Literal["NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication"] + ] + """OnCompletes this method allows when appID !== 0""" + + +@attrs.frozen(kw_only=True) +class MethodBoxRecommendation: + app: int | None = None + """The app ID for the box""" + key: str + """The base64 encoded box key""" + readBytes: int + """The number of bytes being read from the box""" + writeBytes: int + """The number of bytes being written to the box""" + + +@attrs.frozen(kw_only=True) +class MethodRecommendations: + innerTransactionCount: int | None = None + """The number of inner transactions the caller should cover the fees for""" + boxes: MethodBoxRecommendation | None = None + """Recommended box references to include""" + accounts: Sequence[str] | None = None + """Recommended foreign accounts""" + apps: Sequence[int] | None = None + """Recommended foreign apps""" + assets: Sequence[int] | None = None + """Recommended foreign assets""" + + +@attrs.frozen(kw_only=True) +class Method: + """ + Describes a method in the contract. + This interface is an extension of the interface described in ARC-4 + """ + + name: str + """The name of the method""" + desc: str | None = None + """Optional, user-friendly description for the method""" + args: Sequence[MethodArg] + """The arguments of the method, in order""" + returns: MethodReturns + """Information about the method's return value""" + actions: MethodActions + """Allowed actions for this method""" + readonly: bool + """If this method does not write anything to the ledger (ARC-22)""" + events: Sequence[Event] = () + """ARC-28 events that MAY be emitted by this method""" + recommendations: MethodRecommendations | None = None + """Information that clients can use when calling the method""" + + +@attrs.frozen +class Network: + appID: int + """The app ID of the deployed contract in this network""" + + +class SchemaSizes(typing.TypedDict): + ints: int + bytes: int + + +ContractSchema = typing.TypedDict("ContractSchema", {"global": SchemaSizes, "local": SchemaSizes}) +StorageMaps = Mapping[str, StorageMap] +StorageKeys = Mapping[str, StorageKey] +ContractStorage = typing.TypedDict( + "ContractStorage", {"global": StorageMaps, "local": StorageMaps, "box": StorageMaps} +) +ContractKeys = typing.TypedDict( + "ContractKeys", {"global": StorageKeys, "local": StorageKeys, "box": StorageKeys} +) + + +@attrs.frozen +class ContractState: + schema: ContractSchema + """ + Defines the values that should be used for GlobalNumUint, GlobalNumByteSlice, LocalNumUint, + and LocalNumByteSlice when creating the application + """ + keys: ContractKeys + """Mapping of human-readable names to StorageKey objects""" + maps: ContractStorage + """Mapping of human-readable names to StorageMap objects""" + + +@attrs.frozen(kw_only=True) +class CompilerVersion: + major: int + minor: int + patch: int + commitHash: str | None = None + + +@attrs.frozen +class CompilerInfo: + compiler: str + """The name of the compiler""" + compilerVersion: CompilerVersion + + +@attrs.frozen(kw_only=True) +class TemplateVariable: + type: ABIType | AVMType | StructName + """The type of the template variable""" + value: str | None = None + """If given, the the base64 encoded value used for the given app/program""" + + +@attrs.frozen +class ScratchVariable: + slot: int + type: ABIType | AVMType | StructName + + +@attrs.frozen(kw_only=True) +class Contract: + """ + Describes the entire contract. + This interface is an extension of the interface described in ARC-4 + """ + + arcs: Sequence[int] = () + """ + The ARCs used and/or supported by this contract. + All contracts implicitly support ARC-4 and ARC-56 + """ + name: str + """A user-friendly name for the contract""" + desc: str | None = None + """Optional, user-friendly description for the interface""" + networks: Mapping[str, Network] | None = None + """ + Optional object listing the contract instances across different networks. + The key is the base64 genesis hash of the network, and the value contains + information about the deployed contract in the network indicated by the + key. A key containing the human-readable name of the network MAY be + included, but the corresponding genesis hash key MUST also be define + """ + structs: Mapping[str, Sequence[StructField]] + """ + Named structs use by the application. + Each struct field appears in the same order as ABI encoding + """ + methods: Sequence[Method] + """All of the methods that the contract implements""" + state: ContractState | None = None + bareActions: MethodActions | None = None + """Supported bare actions for the contract""" + sourceInfo: Mapping[ProgramType, ProgramSourceInfo] | None = None + """Information about the TEAL programs""" + source: Mapping[ProgramType, str] | None = None + """ + The pre-compiled TEAL that may contain template variables. + MUST be omitted if included as part of ARC23 + """ + byteCode: Mapping[ProgramType, str] | None = None + """ + The compiled bytecode for the application. + MUST be omitted if included as part of ARC23 + """ + compilerInfo: CompilerInfo | None = None + """ + Information used to get the given byteCode and/or PC values in sourceInfo. + MUST be given if byteCode or PC values are present + """ + events: Sequence[Event] | None = None + """ARC-28 events that MAY be emitted by this contract""" + templateVariables: Mapping[str, TemplateVariable] | None = None + """ + A mapping of template variable names as they appear in the teal (not including TMPL_ prefix) + to their respective types and values (if applicable) + """ + scratchVariables: Mapping[str, ScratchVariable] | None = None + """The scratch variables used during runtime""" diff --git a/src/puya/awst/function_traverser.py b/src/puya/awst/function_traverser.py index 95014c8d12..527c8b2883 100644 --- a/src/puya/awst/function_traverser.py +++ b/src/puya/awst/function_traverser.py @@ -381,3 +381,7 @@ def visit_range(self, node: awst_nodes.Range) -> None: node.start.accept(self) node.stop.accept(self) node.step.accept(self) + + @typing.override + def visit_emit(self, expr: awst_nodes.Emit) -> None: + expr.value.accept(self) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 1877682560..c409f15ee0 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -490,6 +490,7 @@ class ARC4Decode(Expression): wtypes.arc4_bool_wtype, wtypes.ARC4UIntN, wtypes.ARC4Tuple, + wtypes.ARC4Struct, wtypes.ARC4DynamicArray, # only if element type is bytes for now ) ) @@ -1362,6 +1363,16 @@ def accept(self, visitor: StatementVisitor[T]) -> T: return visitor.visit_bytes_augmented_assignment(self) +@attrs.frozen +class Emit(Expression): + signature: str + value: Expression = attrs.field(validator=expression_has_wtype(wtypes.ARC4Struct)) + wtype: WType = attrs.field(default=wtypes.void_wtype, init=False) + + def accept(self, visitor: ExpressionVisitor[T]) -> T: + return visitor.visit_emit(self) + + @attrs.frozen class Range(Expression): wtype: WType = attrs.field(default=wtypes.uint64_range_wtype, init=False) diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py index 74b9f035c9..b6697f7e95 100644 --- a/src/puya/awst/to_code_visitor.py +++ b/src/puya/awst/to_code_visitor.py @@ -641,6 +641,10 @@ def visit_uint64_postfix_unary_operation(self, expr: nodes.UInt64PostfixUnaryOpe def visit_arc4_router(self, expr: nodes.ARC4Router) -> str: return "arc4_router()" + @typing.override + def visit_emit(self, expr: nodes.Emit) -> str: + return f"emit({expr.signature!r}, {expr.value.accept(self)})" + def _indent(lines: Iterable[str], indent_size: str = " ") -> Iterator[str]: yield from (f"{indent_size}{line}" for line in lines) diff --git a/src/puya/awst/validation/arc4_copy.py b/src/puya/awst/validation/arc4_copy.py index a6ab9a9a63..1cc6b9bec6 100644 --- a/src/puya/awst/validation/arc4_copy.py +++ b/src/puya/awst/validation/arc4_copy.py @@ -33,6 +33,10 @@ def visit_intrinsic_call(self, call: awst_nodes.IntrinsicCall) -> None: if _HasAssignmentVisitor.check(call): super().visit_intrinsic_call(call) + def visit_emit(self, emit: awst_nodes.Emit) -> None: + if _HasAssignmentVisitor.check(emit): + super().visit_emit(emit) + def visit_assignment_statement(self, statement: awst_nodes.AssignmentStatement) -> None: _check_assignment(statement.target, statement.value) statement.value.accept(self) diff --git a/src/puya/awst/visitors.py b/src/puya/awst/visitors.py index 710a1e38c4..9f7a688bb4 100644 --- a/src/puya/awst/visitors.py +++ b/src/puya/awst/visitors.py @@ -289,3 +289,6 @@ def visit_arc4_router(self, expr: puya.awst.nodes.ARC4Router) -> T: ... @abstractmethod def visit_range(self, node: puya.awst.nodes.Range) -> T: ... + + @abstractmethod + def visit_emit(self, emit: puya.awst.nodes.Emit) -> T: ... diff --git a/src/puya/awst/wtypes.py b/src/puya/awst/wtypes.py index cdb30caad5..393d5db9d8 100644 --- a/src/puya/awst/wtypes.py +++ b/src/puya/awst/wtypes.py @@ -166,6 +166,7 @@ class WStructType(WType): immutable: bool = attrs.field(init=False) scalar_type: None = attrs.field(default=None, init=False) source_location: SourceLocation | None = attrs.field(eq=False) + desc: str | None = None @immutable.default def _immutable(self) -> bool: @@ -208,6 +209,7 @@ class WTuple(WType): immutable: bool = attrs.field(default=True, init=False) name: str = attrs.field(kw_only=True) names: tuple[str, ...] | None = attrs.field(default=None) + desc: str | None = None def __eq__(self, other: object) -> bool: # this custom equality check ensures that @@ -460,6 +462,7 @@ class ARC4Struct(ARC4Type): source_location: SourceLocation | None = attrs.field(default=None, eq=False) arc4_name: str = attrs.field(init=False, eq=False) native_type: None = attrs.field(default=None, init=False) + desc: str | None = None @immutable.default def _immutable(self) -> bool: diff --git a/src/puya/compile.py b/src/puya/compile.py index 9a68972016..53da795177 100644 --- a/src/puya/compile.py +++ b/src/puya/compile.py @@ -9,6 +9,7 @@ from puya import log from puya.arc32 import create_arc32_json +from puya.arc56 import create_arc56_json from puya.artifact_sorter import ArtifactCompilationSorter from puya.awst.nodes import AWST from puya.awst.validation.main import validate_awst @@ -169,6 +170,7 @@ def get_program_bytecode( class _CompiledProgram(CompiledProgram): teal: TealProgram teal_src: str + template_variables: Mapping[str, int | bytes | None] debug_info: DebugInfo | None = None bytecode: bytes | None = None @@ -207,6 +209,7 @@ def _dummy_program() -> _CompiledProgram: subroutines=[], ), teal_src="", + template_variables={}, ) @@ -265,6 +268,7 @@ def _compile_program(context: CompileContext, program: TealProgram) -> _Compiled teal_src=emit_teal(context, program), bytecode=assembled.bytecode if context.options.output_bytecode else None, debug_info=assembled.debug_info, + template_variables=assembled.template_variables, ) @@ -279,7 +283,6 @@ def _write_artifacts( if out_dir is None: continue teal_file_stem = artifact.metadata.name - arc32_file_stem = f"{teal_file_stem}.arc32.json" artifact_base_path = out_dir / teal_file_stem match artifact: case CompiledLogicSig(program=program): @@ -290,15 +293,27 @@ def _write_artifacts( ".clear": clear, } if contract.metadata.is_arc4: - app_spec_json = create_arc32_json( - approval.teal_src, - clear.teal_src, - contract.metadata, - ) if context.options.output_arc32: - arc32_path = out_dir / arc32_file_stem - logger.info(f"Writing {make_path_relative_to_cwd(arc32_path)}") - arc32_path.write_text(app_spec_json) + app_spec_json = create_arc32_json( + approval.teal_src, + clear.teal_src, + contract.metadata, + ) + _write_output( + artifact_base_path, + {".arc32.json": app_spec_json.encode("utf8")}, + ) + if context.options.output_arc56: + app_spec_json = create_arc56_json( + metadata=contract.metadata, + approval_program=approval, + clear_program=clear, + template_prefix=context.options.template_vars_prefix, + ) + _write_output( + artifact_base_path, + {".arc56.json": app_spec_json.encode("utf8")}, + ) case _: typing.assert_never(artifact) if context.options.output_teal: diff --git a/src/puya/ir/_puya_lib.awst.json b/src/puya/ir/_puya_lib.awst.json index c8dfc103f8..3f82220aca 100644 --- a/src/puya/ir/_puya_lib.awst.json +++ b/src/puya/ir/_puya_lib.awst.json @@ -1308,6 +1308,7 @@ "source_location": null, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "body": { @@ -2274,6 +2275,7 @@ }, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "_type": "TupleExpression" @@ -2362,6 +2364,7 @@ "source_location": null, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "body": { @@ -3099,6 +3102,7 @@ }, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "_type": "TupleExpression" @@ -3169,6 +3173,7 @@ "source_location": null, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "body": { @@ -4256,6 +4261,7 @@ }, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "_type": "TupleExpression" @@ -4326,6 +4332,7 @@ "source_location": null, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "body": { @@ -5668,6 +5675,7 @@ }, "name": "tuple", "names": null, + "desc": null, "_type": "WTuple" }, "_type": "TupleExpression" diff --git a/src/puya/ir/arc4_router.py b/src/puya/ir/arc4_router.py index 9b235a57d4..02b59b672b 100644 --- a/src/puya/ir/arc4_router.py +++ b/src/puya/ir/arc4_router.py @@ -1,6 +1,8 @@ import typing from collections.abc import Iterable, Mapping, Sequence +from immutabledict import immutabledict + from puya import log from puya.avm_type import AVMType from puya.awst import ( @@ -222,10 +224,10 @@ def assert_create_state( return () case ARC4CreateOption.disallow: condition = _non_zero(app_id) - comment = "is not creating" + comment = "can only call when not creating" case ARC4CreateOption.require: condition = _is_zero(app_id) - comment = "is creating" + comment = "can only call when creating" case invalid: typing.assert_never(invalid) return [ @@ -327,7 +329,7 @@ def check_allowed_oca( awst_nodes.ExpressionStatement( expr=_assert( condition=condition, - comment=f"OnCompletion is {oca_desc}", + comment=f"OnCompletion is not {oca_desc}", source_location=location, ) ), @@ -346,7 +348,7 @@ def _map_abi_args( if isinstance(a, wtypes.ARC4Type): arc4_type = a else: - converted = _maybe_avm_to_arc4_equivalent_type(a) + converted = maybe_avm_to_arc4_equivalent_type(a) if converted is not None: arc4_type = converted elif _reference_type_array(a) is not None: @@ -421,7 +423,7 @@ def route_abi_methods( case wtypes.ARC4Type(): call_and_maybe_log = log_arc4_result(abi_loc, method_result) case _: - converted_return_type = _maybe_avm_to_arc4_equivalent_type(method.return_type) + converted_return_type = maybe_avm_to_arc4_equivalent_type(method.return_type) if converted_return_type is None: raise CodeError( f"{method.return_type} is not a valid ABI return type", @@ -568,7 +570,7 @@ def extract_arc4_methods( *, global_state: Mapping[str, ContractState], local_state: Mapping[str, ContractState], -) -> list[ARC4Method]: +) -> dict[awst_nodes.ContractMethod, ARC4Method]: abi_methods = {} bare_methods = {} known_sources: dict[str, ContractState | awst_nodes.ContractMethod] = { @@ -587,68 +589,61 @@ def extract_arc4_methods( _validate_default_args(abi_methods.keys(), known_sources) - arc4_method_metadata = list[ARC4Method]() + arc4_method_metadata = dict[awst_nodes.ContractMethod, ARC4Method]() for m, bare_method_config in bare_methods.items(): - arc4_method_metadata.append( - ARC4BareMethod( - desc=m.documentation.description, - config=bare_method_config, - ) + arc4_method_metadata[m] = ARC4BareMethod( + desc=m.documentation.description, + config=bare_method_config, ) for m, abi_method_config in abi_methods.items(): - arc4_method_metadata.append( - ARC4ABIMethod( - name=m.member_name, - desc=m.documentation.description, - args=[ - ARC4MethodArg( - name=a.name, - type_=_wtype_to_arc4(a.wtype), - desc=m.documentation.args.get(a.name), - ) - for a in m.args - ], - returns=ARC4Returns( - desc=m.documentation.returns, - type_=_wtype_to_arc4(m.return_type), - ), - config=abi_method_config, - ) + arc4_method_metadata[m] = ARC4ABIMethod( + name=m.member_name, + desc=m.documentation.description, + args=[ + ARC4MethodArg( + name=a.name, + type_=_wtype_to_arc4(a.wtype), + struct=_get_arc4_struct_name(a.wtype), + desc=m.documentation.args.get(a.name), + ) + for a in m.args + ], + returns=ARC4Returns( + desc=m.documentation.returns, + type_=_wtype_to_arc4(m.return_type), + struct=_get_arc4_struct_name(m.return_type), + ), + events=[], + config=abi_method_config, ) + return arc4_method_metadata +def _get_arc4_struct_name(wtype: wtypes.WType) -> str | None: + return ( + wtype.name + if isinstance(wtype, wtypes.ARC4Struct | wtypes.WTuple) and wtype.fields + else None + ) + + def create_abi_router( contract: awst_nodes.Contract, - arc4_methods_with_configs: dict[awst_nodes.ContractMethod, ARC4MethodConfig], + arc4_methods_with_configs: dict[awst_nodes.ContractMethod, ARC4Method], ) -> awst_nodes.ContractMethod: router_location = contract.source_location abi_methods = {} bare_methods = {} - arc4_method_metadata = list[ARC4Method]() - for m, arc4_config in arc4_methods_with_configs.items(): - doc = m.documentation + for m, arc4_method in arc4_methods_with_configs.items(): + arc4_config = arc4_method.config assert arc4_config is m.arc4_method_config if isinstance(arc4_config, ARC4BareMethodConfig): bare_methods[m] = arc4_config - metadata: ARC4Method = ARC4BareMethod(desc=doc.description, config=arc4_config) elif isinstance(arc4_config, ARC4ABIMethodConfig): abi_methods[m] = arc4_config - metadata = ARC4ABIMethod( - name=m.member_name, - desc=doc.description, - args=[ - ARC4MethodArg( - name=a.name, type_=_wtype_to_arc4(a.wtype), desc=doc.args.get(a.name) - ) - for a in m.args - ], - returns=ARC4Returns(desc=doc.returns, type_=_wtype_to_arc4(m.return_type)), - config=arc4_config, - ) else: typing.assert_never(arc4_config) - arc4_method_metadata.append(metadata) abi_routing = route_abi_methods(router_location, abi_methods) bare_routing = route_bare_methods(router_location, bare_methods) @@ -694,7 +689,7 @@ def _wtype_to_arc4(wtype: wtypes.WType, loc: SourceLocation | None = None) -> st return wtype.name case wtypes.WGroupTransaction(transaction_type=transaction_type): return transaction_type.name if transaction_type else "txn" - converted = _maybe_avm_to_arc4_equivalent_type(wtype) + converted = maybe_avm_to_arc4_equivalent_type(wtype) if converted is None: raise CodeError(f"not an ARC4 type or native equivalent: {wtype}", loc) return _wtype_to_arc4(converted, loc) @@ -711,7 +706,7 @@ def _reference_type_array(wtype: wtypes.WType) -> str | None: return None -def _maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type | None: +def maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type | None: match wtype: case wtypes.bool_wtype: return wtypes.arc4_bool_wtype @@ -725,16 +720,24 @@ def _maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type | ) case wtypes.string_wtype: return wtypes.arc4_string_alias - case wtypes.WTuple(types=tuple_item_types): + case wtypes.WTuple(types=tuple_item_types) as wtuple: arc4_item_types = [] for t in tuple_item_types: if isinstance(t, wtypes.ARC4Type): arc4_item_types.append(t) else: - converted = _maybe_avm_to_arc4_equivalent_type(t) + converted = maybe_avm_to_arc4_equivalent_type(t) if converted is None: return None arc4_item_types.append(converted) - return wtypes.ARC4Tuple(types=arc4_item_types, source_location=None) + if wtuple.fields: + return wtypes.ARC4Struct( + name=wtuple.name, + desc=wtuple.desc, + frozen=True, + fields=immutabledict(zip(wtuple.fields, arc4_item_types, strict=True)), + ) + else: + return wtypes.ARC4Tuple(types=arc4_item_types, source_location=None) case _: return None diff --git a/src/puya/ir/builder/_utils.py b/src/puya/ir/builder/_utils.py index 80ba789063..1cc62cf441 100644 --- a/src/puya/ir/builder/_utils.py +++ b/src/puya/ir/builder/_utils.py @@ -233,3 +233,213 @@ def extract_const_int(expr: awst_nodes.Expression | int | None) -> int | None: f"Expected either constant or None for index, got {type(expr).__name__}", expr.source_location, ) + + +@attrs.frozen +class OpFactory: + context: IRFunctionBuildContext + source_location: SourceLocation | None + + def assign(self, value: ValueProvider, temp_desc: str) -> Register: + register = assign_temp( + self.context, value, temp_description=temp_desc, source_location=self.source_location + ) + return register + + def assign_multiple(self, **values: ValueProvider) -> Sequence[Register]: + return [self.assign(value, desc) for desc, value in values.items()] + + def add(self, a: Value, b: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.add, + args=[a, b], + source_location=self.source_location, + ) + return result + + def sub(self, a: Value, b: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.sub, + args=[a, b], + source_location=self.source_location, + ) + return result + + def mul(self, a: Value, b: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.mul, + args=[a, b], + source_location=self.source_location, + ) + return result + + def len(self, value: Value, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.len_, + args=[value], + source_location=self.source_location, + ) + return result + + def eq(self, a: Value, b: Value, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.eq, + args=[a, b], + source_location=self.source_location, + ) + return result + + def select(self, false: Value, true: Value, condition: Value, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.select, + args=[false, true, condition], + return_type=true.ir_type, + source_location=self.source_location, + ) + return result + + def extract_uint16(self, a: Value, b: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.extract_uint16, + args=[a, b], + source_location=self.source_location, + ) + return result + + def itob(self, value: Value | int, temp_desc: str) -> Register: + itob = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.itob, + args=[value], + source_location=self.source_location, + ) + return itob + + def as_u16_bytes(self, a: Value | int, temp_desc: str) -> Register: + as_bytes = self.itob(a, "as_bytes") + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.extract, + immediates=[6, 2], + args=[as_bytes], + source_location=self.source_location, + ) + return result + + def concat(self, a: Value | bytes, b: Value | bytes, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.concat, + args=[a, b], + source_location=self.source_location, + ) + return result + + def constant(self, value: int | bytes) -> Value: + if isinstance(value, int): + return UInt64Constant(value=value, source_location=self.source_location) + else: + return BytesConstant( + value=value, encoding=AVMBytesEncoding.base16, source_location=self.source_location + ) + + def set_bit(self, *, value: Value, index: int, bit: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.setbit, + args=[value, index, bit], + return_type=value.ir_type, + source_location=self.source_location, + ) + return result + + def get_bit(self, value: Value, index: Value | int, temp_desc: str) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.getbit, + args=[value, index], + source_location=self.source_location, + ) + return result + + def extract_to_end(self, value: Value, start: int, temp_desc: str) -> Register: + if start > 255: + raise InternalError( + "Cannot use extract with a length of 0 if start > 255", self.source_location + ) + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.extract, + immediates=[start, 0], + args=[value], + source_location=self.source_location, + ) + return result + + def substring3( + self, + value: Value | bytes, + start: Value | int, + end_ex: Value | int, + temp_desc: str, + ) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.substring3, + args=[value, start, end_ex], + source_location=self.source_location, + ) + return result + + def replace( + self, + value: Value | bytes, + index: Value | int, + replacement: Value | bytes, + temp_desc: str, + ) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + source_location=self.source_location, + op=AVMOp.replace3, + args=[value, index, replacement], + ) + return result + + def extract3( + self, + value: Value | bytes, + index: Value | int, + length: Value | int, + temp_desc: str, + ) -> Register: + result = assign_intrinsic_op( + self.context, + target=temp_desc, + op=AVMOp.extract3, + args=[value, index, length], + source_location=self.source_location, + ) + return result diff --git a/src/puya/ir/builder/arc4.py b/src/puya/ir/builder/arc4.py index bbdf216d13..f446e436d4 100644 --- a/src/puya/ir/builder/arc4.py +++ b/src/puya/ir/builder/arc4.py @@ -12,6 +12,7 @@ from puya.errors import CodeError, InternalError from puya.ir.avm_ops import AVMOp from puya.ir.builder._utils import ( + OpFactory, assert_value, assign_intrinsic_op, assign_targets, @@ -22,7 +23,6 @@ from puya.ir.builder.assignment import handle_assignment from puya.ir.context import IRFunctionBuildContext from puya.ir.models import ( - BytesConstant, Intrinsic, Register, UInt64Constant, @@ -30,7 +30,7 @@ ValueProvider, ValueTuple, ) -from puya.ir.types_ import AVMBytesEncoding, IRType, get_wtype_arity +from puya.ir.types_ import IRType, get_wtype_arity from puya.parse import SourceLocation, sequential_source_locations_merge from puya.utils import bits_to_bytes, round_bits_to_nearest_bytes @@ -93,9 +93,10 @@ def _decode_arc4_value( args=[value], source_location=loc, ) - case wtypes.ARC4Tuple() as arc4_tuple, wtypes.WTuple() as native_tuple if ( - len(arc4_tuple.types) == len(native_tuple.types) - ): + case ( + wtypes.ARC4Tuple() | wtypes.ARC4Struct() as arc4_tuple, + wtypes.WTuple() as native_tuple, + ) if (len(arc4_tuple.types) == len(native_tuple.types)): return _visit_arc4_tuple_decode( context, arc4_tuple, value, target_wtype=native_tuple, source_location=loc ) @@ -150,11 +151,22 @@ def _encode_expr( context, elements, value_wtype.types, arc4_item_types, loc ) return _visit_arc4_tuple_encode(context, arc4_items, arc4_item_types, loc) + case wtypes.ARC4Struct(types=arc4_item_types): + assert isinstance( + value_wtype, wtypes.WTuple + ), f"expected WTuple argument, got {value_wtype.name}" + elements = context.visitor.materialise_value_provider( + value_provider, description="elements_to_encode" + ) + arc4_items = _encode_arc4_tuple_items( + context, elements, value_wtype.types, arc4_item_types, loc + ) + return _visit_arc4_tuple_encode(context, arc4_items, arc4_item_types, loc) case wtypes.ARC4DynamicArray(element_type=wtypes.ARC4UIntN(n=8)): (value,) = context.visitor.materialise_value_provider( value_provider, description="to_encode" ) - factory = _OpFactory(context, loc) + factory = OpFactory(context, loc) length = factory.len(value, "length") length_uint16 = factory.as_u16_bytes(length, "length_uint16") return factory.concat(length_uint16, value, "encoded_value") @@ -217,7 +229,7 @@ def encode_arc4_array(context: IRFunctionBuildContext, expr: awst_nodes.NewArray else b"" ) - factory = _OpFactory(context, expr.source_location) + factory = OpFactory(context, expr.source_location) elements = [context.visitor.visit_and_materialise_single(value) for value in expr.values] element_type = expr.wtype.element_type @@ -254,7 +266,7 @@ def arc4_array_index( source_location: SourceLocation, assert_bounds: bool = True, ) -> ValueProvider: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) array_length_vp = _get_arc4_array_length(array_wtype, array, source_location) array_head_and_tail_vp = _get_arc4_array_head_and_tail(array_wtype, array, source_location) array_head_and_tail = factory.assign(array_head_and_tail_vp, "array_head_and_tail") @@ -446,7 +458,7 @@ def concat_values( right_expr: awst_nodes.Expression, source_location: SourceLocation, ) -> Value: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) # check left is a valid ARC4 array to concat with left_wtype = left_expr.wtype if not isinstance(left_wtype, wtypes.ARC4DynamicArray): @@ -596,14 +608,14 @@ def pop_arc4_array( def _encode_arc4_bool( context: IRFunctionBuildContext, bit: Value, source_location: SourceLocation ) -> Value: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) value = factory.constant(0x00.to_bytes(1, "big")) return factory.set_bit(value=value, index=0, bit=bit, temp_desc="encoded_bool") def _visit_arc4_tuple_decode( context: IRFunctionBuildContext, - wtype: wtypes.ARC4Tuple, + wtype: wtypes.ARC4Tuple | wtypes.ARC4Struct, value: Value, target_wtype: wtypes.WTuple, source_location: SourceLocation, @@ -662,7 +674,7 @@ def _read_dynamic_item_using_length_from_arc4_container( index: Value, source_location: SourceLocation, ) -> ValueProvider: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) item_offset_offset = factory.mul(index, 2, "item_offset_offset") item_start_offset = factory.extract_uint16( array_head_and_tail, item_offset_offset, "item_offset" @@ -685,7 +697,7 @@ def _read_dynamic_item_using_end_offset_from_arc4_container( index: Value, source_location: SourceLocation, ) -> ValueProvider: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) item_offset_offset = factory.mul(index, 2, "item_offset_offset") item_start_offset = factory.extract_uint16( array_head_and_tail, item_offset_offset, "item_offset" @@ -735,7 +747,7 @@ def _visit_arc4_tuple_encode( expr_loc: SourceLocation, ) -> ValueProvider: header_size = _determine_arc4_tuple_head_size(tuple_items, round_end_result=True) - factory = _OpFactory(context, expr_loc) + factory = OpFactory(context, expr_loc) current_tail_offset = factory.assign(factory.constant(header_size // 8), "current_tail_offset") encoded_tuple_buffer = factory.assign(factory.constant(b""), "encoded_tuple_buffer") @@ -807,7 +819,7 @@ def _arc4_replace_tuple_item( value: ValueProvider, source_location: SourceLocation, ) -> Value: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) base = context.visitor.visit_and_materialise_single(base_expr) value = factory.assign(value, "assigned_value") element_type = wtype.types[index_int] @@ -1006,7 +1018,7 @@ def _get_arc4_array_tail_data_and_item_count( For native tuples will return the tuple items packed into the equivalent static array of tail data and item count """ - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) match expr: case awst_nodes.Expression( wtype=wtypes.ARC4DynamicArray() | wtypes.ARC4StaticArray() as arr_wtype @@ -1232,7 +1244,7 @@ def _concat_dynamic_array_fixed_size( source_location: SourceLocation, byte_size: int, ) -> Value: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) def array_data(expr: awst_nodes.Expression) -> Value: match expr.wtype: @@ -1277,7 +1289,7 @@ def _arc4_items_as_arc4_tuple( items: Sequence[Value], source_location: SourceLocation, ) -> Value: - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) result = factory.constant(b"") if is_arc4_dynamic_size(item_wtype): tail_offset: Value = UInt64Constant(value=len(items) * 2, source_location=source_location) @@ -1382,7 +1394,7 @@ def _get_arc4_array_tail( # no header for static sized elements return array_head_and_tail - factory = _OpFactory(context, source_location) + factory = OpFactory(context, source_location) # special case to use extract with immediate length of 0 where possible # TODO: have an IR pseudo op, extract_to_end that handles this for non constant values? if isinstance(array_length, UInt64Constant) and array_length.value <= 127: @@ -1392,216 +1404,6 @@ def _get_arc4_array_tail( return factory.substring3(array_head_and_tail, start_of_tail, total_length, "data") -@attrs.frozen -class _OpFactory: - context: IRFunctionBuildContext - source_location: SourceLocation | None - - def assign(self, value: ValueProvider, temp_desc: str) -> Register: - register = assign_temp( - self.context, value, temp_description=temp_desc, source_location=self.source_location - ) - return register - - def assign_multiple(self, **values: ValueProvider) -> Sequence[Register]: - return [self.assign(value, desc) for desc, value in values.items()] - - def add(self, a: Value, b: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.add, - args=[a, b], - source_location=self.source_location, - ) - return result - - def sub(self, a: Value, b: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.sub, - args=[a, b], - source_location=self.source_location, - ) - return result - - def mul(self, a: Value, b: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.mul, - args=[a, b], - source_location=self.source_location, - ) - return result - - def len(self, value: Value, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.len_, - args=[value], - source_location=self.source_location, - ) - return result - - def eq(self, a: Value, b: Value, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.eq, - args=[a, b], - source_location=self.source_location, - ) - return result - - def select(self, false: Value, true: Value, condition: Value, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.select, - args=[false, true, condition], - return_type=true.ir_type, - source_location=self.source_location, - ) - return result - - def extract_uint16(self, a: Value, b: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.extract_uint16, - args=[a, b], - source_location=self.source_location, - ) - return result - - def itob(self, value: Value | int, temp_desc: str) -> Register: - itob = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.itob, - args=[value], - source_location=self.source_location, - ) - return itob - - def as_u16_bytes(self, a: Value | int, temp_desc: str) -> Register: - as_bytes = self.itob(a, "as_bytes") - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.extract, - immediates=[6, 2], - args=[as_bytes], - source_location=self.source_location, - ) - return result - - def concat(self, a: Value | bytes, b: Value | bytes, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.concat, - args=[a, b], - source_location=self.source_location, - ) - return result - - def constant(self, value: int | bytes) -> Value: - if isinstance(value, int): - return UInt64Constant(value=value, source_location=self.source_location) - else: - return BytesConstant( - value=value, encoding=AVMBytesEncoding.base16, source_location=self.source_location - ) - - def set_bit(self, *, value: Value, index: int, bit: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.setbit, - args=[value, index, bit], - return_type=value.ir_type, - source_location=self.source_location, - ) - return result - - def get_bit(self, value: Value, index: Value | int, temp_desc: str) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.getbit, - args=[value, index], - source_location=self.source_location, - ) - return result - - def extract_to_end(self, value: Value, start: int, temp_desc: str) -> Register: - if start > 255: - raise InternalError( - "Cannot use extract with a length of 0 if start > 255", self.source_location - ) - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.extract, - immediates=[start, 0], - args=[value], - source_location=self.source_location, - ) - return result - - def substring3( - self, - value: Value | bytes, - start: Value | int, - end_ex: Value | int, - temp_desc: str, - ) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.substring3, - args=[value, start, end_ex], - source_location=self.source_location, - ) - return result - - def replace( - self, - value: Value | bytes, - index: Value | int, - replacement: Value | bytes, - temp_desc: str, - ) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - source_location=self.source_location, - op=AVMOp.replace3, - args=[value, index, replacement], - ) - return result - - def extract3( - self, - value: Value | bytes, - index: Value | int, - length: Value | int, - temp_desc: str, - ) -> Register: - result = assign_intrinsic_op( - self.context, - target=temp_desc, - op=AVMOp.extract3, - args=[value, index, length], - source_location=self.source_location, - ) - return result - - def is_arc4_dynamic_size(wtype: wtypes.ARC4Type) -> bool: match wtype: case wtypes.ARC4DynamicArray(): diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index e774089c66..7f5a07faf2 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -19,6 +19,7 @@ from puya.ir.builder import arc4, flow_control, storage from puya.ir.builder._tuple_util import get_tuple_item_values from puya.ir.builder._utils import ( + OpFactory, assert_value, assign, assign_intrinsic_op, @@ -1136,6 +1137,21 @@ def visit_arc4_router(self, expr: awst_nodes.ARC4Router) -> TExpression: source_location=expr.source_location, ) + def visit_emit(self, expr: awst_nodes.Emit) -> TExpression: + factory = OpFactory(self.context, expr.source_location) + value = self.context.visitor.visit_and_materialise_single(expr.value) + prefix = MethodConstant(value=expr.signature, source_location=expr.source_location) + event = factory.concat(prefix, value, "event") + + self.context.block_builder.add( + Intrinsic( + op=AVMOp("log"), + args=[event], + source_location=expr.source_location, + ) + ) + return None + def visit_range(self, node: awst_nodes.Range) -> TExpression: raise CodeError("unexpected range location", node.source_location) diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index 76f28455b6..11c03902a3 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -2,7 +2,7 @@ import itertools import typing from collections import Counter, defaultdict -from collections.abc import Collection, Iterable, Iterator, Mapping +from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence from pathlib import Path import attrs @@ -20,7 +20,7 @@ from puya.context import CompileContext from puya.errors import InternalError from puya.ir import arc4_router -from puya.ir.arc4_router import extract_arc4_methods +from puya.ir.arc4_router import extract_arc4_methods, maybe_avm_to_arc4_equivalent_type from puya.ir.builder.main import FunctionIRBuilder from puya.ir.context import IRBuildContext from puya.ir.destructure.main import destructure_ssa @@ -33,15 +33,18 @@ from puya.ir.utils import format_tuple_index from puya.ir.validation.main import validate_module_artifact from puya.models import ( + ARC4ABIMethod, ARC4Method, ARC4MethodConfig, + ARC4Struct, + ARC4StructField, ContractMetaData, ContractState, LogicSignatureMetaData, StateTotals, ) from puya.parse import SourceLocation -from puya.utils import StableSet, attrs_extend, coalesce, set_remove +from puya.utils import StableSet, attrs_extend, coalesce, set_remove, unique logger = log.get_logger(__name__) @@ -230,6 +233,25 @@ def _build_ir(ctx: IRBuildContext, contract: awst_nodes.Contract) -> Contract: clear_subs_srefs = SubroutineCollector.collect( ctx, start=contract.clear_program, callees=callees, arc4_router_func=arc4_router_func ) + function_emits = EventCollector.collect(ctx, unique((*approval_subs_srefs, *clear_subs_srefs))) + + # collect emitted events by method, and include any referenced structs + structs = list(folded.structs) + arc4_methods = [] + for method, arc4_method in arc4_method_data.items(): + if isinstance(arc4_method, ARC4ABIMethod): + method_structs = function_emits[method] + # extend structs with any arc4 struct types that are part of an event + structs.extend( + t + for method_struct in method_structs + for t in method_struct.fields.values() + if isinstance(t, wtypes.ARC4Struct) + ) + arc4_method = attrs.evolve( + arc4_method, events=list(map(_wtype_to_struct, method_structs)) + ) + arc4_methods.append(arc4_method) # construct unique Subroutine objects for each function # that was referenced through either entry point for func in itertools.chain(approval_subs_srefs, clear_subs_srefs): @@ -273,10 +295,15 @@ def _build_ir(ctx: IRBuildContext, contract: awst_nodes.Contract) -> Contract: description=contract.description, name=contract.name, ref=contract.id, - arc4_methods=folded.arc4_methods, + arc4_methods=arc4_methods, global_state=immutabledict(folded.global_state), local_state=immutabledict(folded.local_state), + boxes=immutabledict(folded.boxes), state_totals=folded.build_state_totals(location=contract.source_location), + structs=immutabledict(_wtypes_to_structs(structs)), + template_variable_types=immutabledict( + TemplateVariableTypeCollector.collect(ctx.subroutines) + ), ), ) return result @@ -423,7 +450,9 @@ def _make_program( class FoldedContract: global_state: dict[str, ContractState] = attrs.field(factory=dict) local_state: dict[str, ContractState] = attrs.field(factory=dict) + boxes: dict[str, ContractState] = attrs.field(factory=dict) arc4_methods: list[ARC4Method] = attrs.field(factory=list) + structs: list[wtypes.ARC4Struct | wtypes.WTuple] = attrs.field(factory=list) declared_totals: awst_nodes.StateTotals | None def build_state_totals(self, *, location: SourceLocation) -> StateTotals: @@ -483,22 +512,20 @@ def _gather_arc4_methods( def _fold_state_and_special_methods( contract: awst_nodes.Contract, -) -> tuple[FoldedContract, dict[awst_nodes.ContractMethod, ARC4MethodConfig]]: +) -> tuple[FoldedContract, dict[awst_nodes.ContractMethod, ARC4Method]]: result = FoldedContract( declared_totals=contract.state_totals, ) + struct_types = list[wtypes.ARC4Struct | wtypes.WTuple]() for state in contract.app_state: - storage_type = wtypes.persistable_stack_type(state.storage_wtype, state.source_location) key_type = None if state.key_wtype is not None: key_type = wtypes.persistable_stack_type(state.key_wtype, state.source_location) - translated = ContractState( - name=state.member_name, - source_location=state.source_location, - key=state.key.value, # TODO: pass encoding? - storage_type=storage_type, - description=state.description, - ) + if _is_arc4_struct(state.key_wtype): + struct_types.append(state.key_wtype) + if _is_arc4_struct(state.storage_wtype): + struct_types.append(state.storage_wtype) + translated = _get_contract_state(state) match state.kind: case awst_nodes.AppStorageKind.app_global: if key_type is not None: @@ -513,17 +540,113 @@ def _fold_state_and_special_methods( ) result.local_state[state.member_name] = translated case awst_nodes.AppStorageKind.box: - pass # TODO: forward these on + result.boxes[state.member_name] = translated case _: typing.assert_never(state.kind) arc4_method_refs = _gather_arc4_methods(contract) + for arc4_method in arc4_method_refs: + for wtype in (arc4_method.return_type, *(arg.wtype for arg in arc4_method.args)): + if _is_arc4_struct(wtype): + struct_types.append(wtype) if arc4_method_refs: - result.arc4_methods = extract_arc4_methods( + methods = extract_arc4_methods( arc4_method_refs, local_state=result.local_state, global_state=result.global_state, ) - return result, arc4_method_refs + result.arc4_methods = list(methods.values()) + else: + methods = {} + result.structs = struct_types + return result, methods + + +def _is_arc4_struct(wtype: wtypes.WType) -> typing.TypeGuard[wtypes.ARC4Struct | wtypes.WTuple]: + return isinstance(wtype, wtypes.ARC4Struct | wtypes.WTuple) and bool(wtype.fields) + + +def _wtypes_to_structs( + structs: Sequence[wtypes.ARC4Struct | wtypes.WTuple], +) -> dict[str, ARC4Struct]: + """ + Produce a unique mapping of struct names to ARC4Struct definitions. + Will recursively include any structs referenced in fields + """ + structs = list(structs) + struct_results = dict[wtypes.ARC4Struct | wtypes.WTuple, ARC4Struct]() + while structs: + struct = structs.pop() + if struct in struct_results: + continue + structs.extend( + wtype + for wtype in struct.fields.values() + if isinstance(wtype, wtypes.ARC4Struct) and wtype not in struct_results + ) + struct_results[struct] = _wtype_to_struct(struct) + return { + wtype.name: struct_results[wtype] for wtype in sorted(struct_results, key=lambda s: s.name) + } + + +def _wtype_to_struct(struct: wtypes.ARC4Struct | wtypes.WTuple) -> ARC4Struct: + fields = [] + for field_name, field_wtype in struct.fields.items(): + if not isinstance(field_wtype, wtypes.ARC4Type): + maybe_arc4_field_wtype = maybe_avm_to_arc4_equivalent_type(field_wtype) + if maybe_arc4_field_wtype is None: + raise InternalError("expected ARC4 type") + field_wtype = maybe_arc4_field_wtype + fields.append( + ARC4StructField( + name=field_name, + type=field_wtype.arc4_name, + struct=field_wtype.name if _is_arc4_struct(field_wtype) else None, + ) + ) + return ARC4Struct( + fullname=struct.name, + desc=struct.desc, + fields=fields, + ) + + +def _get_contract_state(state: awst_nodes.AppStorageDefinition) -> ContractState: + storage_type = wtypes.persistable_stack_type(state.storage_wtype, state.source_location) + if state.key_wtype is not None: + arc56_key_type = _get_arc56_type(state.key_wtype, state.source_location) + is_map = True + else: + arc56_key_type = ( + "AVMString" if state.key.encoding == awst_nodes.BytesEncoding.utf8 else "AVMBytes" + ) + is_map = False + arc56_value_type = _get_arc56_type(state.storage_wtype, state.source_location) + return ContractState( + name=state.member_name, + source_location=state.source_location, + key_or_prefix=state.key.value, + arc56_key_type=arc56_key_type, + arc56_value_type=arc56_value_type, + storage_type=storage_type, + description=state.description, + is_map=is_map, + ) + + +def _get_arc56_type(wtype: wtypes.WType, loc: SourceLocation) -> str: + if isinstance(wtype, wtypes.ARC4Struct): + return wtype.name + if isinstance(wtype, wtypes.ARC4Type): + return wtype.arc4_name + if wtype == wtypes.string_wtype: + return "AVMString" + storage_type = wtypes.persistable_stack_type(wtype, loc) + match storage_type: + case AVMType.uint64: + return "AVMUint64" + case AVMType.bytes: + return "AVMBytes" class SubroutineCollector(FunctionTraverser): @@ -582,3 +705,79 @@ def _enter_func(self, func: awst_nodes.Function) -> Iterator[None]: yield finally: self._func_stack.pop() + + +@attrs.frozen +class EventCollector(FunctionTraverser): + context: IRBuildContext + emits: dict[awst_nodes.Function, StableSet[wtypes.ARC4Struct]] = attrs.field(factory=dict) + _func_stack: list[awst_nodes.Function] = attrs.field(factory=list) + + @classmethod + def collect( + cls, context: IRBuildContext, all_funcs: Iterable[awst_nodes.Function] + ) -> Mapping[awst_nodes.Function, StableSet[wtypes.ARC4Struct]]: + collector = cls(context) + for func in all_funcs: + collector.process_func(func) + return collector.emits + + def process_func(self, func: awst_nodes.Function) -> None: + if func in self.emits: + return + self.emits[func] = StableSet[wtypes.ARC4Struct]() + with self._enter_func(func): + func.body.accept(self) + + @contextlib.contextmanager + def _enter_func(self, func: awst_nodes.Function) -> Iterator[None]: + self._func_stack.append(func) + try: + yield + finally: + self._func_stack.pop() + + @property + def current_func(self) -> awst_nodes.Function: + return self._func_stack[-1] + + def visit_emit(self, emit: awst_nodes.Emit) -> None: + assert isinstance(emit.value.wtype, wtypes.ARC4Struct) + self.emits[self.current_func].add(emit.value.wtype) + + def visit_subroutine_call_expression(self, expr: awst_nodes.SubroutineCallExpression) -> None: + target = self.context.resolve_function_reference( + expr.target, + expr.source_location, + caller=self.current_func, + ) + self.process_func(target) + self.emits[self.current_func] |= self.emits[target] + + +class TemplateVariableTypeCollector(FunctionTraverser): + def __init__(self) -> None: + self.vars = dict[str, awst_nodes.TemplateVar]() + + @classmethod + def collect(cls, functions: Iterable[awst_nodes.Function]) -> dict[str, str]: + collector = cls() + for function in functions: + function.body.accept(collector) + return { + name: _get_arc56_type(var.wtype, var.source_location) + for name, var in collector.vars.items() + } + + def visit_template_var(self, var: awst_nodes.TemplateVar) -> None: + try: + existing = self.vars[var.name] + except KeyError: + self.vars[var.name] = var + else: + if existing.wtype != var.wtype: + logger.error( + "inconsistent types specified for template var", + location=var.source_location, + ) + logger.info("other template var", location=existing.source_location) diff --git a/src/puya/models.py b/src/puya/models.py index f469b9b591..0555f1e195 100644 --- a/src/puya/models.py +++ b/src/puya/models.py @@ -45,14 +45,24 @@ class ARC4CreateOption(enum.Enum): disallow = enum.auto() -def _freeze_list_of_lists(elements: Sequence[Sequence[str]]) -> Sequence[tuple[str, str]]: - return tuple((e1, e2) for (e1, e2) in elements) - - @attrs.frozen -class ARC32StructDef: +class ARC4StructField: name: str - elements: Sequence[tuple[str, str]] = attrs.field(default=(), converter=_freeze_list_of_lists) + type: str + struct: str | None + + +@attrs.frozen(kw_only=True) +class ARC4Struct: + fullname: str + desc: str | None = None + fields: Sequence[ARC4StructField] = attrs.field( + default=(), converter=tuple[ARC4StructField, ...] + ) + + @property + def name(self) -> str: + return self.fullname.rsplit(".", maxsplit=1)[-1] @attrs.frozen(kw_only=True) @@ -60,7 +70,7 @@ class ARC4BareMethodConfig: source_location: SourceLocation allowed_completion_types: Sequence[OnCompletionAction] = attrs.field( default=(OnCompletionAction.NoOp,), - converter=tuple[OnCompletionAction], + converter=tuple[OnCompletionAction, ...], validator=attrs.validators.min_len(1), ) create: ARC4CreateOption = ARC4CreateOption.disallow @@ -79,19 +89,20 @@ class ARC4ABIMethodConfig: readonly: bool = False default_args: immutabledict[str, str] = immutabledict() """Mapping is from parameter -> source""" - structs: immutabledict[str, ARC32StructDef] = immutabledict() @attrs.frozen class ARC4MethodArg: name: str type_: str + struct: str | None desc: str | None = attrs.field(hash=False) @attrs.frozen class ARC4Returns: type_: str + struct: str | None desc: str | None = attrs.field(hash=False) @@ -101,8 +112,13 @@ class ARC4ABIMethod: desc: str | None = attrs.field(hash=False) args: Sequence[ARC4MethodArg] = attrs.field(converter=tuple[ARC4MethodArg, ...]) returns: ARC4Returns + events: Sequence[ARC4Struct] config: ARC4ABIMethodConfig + @property + def signature(self) -> str: + return f"{self.name}({','.join(a.type_ for a in self.args)}){self.returns.type_}" + @attrs.frozen class ARC4BareMethod: @@ -114,9 +130,14 @@ class ARC4BareMethod: class ContractState: name: str source_location: SourceLocation - key: bytes + key_or_prefix: bytes + """Key value as bytes, or prefix if it is a map""" + arc56_key_type: str + arc56_value_type: str storage_type: typing.Literal[AVMType.uint64, AVMType.bytes] description: str | None + is_map: bool + """State describes a map""" @attrs.frozen(kw_only=True) @@ -145,8 +166,12 @@ class ContractMetaData: description: str | None global_state: immutabledict[str, ContractState] local_state: immutabledict[str, ContractState] + boxes: immutabledict[str, ContractState] state_totals: StateTotals arc4_methods: Sequence[ARC4Method] + structs: immutabledict[str, ARC4Struct] + template_variable_types: immutabledict[str, str] + """Mapping of template variable names to their ARC-56 type""" @property def is_arc4(self) -> bool: @@ -174,6 +199,8 @@ class DebugEvent(typing.TypedDict, total=False): """Variable names on the stack AFTER the next op executes""" defined_out: Sequence[str] """Variable names that are defined AFTER the next op executes""" + error: str + """Error message if failure occurs at this op""" @attrs.frozen @@ -202,6 +229,10 @@ def bytecode(self) -> bytes | None: @abc.abstractmethod def debug_info(self) -> DebugInfo | None: ... + @property + @abc.abstractmethod + def template_variables(self) -> Mapping[str, int | bytes | None]: ... + class CompiledContract(abc.ABC): @property diff --git a/src/puya/options.py b/src/puya/options.py index 0a6ac6334e..0dcc6d5c35 100644 --- a/src/puya/options.py +++ b/src/puya/options.py @@ -18,6 +18,7 @@ class PuyaOptions: output_teal: bool = False output_source_map: bool = False output_arc32: bool = False + output_arc56: bool = False output_ssa_ir: bool = False output_optimization_ir: bool = False output_destructured_ir: bool = False diff --git a/src/puya/ussemble/assemble.py b/src/puya/ussemble/assemble.py index a2a7eac6c9..adcd3883ab 100644 --- a/src/puya/ussemble/assemble.py +++ b/src/puya/ussemble/assemble.py @@ -90,6 +90,10 @@ def get_label_offset(label: models.Label) -> int: pc_ops, pc_events, ), + template_variables={ + var: value[0] if var in ctx.provided_template_variables else None + for var, value in ctx.template_variables.items() + }, ) @@ -108,6 +112,8 @@ def _add_op_debug_events( event["callsub"] = subroutine_ids[func_block] elif op.op_code == "retsub": event["retsub"] = True + elif op.op_code in ("assert", "err") and op.comment: + event["error"] = op.comment event["op"] = op.teal() for sm in op.stack_manipulations: diff --git a/src/puya/ussemble/context.py b/src/puya/ussemble/context.py index a25b89b626..48081046d5 100644 --- a/src/puya/ussemble/context.py +++ b/src/puya/ussemble/context.py @@ -1,3 +1,5 @@ +from collections.abc import Mapping + import attrs from puya.context import CompileContext @@ -6,5 +8,19 @@ @attrs.frozen(kw_only=True) class AssembleContext(CompileContext): - template_variables: dict[str, TemplateValue] = attrs.field(factory=dict) - offset_pc_from_constant_blocks: bool + mocked_template_variables: dict[str, TemplateValue] = attrs.field(factory=dict) + """Mocked template variables, used for generating debug info only""" + provided_template_variables: dict[str, TemplateValue] = attrs.field(factory=dict) + """Template variables provided via command line, or compilation""" + + @property + def template_variables(self) -> Mapping[str, TemplateValue]: + return { + **self.mocked_template_variables, + **self.provided_template_variables, + } + + @property + def offset_pc_from_constant_blocks(self) -> bool: + # only need to offset PC if there are any unspecified template variables + return bool(self.mocked_template_variables) diff --git a/src/puya/ussemble/main.py b/src/puya/ussemble/main.py index dc1f7e9f04..a24e48f83d 100644 --- a/src/puya/ussemble/main.py +++ b/src/puya/ussemble/main.py @@ -16,25 +16,25 @@ def assemble_program( *, debug_only: bool = False, ) -> models.AssembledProgram: + int_template_vars = _gather_template_variables(program, teal.IntBlock) + bytes_template_vars = _gather_template_variables(program, teal.BytesBlock) + program_template_vars = {*int_template_vars, *bytes_template_vars} if debug_only: # use dummy template values to produce a debug map - program_variables: Mapping[str, TemplateValue] = { - **{t: (0, None) for t in _gather_template_variables(program, teal.IntBlock)}, - **{t: (b"", None) for t in _gather_template_variables(program, teal.BytesBlock)}, - } - offset_pc = any(program_variables.keys() - template_variables.keys()) - template_variables = { - **program_variables, - **template_variables, + mocked_template_variables: Mapping[str, TemplateValue] = { + **{t: (0, None) for t in int_template_vars if t not in template_variables}, + **{t: (b"", None) for t in bytes_template_vars if t not in template_variables}, } else: - offset_pc = False + mocked_template_variables = {} assemble_ctx = attrs_extend( AssembleContext, ctx, - template_variables=template_variables, - offset_pc_from_constant_blocks=offset_pc, + provided_template_variables={ + t: v for t, v in template_variables.items() if t in program_template_vars + }, + mocked_template_variables=mocked_template_variables, ) return assemble_bytecode_and_debug_info(assemble_ctx, program) diff --git a/src/puya/ussemble/models.py b/src/puya/ussemble/models.py index 2566b6effe..cf8a25857f 100644 --- a/src/puya/ussemble/models.py +++ b/src/puya/ussemble/models.py @@ -1,4 +1,4 @@ -from collections.abc import Sequence +from collections.abc import Mapping, Sequence import attrs @@ -33,3 +33,5 @@ def op_spec(self) -> OpSpec: class AssembledProgram: bytecode: bytes debug_info: DebugInfo + template_variables: Mapping[str, int | bytes | None] + """Indicates template variable values used in compilation""" diff --git a/src/puyapy/__main__.py b/src/puyapy/__main__.py index 2ed2988716..94c3bdb002 100644 --- a/src/puyapy/__main__.py +++ b/src/puyapy/__main__.py @@ -45,6 +45,12 @@ def main() -> None: default=True, help="Output {contract}.arc32.json ARC-32 app spec file", ) + parser.add_argument( + "--output-arc56", + action=argparse.BooleanOptionalAction, + default=False, + help="Output {contract}.arc56.json ARC-56 app spec file", + ) parser.add_argument( "--output-client", action=argparse.BooleanOptionalAction, diff --git a/src/puyapy/awst_build/arc32_client_gen.py b/src/puyapy/awst_build/arc32_client_gen.py deleted file mode 100644 index 3b1d6dcf41..0000000000 --- a/src/puyapy/awst_build/arc32_client_gen.py +++ /dev/null @@ -1,142 +0,0 @@ -import itertools -import textwrap -import typing -from collections.abc import Iterable, Sequence -from pathlib import Path - -from puya import log -from puya.models import ( - ARC4ABIMethod, - ARC4CreateOption, - ARC4Method, - ARC4MethodArg, - ARC32StructDef, - OnCompletionAction, -) -from puya.utils import make_path_relative_to_cwd, unique - -from puyapy.awst_build import constants -from puyapy.awst_build.arc4_utils import arc4_to_pytype - -logger = log.get_logger(__name__) - -_AUTO_GENERATED_COMMENT = "# This file is auto-generated, do not modify" -_INDENT = " " * 4 - - -def write_arc32_client(name: str, methods: Sequence[ARC4Method], out_dir: Path) -> None: - stub_path = out_dir / f"client_{name}.py" - if _can_overwrite_auto_generated_file(stub_path): - logger.info(f"writing {make_path_relative_to_cwd(stub_path)}") - stub_text = _create_arc32_stub(name, methods) - stub_path.write_text(stub_text) - else: - logger.error( - f"Not outputting {make_path_relative_to_cwd(stub_path)} " - "since content does not appear to be auto-generated" - ) - - -def _can_overwrite_auto_generated_file(path: Path) -> bool: - return not path.exists() or path.read_text().startswith(_AUTO_GENERATED_COMMENT) - - -def _create_arc32_stub(name: str, methods: Sequence[ARC4Method]) -> str: - abi_methods = [m for m in methods if isinstance(m, ARC4ABIMethod)] - return "\n".join( - ( - _AUTO_GENERATED_COMMENT, - "# flake8: noqa", # this works for flake8 and ruff - "# fmt: off", # disable formatting" - "import typing", - "", - "import algopy", - "", - *itertools.chain( - *( - _abi_struct_to_class(s) - for s in unique(s for m in abi_methods for s in m.config.structs.values()) - ) - ), - "", - f"class {name}(algopy.arc4.ARC4Client, typing.Protocol):", - *([_indent(["pass"]), ""] if not abi_methods else []), - *(_abi_method_to_signature(m) for m in abi_methods), - ) - ) - - -def _abi_struct_to_class(s: ARC32StructDef) -> Iterable[str]: - return ( - f"class {s.name}(algopy.arc4.Struct):", - _indent( - f"{name}: {_arc4_type_to_algopy_cls(elem_type)}" for name, elem_type in s.elements - ), - ) - - -def _abi_method_to_signature(m: ARC4ABIMethod) -> str: - structs = dict(m.config.structs) - try: - output_struct = structs["output"] - except KeyError: - return_type = _arc4_type_to_algopy_cls(m.returns.type_) - else: - return_type = output_struct.name - - return _indent( - ( - _arc4_method_to_decorator(m), - f"def {m.name}(", - _indent( - ( - "self,", - *(_abi_arg(arg, structs.get(arg.name)) for arg in m.args), - ) - ), - f") -> {return_type}: ...", - "", - ) - ) - - -def _abi_arg(arg: ARC4MethodArg, struct: ARC32StructDef | None) -> str: - python_type = struct.name if struct else _arc4_type_to_algopy_cls(arg.type_) - return f"{arg.name}: {python_type}," - - -def _arc4_type_to_algopy_cls(typ: str) -> str: - return str(arc4_to_pytype(typ)) - - -def _arc4_method_to_decorator(method: ARC4ABIMethod) -> str: - config = method.config - abimethod_args = dict[str, object]() - if config.name and config.name != method.name: - abimethod_args["name"] = config.name - if config.readonly: - abimethod_args["readonly"] = True - if config.default_args: - abimethod_args["default_args"] = dict(config.default_args) - if config.allowed_completion_types != (OnCompletionAction.NoOp,): - abimethod_args["allow_actions"] = [oca.name for oca in config.allowed_completion_types] - match config.create: - case ARC4CreateOption.allow: - abimethod_args["create"] = "allow" - case ARC4CreateOption.require: - abimethod_args["create"] = "require" - case ARC4CreateOption.disallow: - pass - case invalid: - typing.assert_never(invalid) - kwargs = ", ".join(f"{name}={value!r}" for name, value in abimethod_args.items()) - decorator = f"@{constants.ABIMETHOD_DECORATOR_ALIAS}" - if kwargs: - decorator += f"({kwargs})" - return decorator - - -def _indent(lines: Iterable[str] | str) -> str: - if not isinstance(lines, str): - lines = "\n".join(lines) - return textwrap.indent(lines, _INDENT) diff --git a/src/puyapy/awst_build/arc4_client_gen.py b/src/puyapy/awst_build/arc4_client_gen.py new file mode 100644 index 0000000000..b50857a715 --- /dev/null +++ b/src/puyapy/awst_build/arc4_client_gen.py @@ -0,0 +1,212 @@ +import textwrap +from collections.abc import Iterable, Sequence +from pathlib import Path + +from puya import ( + arc56_models as arc56, + log, +) +from puya.errors import CodeError +from puya.models import ( + OnCompletionAction, +) +from puya.utils import make_path_relative_to_cwd + +from puyapy.awst_build import constants +from puyapy.awst_build.arc4_utils import arc4_to_pytype + +logger = log.get_logger(__name__) + +_AUTO_GENERATED_COMMENT = "# This file is auto-generated, do not modify" +_INDENT = " " * 4 + + +def write_arc4_client(contract: arc56.Contract, out_dir: Path) -> None: + stub_path = out_dir / f"client_{contract.name}.py" + if _can_overwrite_auto_generated_file(stub_path): + logger.info(f"writing {make_path_relative_to_cwd(stub_path)}") + stub_text = _ClientGenerator.generate(contract) + stub_path.write_text(stub_text) + else: + logger.error( + f"Not outputting {make_path_relative_to_cwd(stub_path)} " + "since content does not appear to be auto-generated" + ) + + +def _can_overwrite_auto_generated_file(path: Path) -> bool: + return not path.exists() or path.read_text().startswith(_AUTO_GENERATED_COMMENT) + + +class _ClientGenerator: + + def __init__(self, contract: arc56.Contract): + self.contract = contract + self.python_methods = set[str]() + self.struct_to_class = dict[str, str]() + self.reserved_class_names = {contract.name} + self.reserved_method_names = set[str]() + self.class_decls = list[str]() + + @classmethod + def generate(cls, contract: arc56.Contract) -> str: + return cls(contract)._gen() # noqa: SLF001 + + def _gen(self) -> str: + # generate class definitions for any referenced structs in methods + # don't generate from self.contract.structs as it may contain other struct definitions + for method in self.contract.methods: + for struct in filter(None, (method.returns.struct, *(a.struct for a in method.args))): + if struct not in self.struct_to_class and ( + struct_def := self.contract.structs.get(struct) + ): + self._prepare_struct_class(struct, struct_def) + return "\n".join( + ( + _AUTO_GENERATED_COMMENT, + "# flake8: noqa", # this works for flake8 and ruff + "# fmt: off", # disable formatting" + "import typing", + "", + "import algopy", + "", + *self.class_decls, + "", + f"class {self.contract.name}(algopy.arc4.ARC4Client, typing.Protocol):", + # TODO: include docstring + *self._gen_methods(), + ) + ) + + def _prepare_struct_class(self, name: str, fields: Sequence[arc56.StructField]) -> str: + python_name = self._unique_class(name) + self.struct_to_class[name] = python_name + lines = [f"class {python_name}(algopy.arc4.Struct):"] + # TODO: include docstring + for field in fields: + if isinstance(field.type, str): + typ = self._get_client_type(field.type) + else: + # generate anonymous struct type + anon_struct = f"{name}_{field.name}" + typ = self._prepare_struct_class(anon_struct, field.type) + lines.append(_indent(f"{field.name}: {typ}")) + # TODO: include docstring + if self.class_decls: + self.class_decls.append("") + self.class_decls.extend(lines) + return python_name + + def _get_client_type(self, typ: str) -> str: + # map ABI / AVM type to algopy type + if typ == arc56.AVMType.uint64: + return "algopy.UInt64" + elif typ == arc56.AVMType.bytes: + return "algopy.Bytes" + elif struct := self.contract.structs.get(typ): + try: + # use existing definition + return self.struct_to_class[typ] + except KeyError: + # generate and return class name + return self._prepare_struct_class(typ, struct) + else: + return str(arc4_to_pytype(typ, None)) + + def _unique_class(self, name: str) -> str: + base_name = name + seq = 1 + while name in self.reserved_class_names: + seq += 1 + name = f"{base_name}{seq}" + + self.reserved_class_names.add(name) + return name + + def _unique_method(self, name: str) -> str: + base_name = name + seq = 1 + while name in self.reserved_method_names: + seq += 1 + name = f"{base_name}{seq}" + + self.reserved_method_names.add(name) + return name + + def _gen_methods(self) -> Iterable[str]: + if not self.contract.methods: + yield _indent("pass") + yield "" + else: + for method in self.contract.methods: + yield self._gen_method(method) + + def _gen_method(self, method: arc56.Method) -> str: + return_type = self._get_client_type(method.returns.struct or method.returns.type) + python_method = self._unique_method(method.name) + return _indent( + ( + _arc4_method_to_decorator(python_method, method), + f"def {python_method}(", + # TODO: include docstring + _indent( + ( + "self,", + *(self._gen_arg(arg) for arg in method.args), + ) + ), + f") -> {return_type}: ...", + "", + ) + ) + + def _gen_arg(self, arg: arc56.MethodArg) -> str: + python_type = self._get_client_type(arg.struct or arg.type) + return f"{arg.name}: {python_type}," + + +def _arc4_method_to_decorator(python_method: str, method: arc56.Method) -> str: + abimethod_args = dict[str, object]() + if method.name != python_method: + abimethod_args["name"] = method.name + if method.readonly: + abimethod_args["readonly"] = True + if not _compatible_actions(method.actions.create, method.actions.call): + # TODO: support this, once decorators support it + raise CodeError( + f"unsupported on completion combination for generating an ARC4 client" + f" for method: {method.name}" + ) + actions = sorted( + {*method.actions.create, *method.actions.call}, key=lambda a: OnCompletionAction[a] + ) + if set(actions) != {OnCompletionAction.NoOp.name}: + abimethod_args["allow_actions"] = actions + if method.actions.create and method.actions.call: + abimethod_args["create"] = "allow" + elif method.actions.create: + abimethod_args["create"] = "require" + else: + # disallow is default + pass + kwargs = ", ".join(f"{name}={value!r}" for name, value in abimethod_args.items()) + decorator = f"@{constants.ABIMETHOD_DECORATOR_ALIAS}" + if kwargs: + decorator += f"({kwargs})" + return decorator + + +def _compatible_actions(create: Sequence[str], call: Sequence[str]) -> bool: + if not create: + return True + if not call: + return True + # if both collections are present, then they are compatible if everything in + # create is also in call + return all(a in call for a in create) + + +def _indent(lines: Iterable[str] | str) -> str: + if not isinstance(lines, str): + lines = "\n".join(lines) + return textwrap.indent(lines, _INDENT) diff --git a/src/puyapy/awst_build/arc4_utils.py b/src/puyapy/awst_build/arc4_utils.py index 5cffa47e76..58d0306469 100644 --- a/src/puyapy/awst_build/arc4_utils.py +++ b/src/puyapy/awst_build/arc4_utils.py @@ -14,7 +14,8 @@ ARC4ABIMethodConfig, ARC4BareMethodConfig, ARC4CreateOption, - ARC32StructDef, + ARC4Struct, + ARC4StructField, OnCompletionAction, TransactionType, ) @@ -201,13 +202,6 @@ def get_arc4_abimethod_data( case invalid_default_args_option: context.error(f"invalid default_args option: {invalid_default_args_option}", dec_loc) - # extract "structs" from signature - structs = dict[str, ARC32StructDef]() - for n, pt in func_types.items(): - mapped_type = pytype_to_arc4_pytype(pt, on_error=lambda t: t) - if _is_arc4_struct(mapped_type): - structs[n] = _pytype_to_struct_def(mapped_type) - config = ARC4ABIMethodConfig( source_location=dec_loc, allowed_completion_types=allowed_completion_types, @@ -215,7 +209,6 @@ def get_arc4_abimethod_data( name=name, readonly=readonly, default_args=immutabledict(default_args), - structs=immutabledict(structs), ) return ARC4ABIMethodData( member_name=func_def.name, @@ -310,10 +303,17 @@ def visit_dict_expr(self, o: mypy.nodes.DictExpr) -> dict[object, object]: return {key.accept(self) if key else None: value.accept(self) for key, value in o.items} -def _pytype_to_struct_def(typ: pytypes.StructType) -> ARC32StructDef: - return ARC32StructDef( - name=typ.name.rsplit(".", maxsplit=1)[-1], - elements=[(n, pytype_to_arc4(t)) for n, t in typ.fields.items()], +def _pytype_to_struct_def(typ: pytypes.StructType) -> ARC4Struct: + return ARC4Struct( + fullname=typ.name, + fields=[ + ARC4StructField( + name=n, + type=pytype_to_arc4(t), + struct=t.name if pytypes.ARC4StructBaseType in t.mro else None, + ) + for n, t in typ.fields.items() + ], ) @@ -359,6 +359,7 @@ def pytype_to_arc4_pytype( case pytypes.NamedTupleType(): return pytypes.StructType( base=pytypes.ARC4StructBaseType, + desc=pytype.desc, name=pytype.name, fields={ name: pytype_to_arc4_pytype(t, on_error) for name, t in pytype.fields.items() diff --git a/src/puyapy/awst_build/eb/arc4/emit.py b/src/puyapy/awst_build/eb/arc4/emit.py index 47c725a94a..bed2d1a745 100644 --- a/src/puyapy/awst_build/eb/arc4/emit.py +++ b/src/puyapy/awst_build/eb/arc4/emit.py @@ -3,18 +3,17 @@ import mypy.nodes from puya import log -from puya.awst.nodes import MethodConstant +from puya.awst.nodes import Emit from puya.parse import SourceLocation -from puyapy.awst_build import intrinsic_factory, pytypes +from puyapy.awst_build import pytypes from puyapy.awst_build.arc4_utils import pytype_to_arc4 from puyapy.awst_build.eb import _expect as expect from puyapy.awst_build.eb._base import FunctionBuilder from puyapy.awst_build.eb.arc4._utils import get_arc4_signature -from puyapy.awst_build.eb.arc4.tuple import ARC4TupleGenericTypeBuilder +from puyapy.awst_build.eb.arc4.struct import ARC4StructTypeBuilder from puyapy.awst_build.eb.interface import InstanceBuilder, NodeBuilder from puyapy.awst_build.eb.none import NoneExpressionBuilder -from puyapy.awst_build.eb.tuple import TupleLiteralBuilder logger = log.get_logger(__name__) @@ -33,7 +32,6 @@ def call( case InstanceBuilder( pytype=pytypes.StructType() as struct_type ) as event_arg_eb if pytypes.ARC4StructBaseType < struct_type: - event_name = struct_type.name.split(".")[-1] if rest: logger.error( "unexpected additional arguments", location=rest[0].source_location @@ -46,18 +44,28 @@ def call( location=first.source_location, ) arc4_args = signature.convert_args(rest) - event_name = signature.method_name - event_arg_eb = ARC4TupleGenericTypeBuilder(location).call( - args=[TupleLiteralBuilder(items=arc4_args, location=location)], - arg_names=[None], - arg_kinds=[mypy.nodes.ARG_POS], + # emit requires a struct type, so generate one based on args + struct_type = pytypes.StructType( + base=pytypes.ARC4StructBaseType, + name=signature.method_name, + desc=None, + fields={ + f"field{idx}": arg.pytype for idx, arg in enumerate(arc4_args, start=1) + }, + frozen=True, + source_location=location, + ) + event_arg_eb = ARC4StructTypeBuilder(struct_type, location).call( + args=arc4_args, + arg_names=[None] * len(arc4_args), + arg_kinds=[mypy.nodes.ARG_POS] * len(arc4_args), location=location, ) + event_name = struct_type.name.split(".")[-1] event_sig = f"{event_name}{pytype_to_arc4(event_arg_eb.pytype, location)}" - log_value = intrinsic_factory.concat( - MethodConstant(value=event_sig, source_location=location), - event_arg_eb.resolve(), - location, + emit = Emit( + signature=event_sig, + value=event_arg_eb.resolve(), + source_location=location, ) - log_expr = intrinsic_factory.log(log_value, location) - return NoneExpressionBuilder(log_expr) + return NoneExpressionBuilder(emit) diff --git a/src/puyapy/awst_build/module.py b/src/puyapy/awst_build/module.py index c162f56887..6ee13f8971 100644 --- a/src/puyapy/awst_build/module.py +++ b/src/puyapy/awst_build/module.py @@ -706,6 +706,7 @@ def _process_struct( struct_typ = pytypes.StructType( base=base, name=cdef.fullname, + desc=cdef.docstring, fields=fields, frozen=frozen, source_location=cls_loc, @@ -723,6 +724,7 @@ def _process_named_tuple( cls_loc = context.node_location(cdef) named_tuple_type = pytypes.NamedTupleType( name=cdef.fullname, + desc=cdef.docstring, fields=fields, source_location=cls_loc, ) diff --git a/src/puyapy/awst_build/pytypes.py b/src/puyapy/awst_build/pytypes.py index d7ca6f9544..4b8a9b8f0e 100644 --- a/src/puyapy/awst_build/pytypes.py +++ b/src/puyapy/awst_build/pytypes.py @@ -354,6 +354,7 @@ class NamedTupleType(TupleType, RuntimeType): generic: None = attrs.field(default=None, init=False) bases: tuple[PyType, ...] = attrs.field(default=(NamedTupleBaseType,), init=False) mro: tuple[PyType, ...] = attrs.field(default=(NamedTupleBaseType,), init=False) + desc: str | None = None wtype: wtypes.WTuple = attrs.field(init=False) @items.default @@ -369,6 +370,8 @@ def _wtype(self) -> wtypes.WTuple: unnamed_type, name=self.name, names=tuple(self.fields), + source_location=self.source_location, + desc=self.desc, ) @@ -472,6 +475,7 @@ class StructType(RuntimeType): wtype: wtypes.WType source_location: SourceLocation | None generic: None = None + desc: str | None = None @cached_property def names(self) -> tuple[str, ...]: @@ -486,6 +490,7 @@ def __init__( *, base: PyType, name: str, + desc: str | None, fields: Mapping[str, PyType], frozen: bool, source_location: SourceLocation | None, @@ -501,12 +506,17 @@ def __init__( else: raise InternalError(f"Unknown struct base type: {base}", source_location) wtype = wtype_cls( - fields=field_wtypes, name=name, frozen=frozen, source_location=source_location + fields=field_wtypes, + name=name, + desc=desc, + frozen=frozen, + source_location=source_location, ) self.__attrs_init__( bases=[base], mro=[base], name=name, + desc=desc, wtype=wtype, fields=fields, frozen=frozen, diff --git a/src/puyapy/client_gen.py b/src/puyapy/client_gen.py index b724c633f0..74503b4086 100644 --- a/src/puyapy/client_gen.py +++ b/src/puyapy/client_gen.py @@ -1,27 +1,24 @@ import argparse import json import typing -from collections.abc import Iterable, Mapping, Sequence +from collections.abc import Iterable, Sequence from pathlib import Path import attrs -from immutabledict import immutabledict -from puya import log +from cattrs.preconf.json import make_converter +from puya import ( + arc56_models as arc56, + log, +) from puya.arc32 import OCA_ARC32_MAPPING +from puya.arc56 import allowed_call_oca, allowed_create_oca from puya.errors import PuyaError from puya.models import ( - ARC4ABIMethod, - ARC4ABIMethodConfig, - ARC4CreateOption, - ARC4Method, ARC4MethodArg, ARC4Returns, - ARC32StructDef, - OnCompletionAction, ) -from puya.parse import SourceLocation -from puyapy.awst_build.arc32_client_gen import write_arc32_client +from puyapy.awst_build.arc4_client_gen import write_arc4_client logger = log.get_logger(__name__) ARC32_OCA_MAPPING = {v: k for k, v in OCA_ARC32_MAPPING.items()} @@ -31,6 +28,7 @@ class PuyaGenOptions: paths: Sequence[Path] = attrs.field(default=(), repr=lambda p: str(list(map(str, p)))) log_level: log.LogLevel = log.LogLevel.info + out_dir: Path | None = None def main() -> None: @@ -38,25 +36,45 @@ def main() -> None: prog="puyapy-clientgen", formatter_class=argparse.ArgumentDefaultsHelpFormatter, description="Output algopy contract client for typed ARC4 ABI calls from an " - "ARC32 application.json spec", + "ARC-32 or ARC-56 application spec", + ) + parser.add_argument( + "--out-dir", + type=Path, + help="Path for outputting client, defaults to app spec folder", + default=False, ) parser.add_argument("paths", type=Path, nargs="+", metavar="PATH") options = PuyaGenOptions() parser.parse_args(namespace=options) log.configure_logging(min_log_level=options.log_level) - output_stubs(options.paths) + output_stubs(options.paths, options.out_dir) -def output_stubs(paths: Sequence[Path]) -> None: +def output_stubs(paths: Sequence[Path], out_dir: Path | None) -> None: try: app_spec_paths = resolve_app_specs(paths) for app_spec_path in app_spec_paths: - name, methods = parse_app_spec_methods(app_spec_path.read_text("utf8")) - write_arc32_client(name, methods, app_spec_path.parent) + app_spec_json = app_spec_path.read_text("utf8") + if app_spec_path.name.endswith(".arc56.json"): + app_spec = parse_arc56(app_spec_json) + else: + # TODO: use algokit_utils to do this conversion when it is available? + app_spec = _convert_arc32_to_arc56(app_spec_json) + write_arc4_client(app_spec, out_dir or app_spec_path.parent) except PuyaError as ex: logger.error(str(ex)) # noqa: TRY400 +def _convert_arc32_to_arc56(app_spec_json: str) -> arc56.Contract: + name, structs, methods = _parse_arc32_app_spec_methods(app_spec_json) + return arc56.Contract( + name=name, + structs=structs, + methods=methods, + ) + + def resolve_app_specs(paths: Sequence[Path]) -> Sequence[Path]: app_specs = list[Path]() for path in paths: @@ -75,36 +93,58 @@ def resolve_app_specs(paths: Sequence[Path]) -> Sequence[Path]: return app_specs -def parse_app_spec_methods(app_spec_json: str) -> tuple[str, Sequence[ARC4Method]]: +def parse_arc56(app_spec_json: str) -> arc56.Contract: + converter = make_converter(omit_if_default=True) + return converter.loads(app_spec_json, arc56.Contract) + + +def _parse_arc32_app_spec_methods( + app_spec_json: str, +) -> tuple[str, dict[str, Sequence[arc56.StructField]], Sequence[arc56.Method]]: + # only need to parse a limited subset of ARC32 for client generation + # i.e. ABI methods, their OCA parameters, and any struct info + # default args are ignored as they aren't supported for on chain calls currently + app_spec = json.loads(app_spec_json) contract = app_spec["contract"] hints = app_spec["hints"] contract_name = contract["name"] - methods = list[ARC4Method]() + methods = list[arc56.Method]() arc4_methods = {m.signature: m for m in _parse_methods(contract["methods"])} + known_structs = dict[str, Sequence[arc56.StructField]]() for arc4_method in arc4_methods.values(): method_hints = hints[str(arc4_method.signature)] - create_option, allowed_oca = _call_config(method_hints["call_config"]) + arg_to_struct = dict[str, str]() + for param, struct_name, struct in _parse_structs(method_hints.get("structs", {})): + for known_struct_name, known_struct in known_structs.items(): + if known_struct == struct: + arg_to_struct[param] = known_struct_name + break + else: + known_structs[struct_name] = struct + arg_to_struct[param] = struct_name methods.append( - ARC4ABIMethod( - name=arc4_method.python_name, + arc56.Method( + name=arc4_method.signature.name, desc=arc4_method.desc, - args=arc4_method.signature.args, - returns=arc4_method.signature.returns, - config=ARC4ABIMethodConfig( - source_location=SourceLocation(file=None, line=1), - name=arc4_method.signature.name, - create=create_option, - readonly=bool(method_hints.get("read_only") or arc4_method.readonly), - allowed_completion_types=allowed_oca, - default_args=immutabledict( - _default_args(method_hints.get("default_arguments", {}), arc4_methods) - ), - structs=immutabledict(_structs(method_hints.get("structs", {}))), + args=[ + arc56.MethodArg( + name=a.name, + type=a.type_, + struct=arg_to_struct.get(a.name), + ) + for a in arc4_method.signature.args + ], + returns=arc56.MethodReturns( + type=arc4_method.signature.returns.type_, + desc=arc4_method.desc, + struct=arg_to_struct.get("output"), ), + readonly=bool(method_hints.get("read_only") or arc4_method.readonly), + actions=_parse_call_config(method_hints["call_config"]), ) ) - return contract_name, methods + return contract_name, known_structs, methods @attrs.frozen(kw_only=True) @@ -120,22 +160,17 @@ def __str__(self) -> str: @attrs.frozen(kw_only=True) class _Method: signature: _MethodSignature - python_name: str desc: str | None readonly: bool | None def _parse_methods(methods: list[dict[str, typing.Any]]) -> Iterable[_Method]: - arc4_names = dict[str, int]() for method in methods: signature = _parse_signature(method) - name_seen = arc4_names[signature.name] = arc4_names.get(signature.name, 0) + 1 yield _Method( signature=signature, desc=method.get("desc"), readonly=method.get("readonly"), - # de-duplicate potential collisions - python_name=signature.name if name_seen == 1 else f"{signature.name}{name_seen}", ) @@ -148,57 +183,48 @@ def _parse_signature(method: dict[str, typing.Any]) -> _MethodSignature: name=arg["name"], type_=arg["type"], desc=arg.get("desc"), + struct=arg.get("struct"), ) for arg in method["args"] ), returns=ARC4Returns( type_=returns["type"], desc=returns.get("desc"), + struct=returns.get("struct"), ), ) -def _call_config( - method_call_config: dict[str, str] -) -> tuple[ARC4CreateOption, Sequence[OnCompletionAction]]: - try: - (call_config,) = set(method_call_config.values()) - except ValueError as ex: - raise PuyaError("Different call configs for a single method not supported") from ex - match call_config: - case "CREATE": - create_option = ARC4CreateOption.require - case "ALL": - create_option = ARC4CreateOption.allow - case "CALL": - create_option = ARC4CreateOption.disallow - case invalid: - raise PuyaError(f"invalid call config option: {invalid}") - allowed_oca = [ARC32_OCA_MAPPING[a] for a in method_call_config] - return create_option, allowed_oca - - -def _default_args( - default_args: dict[str, typing.Any], arc32_python_sig: Mapping[_MethodSignature, _Method] -) -> Iterable[tuple[str, str]]: - for param, default_arg_config in default_args.items(): - data = default_arg_config["data"] - source = default_arg_config["source"] - match source: - case "global-state": - yield param, data - case "local-state": - yield param, data - case "abi-method": - signature = _parse_signature(data) - yield param, arc32_python_sig[signature].python_name - case _: - raise PuyaError(f"Unsupported source '{source}' for default argument: {param}") - - -def _structs(structs: dict[str, dict[str, typing.Any]]) -> Iterable[tuple[str, ARC32StructDef]]: +def _parse_call_config(method_call_config: dict[str, str]) -> arc56.MethodActions: + create = [] + call = [] + for oca, call_config in method_call_config.items(): + action = ARC32_OCA_MAPPING[oca].name + match call_config: + case "CREATE" if allowed_create_oca(action): + create.append(action) + case "CALL" if allowed_call_oca(action): + call.append(action) + # allowed creates is narrower than calls so only need to check that + case "ALL" if allowed_create_oca(action): + create.append(action) + call.append(action) + case invalid: + raise PuyaError(f"invalid call config option: {invalid}") + + return arc56.MethodActions( + create=create, + call=call, + ) + + +def _parse_structs( + structs: dict[str, dict[str, typing.Any]] +) -> Iterable[tuple[str, str, Sequence[arc56.StructField]]]: for param, struct_config in structs.items(): - yield param, ARC32StructDef(name=struct_config["name"], elements=struct_config["elements"]) + yield param, struct_config["name"], [ + arc56.StructField(name=f[0], type=f[1]) for f in struct_config["elements"] + ] if __name__ == "__main__": diff --git a/src/puyapy/compile.py b/src/puyapy/compile.py index f8520691de..e024b6a265 100644 --- a/src/puyapy/compile.py +++ b/src/puyapy/compile.py @@ -16,7 +16,7 @@ import mypy.util from packaging import version from puya import log, models -from puya.arc32 import create_arc32_json +from puya.arc56 import create_arc56_json from puya.awst.nodes import AWST from puya.awst.serialize import awst_to_json from puya.awst.to_code_visitor import ToCodeVisitor @@ -24,9 +24,9 @@ from puya.errors import log_exceptions from puya.utils import make_path_relative_to_cwd -from puyapy.awst_build.arc32_client_gen import write_arc32_client +from puyapy.awst_build.arc4_client_gen import write_arc4_client from puyapy.awst_build.main import transform_ast -from puyapy.client_gen import parse_app_spec_methods +from puyapy.client_gen import parse_arc56 from puyapy.options import PuyaPyOptions from puyapy.parse import TYPESHED_PATH, ParseResult, parse_and_typecheck from puyapy.utils import determine_out_dir @@ -79,12 +79,13 @@ def compile_to_teal(puyapy_options: PuyaPyOptions) -> None: ) log_ctx.exit_if_errors() if puyapy_options.output_client: - write_arc32_clients(compilation_set, teal) + write_arc32_clients(puyapy_options.template_vars_prefix, compilation_set, teal) # needs to be outside the with block log_ctx.exit_if_errors() def write_arc32_clients( + template_prefix: str, compilation_set: Mapping[models.ContractReference | models.LogicSigReference, Path], artifacts: Sequence[models.CompilationArtifact], ) -> None: @@ -92,16 +93,17 @@ def write_arc32_clients( if isinstance(artifact, models.CompiledContract) and artifact.metadata.is_arc4: contract_out_dir = compilation_set.get(artifact.id) if contract_out_dir: - app_spec_json = create_arc32_json( - artifact.approval_program.teal_src, - artifact.clear_program.teal_src, - artifact.metadata, + app_spec_json = create_arc56_json( + approval_program=artifact.approval_program, + clear_program=artifact.clear_program, + metadata=artifact.metadata, + template_prefix=template_prefix, ) - # use round trip of ARC32 -> reparse to ensure consistency - # of client output regardless if generating from ARC32 or + # use round trip of ARC-56 -> reparse to ensure consistency + # of client output regardless if generating from ARC-56 or # Puya ARC4Contract - name, methods = parse_app_spec_methods(app_spec_json) - write_arc32_client(name, methods, contract_out_dir) + contract = parse_arc56(app_spec_json) + write_arc4_client(contract, contract_out_dir) def parse_with_mypy(paths: Sequence[Path]) -> ParseResult: diff --git a/test_cases/abi_routing/out/CustomApproval.approval.mir b/test_cases/abi_routing/out/CustomApproval.approval.mir index 34453fd54e..3d93cb6cb1 100644 --- a/test_cases/abi_routing/out/CustomApproval.approval.mir +++ b/test_cases/abi_routing/out/CustomApproval.approval.mir @@ -124,9 +124,9 @@ __puya_arc4_router___add_one_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // abi_routing/custom_approval.py:6 // class CustomApproval(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -152,7 +152,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%11#0 ! tmp%12#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/abi_routing/out/CustomApproval.approval.teal b/test_cases/abi_routing/out/CustomApproval.approval.teal index 7b2787df0c..c2ee51003e 100644 --- a/test_cases/abi_routing/out/CustomApproval.approval.teal +++ b/test_cases/abi_routing/out/CustomApproval.approval.teal @@ -89,9 +89,9 @@ __puya_arc4_router___add_one_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/custom_approval.py:6 // class CustomApproval(ARC4Contract): txna ApplicationArgs 1 @@ -114,7 +114,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/abi_routing/out/CustomApproval.arc32.json b/test_cases/abi_routing/out/CustomApproval.arc32.json index 1f78f130d9..50313fc59a 100644 --- a/test_cases/abi_routing/out/CustomApproval.arc32.json +++ b/test_cases/abi_routing/out/CustomApproval.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo2CiAgICAvLyBjbGFzcyBDdXN0b21BcHByb3ZhbChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYWRkX29uZQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo2CiAgICAvLyBjbGFzcyBDdXN0b21BcHByb3ZhbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGRfb25lCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/abi_routing/out/CustomApproval.arc56.json b/test_cases/abi_routing/out/CustomApproval.arc56.json new file mode 100644 index 0000000000..080b15c971 --- /dev/null +++ b/test_cases/abi_routing/out/CustomApproval.arc56.json @@ -0,0 +1,113 @@ +{ + "name": "CustomApproval", + "structs": {}, + "methods": [ + { + "name": "add_one", + "args": [ + { + "type": "uint64", + "name": "x" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 208 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 239 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 211 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 173 + ], + "errorMessage": "nonsense assert just to generate an init method" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGRfb25lCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQCAADEYQAADiACYMRuBAhJBABk2GgGBKhYSQQAPgAzwn46J8J+OifCfjomwiAB8SUUCQABsgGl0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmWwSUOKAAAxGBREiYoAAYgAAYmKAAExG0EAKYAEA7XArzYaAI4BAAIjiTEZFEQxGEQ2GgEXiAAZFoAEFR98dUxQsCKJMRlAAAYxGBREIokjiYoBAYv/IgiJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/abi_routing/out/CustomApproval.destructured.ir b/test_cases/abi_routing/out/CustomApproval.destructured.ir index ab1e1cce1d..641b61ee03 100644 --- a/test_cases/abi_routing/out/CustomApproval.destructured.ir +++ b/test_cases/abi_routing/out/CustomApproval.destructured.ir @@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@2: // add_one_route_L23 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0) @@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L6 return 0u diff --git a/test_cases/abi_routing/out/CustomApproval.ssa.ir b/test_cases/abi_routing/out/CustomApproval.ssa.ir index a3b94cf3c3..56dcd9cae9 100644 --- a/test_cases/abi_routing/out/CustomApproval.ssa.ir +++ b/test_cases/abi_routing/out/CustomApproval.ssa.ir @@ -51,10 +51,10 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@2: // add_one_route_L23 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0) @@ -72,7 +72,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating test_cases.abi_routing.custom_approval.CustomApproval.__algopy_default_create() return 1u block@7: // switch_case_default_L6 diff --git a/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir index ab1e1cce1d..641b61ee03 100644 --- a/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir @@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@2: // add_one_route_L23 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0) @@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L6 return 0u diff --git a/test_cases/abi_routing/out/MinimumARC4.approval.mir b/test_cases/abi_routing/out/MinimumARC4.approval.mir index 5430440335..85558c2323 100644 --- a/test_cases/abi_routing/out/MinimumARC4.approval.mir +++ b/test_cases/abi_routing/out/MinimumARC4.approval.mir @@ -52,7 +52,7 @@ __puya_arc4_router___bare_routing@2: __puya_arc4_router_____algopy_default_create@3: txn ApplicationID tmp%3#0 ! tmp%4#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/abi_routing/out/MinimumARC4.approval.teal b/test_cases/abi_routing/out/MinimumARC4.approval.teal index 4b12c1950c..20ce19d73c 100644 --- a/test_cases/abi_routing/out/MinimumARC4.approval.teal +++ b/test_cases/abi_routing/out/MinimumARC4.approval.teal @@ -34,7 +34,7 @@ __puya_arc4_router__: bnz __puya_arc4_router___after_if_else@6 txn ApplicationID ! - assert // is creating + assert // can only call when creating pushint 1 // 1 retsub diff --git a/test_cases/abi_routing/out/MinimumARC4.arc32.json b/test_cases/abi_routing/out/MinimumARC4.arc32.json index c6f282172e..464773c93a 100644 --- a/test_cases/abi_routing/out/MinimumARC4.arc32.json +++ b/test_cases/abi_routing/out/MinimumARC4.arc32.json @@ -1,7 +1,7 @@ { "hints": {}, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjQKICAgIC8vIGNsYXNzIE1pbmltdW1BUkM0KEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDAgLy8gMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/abi_routing/out/MinimumARC4.arc56.json b/test_cases/abi_routing/out/MinimumARC4.arc56.json new file mode 100644 index 0000000000..2c9a802a15 --- /dev/null +++ b/test_cases/abi_routing/out/MinimumARC4.arc56.json @@ -0,0 +1,79 @@ +{ + "name": "MinimumARC4", + "structs": {}, + "methods": [], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "gvalue": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Z3ZhbHVl" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 44 + ], + "errorMessage": "can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjQKICAgIC8vIGNsYXNzIE1pbmltdW1BUkM0KEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDAgLy8gMAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CjEYQAADiAAEiAAQQ4oAAIAGZ3ZhbHVlgQRniYoAATEbQAAMMRlAAAcxGBREgQGJgQCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/abi_routing/out/MinimumARC4.destructured.ir b/test_cases/abi_routing/out/MinimumARC4.destructured.ir index ee66099ec0..9130ed8a13 100644 --- a/test_cases/abi_routing/out/MinimumARC4.destructured.ir +++ b/test_cases/abi_routing/out/MinimumARC4.destructured.ir @@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4: block@3: // __algopy_default_create_L1 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L4 return 0u diff --git a/test_cases/abi_routing/out/MinimumARC4.ssa.ir b/test_cases/abi_routing/out/MinimumARC4.ssa.ir index 03d7819430..513c08f61e 100644 --- a/test_cases/abi_routing/out/MinimumARC4.ssa.ir +++ b/test_cases/abi_routing/out/MinimumARC4.ssa.ir @@ -29,7 +29,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4: block@3: // __algopy_default_create_L1 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (== tmp%3#0 0u) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating test_cases.abi_routing.minimal.MinimumARC4.__algopy_default_create() return 1u block@4: // switch_case_default_L4 diff --git a/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir index ee66099ec0..9130ed8a13 100644 --- a/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir @@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4: block@3: // __algopy_default_create_L1 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L4 return 0u diff --git a/test_cases/abi_routing/out/Reference.approval.mir b/test_cases/abi_routing/out/Reference.approval.mir index ccb0fcfe7d..9652ca9743 100644 --- a/test_cases/abi_routing/out/Reference.approval.mir +++ b/test_cases/abi_routing/out/Reference.approval.mir @@ -96,9 +96,9 @@ __puya_arc4_router___noop_with_uint64_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -154,9 +154,9 @@ __puya_arc4_router___mixed_oca_route@4: shl tmp%14#0 int 37 tmp%14#0,37 & tmp%15#0 - assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication + assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication txn ApplicationID tmp%16#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%18#0 @@ -183,9 +183,9 @@ __puya_arc4_router___opt_into_asset_route@5: // @arc4.abimethod txn OnCompletion tmp%21#0 ! tmp%22#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%23#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%25#0 @@ -202,9 +202,9 @@ __puya_arc4_router___with_transactions_route@6: // @arc4.abimethod txn OnCompletion tmp%28#0 ! tmp%29#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%30#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%32#0 @@ -235,9 +235,9 @@ __puya_arc4_router___compare_assets_route@7: // @arc4.abimethod txn OnCompletion tmp%38#0 ! tmp%39#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%40#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%42#0 @@ -259,9 +259,9 @@ __puya_arc4_router___get_address_route@8: // @arc4.abimethod(readonly=True) txn OnCompletion tmp%48#0 ! tmp%49#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%50#0 - assert // is not creating + assert // can only call when not creating callsub get_address tmp%52#0 byte 0x151f7c75 tmp%52#0,0x151f7c75 l-load tmp%52#0 1 0x151f7c75,tmp%52#0 @@ -275,9 +275,9 @@ __puya_arc4_router___get_asset_route@9: // @arc4.abimethod(readonly=True) txn OnCompletion tmp%54#0 ! tmp%55#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%56#0 - assert // is not creating + assert // can only call when not creating callsub get_asset tmp%58#0 byte 0x151f7c75 tmp%58#0,0x151f7c75 l-load tmp%58#0 1 0x151f7c75,tmp%58#0 @@ -291,9 +291,9 @@ __puya_arc4_router___get_application_route@10: // @arc4.abimethod(readonly=True, name="get_application") txn OnCompletion tmp%60#0 ! tmp%61#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%62#0 - assert // is not creating + assert // can only call when not creating callsub get_app tmp%64#0 byte 0x151f7c75 tmp%64#0,0x151f7c75 l-load tmp%64#0 1 0x151f7c75,tmp%64#0 @@ -307,9 +307,9 @@ __puya_arc4_router___get_an_int_route@11: // @arc4.abimethod(readonly=True, name="get_an_int") txn OnCompletion tmp%66#0 ! tmp%67#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%68#0 - assert // is not creating + assert // can only call when not creating callsub get_a_int tmp%70#0 byte 0x151f7c75 tmp%70#0,0x151f7c75 l-load tmp%70#0 1 0x151f7c75,tmp%70#0 @@ -335,9 +335,9 @@ __puya_arc4_router___method_with_default_args_route@12: // ) txn OnCompletion tmp%72#0 ! tmp%73#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%74#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%76#0 @@ -393,9 +393,9 @@ __puya_arc4_router___method_with_15_args_route@13: // @arc4.abimethod txn OnCompletion tmp%97#0 ! tmp%98#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%99#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%101#0 @@ -464,9 +464,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14: // @arc4.abimethod txn OnCompletion tmp%132#0 ! tmp%133#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%134#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%136#0 @@ -585,9 +585,9 @@ __puya_arc4_router___hello_with_algopy_string_route@15: // @arc4.abimethod txn OnCompletion tmp%182#0 ! tmp%183#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%184#0 - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 tmp%186#0 @@ -630,7 +630,7 @@ __puya_arc4_router___bare_abi_config@19: // ) txn ApplicationID tmp%190#0 ! tmp%191#0 - assert // is creating + assert // can only call when creating // abi_routing/contract.py:66-76 // @arc4.baremethod( // allow_actions=[ diff --git a/test_cases/abi_routing/out/Reference.approval.teal b/test_cases/abi_routing/out/Reference.approval.teal index 339fb6eca4..cbc58d72ec 100644 --- a/test_cases/abi_routing/out/Reference.approval.teal +++ b/test_cases/abi_routing/out/Reference.approval.teal @@ -67,9 +67,9 @@ __puya_arc4_router___noop_with_uint64_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -124,9 +124,9 @@ __puya_arc4_router___mixed_oca_route@4: shl pushint 37 // 37 & - assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication + assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -153,9 +153,9 @@ __puya_arc4_router___opt_into_asset_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -172,9 +172,9 @@ __puya_arc4_router___with_transactions_route@6: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -201,9 +201,9 @@ __puya_arc4_router___compare_assets_route@7: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -223,9 +223,9 @@ __puya_arc4_router___get_address_route@8: // @arc4.abimethod(readonly=True) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_address bytec_0 // 0x151f7c75 swap @@ -239,9 +239,9 @@ __puya_arc4_router___get_asset_route@9: // @arc4.abimethod(readonly=True) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_asset bytec_0 // 0x151f7c75 swap @@ -255,9 +255,9 @@ __puya_arc4_router___get_application_route@10: // @arc4.abimethod(readonly=True, name="get_application") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_app bytec_0 // 0x151f7c75 swap @@ -271,9 +271,9 @@ __puya_arc4_router___get_an_int_route@11: // @arc4.abimethod(readonly=True, name="get_an_int") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_a_int bytec_0 // 0x151f7c75 swap @@ -299,9 +299,9 @@ __puya_arc4_router___method_with_default_args_route@12: // ) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -348,9 +348,9 @@ __puya_arc4_router___method_with_15_args_route@13: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -404,9 +404,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -493,9 +493,9 @@ __puya_arc4_router___hello_with_algopy_string_route@15: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -538,7 +538,7 @@ __puya_arc4_router___bare_abi_config@19: // ) txn ApplicationID ! - assert // is creating + assert // can only call when creating // abi_routing/contract.py:66-76 // @arc4.baremethod( // allow_actions=[ diff --git a/test_cases/abi_routing/out/Reference.arc32.json b/test_cases/abi_routing/out/Reference.arc32.json index b4f8be1534..d0aa310dc8 100644 --- a/test_cases/abi_routing/out/Reference.arc32.json +++ b/test_cases/abi_routing/out/Reference.arc32.json @@ -150,7 +150,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbm9vcF93aXRoX3VpbnQ2NAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWxsX3RoZV90aGluZ3Nfcm91dGVAMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5PcHRJbiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5VcGRhdGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIG5hbWU9ImFsbF90aGVfdGhpbmdzIiwKICAgIC8vICAgICBjcmVhdGU9ImFsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBmdWxsX2FiaV9jb25maWcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21peGVkX29jYV9yb3V0ZUA0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMzcgLy8gMzcKICAgICYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUzLTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0iZGlzYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIG1peGVkX29jYQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHdpdGhfdHJhbnNhY3Rpb25zCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb21wYXJlX2Fzc2V0c19yb3V0ZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjb21wYXJlX2Fzc2V0cwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAODoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FwcGxpY2F0aW9uX3JvdXRlQDEwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FwcGxpY2F0aW9uIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FwcAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoXzE1X2FyZ3Nfcm91dGVAMTM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoXzE1X2FyZ3MKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgaGVsbG9fd2l0aF9hbGdvcHlfc3RyaW5nCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE4OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjIgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOQogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjYtNzUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIk9wdEluIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIlVwZGF0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0icmVxdWlyZSIsCiAgICAvLyApCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBub29wX3dpdGhfdWludDY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxfdGhlX3RoaW5nc19yb3V0ZUAzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzNyAvLyAzNwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBtaXhlZF9vY2EKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgd2l0aF90cmFuc2FjdGlvbnMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY29tcGFyZV9hc3NldHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTA6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTE6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF8xNV9hcmdzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsb193aXRoX2FsZ29weV9zdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/abi_routing/out/Reference.arc56.json b/test_cases/abi_routing/out/Reference.arc56.json new file mode 100644 index 0000000000..5e44f70d37 --- /dev/null +++ b/test_cases/abi_routing/out/Reference.arc56.json @@ -0,0 +1,798 @@ +{ + "name": "Reference", + "structs": {}, + "methods": [ + { + "name": "noop_with_uint64", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "all_the_things", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [ + "NoOp", + "OptIn", + "DeleteApplication" + ], + "call": [ + "NoOp", + "OptIn", + "CloseOut", + "UpdateApplication", + "DeleteApplication" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "mixed_oca", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp", + "CloseOut", + "DeleteApplication" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "opt_into_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "with_transactions", + "args": [ + { + "type": "asset", + "name": "asset" + }, + { + "type": "uint64", + "name": "an_int" + }, + { + "type": "pay", + "name": "pay" + }, + { + "type": "uint64", + "name": "another_int" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "compare_assets", + "args": [ + { + "type": "asset", + "name": "asset_a" + }, + { + "type": "asset", + "name": "asset_b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_address", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_application", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_an_int", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "method_with_default_args", + "args": [ + { + "type": "asset", + "name": "asset_from_storage", + "defaultValue": { + "source": "global", + "data": "YXNh", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "asset_from_function", + "defaultValue": { + "source": "method", + "data": "get_asset()uint64" + } + }, + { + "type": "account", + "name": "account_from_storage", + "defaultValue": { + "source": "global", + "data": "Y3JlYXRvcg==", + "type": "AVMString" + } + }, + { + "type": "account", + "name": "account_from_function", + "defaultValue": { + "source": "method", + "data": "get_address()address" + } + }, + { + "type": "application", + "name": "application_from_storage", + "defaultValue": { + "source": "global", + "data": "YXBw", + "type": "AVMString" + } + }, + { + "type": "application", + "name": "application_from_function", + "defaultValue": { + "source": "method", + "data": "get_app()uint64" + } + }, + { + "type": "byte[3]", + "name": "bytes_from_storage", + "defaultValue": { + "source": "global", + "data": "c29tZV9ieXRlcw==", + "type": "AVMString" + } + }, + { + "type": "uint64", + "name": "int_from_storage", + "defaultValue": { + "source": "global", + "data": "YW5faW50", + "type": "AVMString" + } + }, + { + "type": "uint64", + "name": "int_from_function", + "defaultValue": { + "source": "method", + "data": "get_a_int()uint64" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "method_with_15_args", + "args": [ + { + "type": "uint64", + "name": "one" + }, + { + "type": "uint64", + "name": "two" + }, + { + "type": "uint64", + "name": "three" + }, + { + "type": "uint64", + "name": "four" + }, + { + "type": "uint64", + "name": "five" + }, + { + "type": "uint64", + "name": "six" + }, + { + "type": "uint64", + "name": "seven" + }, + { + "type": "uint64", + "name": "eight" + }, + { + "type": "uint64", + "name": "nine" + }, + { + "type": "uint64", + "name": "ten" + }, + { + "type": "uint64", + "name": "eleven" + }, + { + "type": "uint64", + "name": "twelve" + }, + { + "type": "uint64", + "name": "thirteen" + }, + { + "type": "uint64", + "name": "fourteen" + }, + { + "type": "byte[]", + "name": "fifteen" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Fifteen args should not encode the last argument as a tuple", + "events": [], + "recommendations": {} + }, + { + "name": "method_with_more_than_15_args", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + }, + { + "type": "uint64", + "name": "d" + }, + { + "type": "asset", + "name": "asset" + }, + { + "type": "uint64", + "name": "e" + }, + { + "type": "uint64", + "name": "f" + }, + { + "type": "pay", + "name": "pay" + }, + { + "type": "uint64", + "name": "g" + }, + { + "type": "uint64", + "name": "h" + }, + { + "type": "uint64", + "name": "i" + }, + { + "type": "uint64", + "name": "j" + }, + { + "type": "uint64", + "name": "k" + }, + { + "type": "uint64", + "name": "l" + }, + { + "type": "uint64", + "name": "m" + }, + { + "type": "uint64", + "name": "n" + }, + { + "type": "uint64", + "name": "o" + }, + { + "type": "uint64", + "name": "p" + }, + { + "type": "uint64", + "name": "q" + }, + { + "type": "uint64", + "name": "r" + }, + { + "type": "byte[]", + "name": "s" + }, + { + "type": "byte[]", + "name": "t" + }, + { + "type": "asset", + "name": "asset2" + }, + { + "type": "pay", + "name": "pay2" + }, + { + "type": "uint64", + "name": "u" + }, + { + "type": "uint64", + "name": "v" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Application calls only support 16 args, and arc4 calls utilise the first arg for the method\nselector. Args beyond this number are packed into a tuple and placed in the 16th slot.", + "events": [], + "recommendations": {} + }, + { + "name": "hello_with_algopy_string", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "asa": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNh" + }, + "an_int": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YW5faW50" + }, + "some_bytes": { + "keyType": "AVMString", + "valueType": "byte[3]", + "key": "c29tZV9ieXRlcw==" + }, + "creator": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y3JlYXRvcg==" + }, + "app": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXBw" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "DeleteApplication", + "NoOp", + "OptIn" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 829 + ], + "errorMessage": "ASA already opted in" + }, + { + "pc": [ + 219, + 273, + 291, + 325, + 349, + 365, + 381, + 397, + 413, + 470, + 556, + 720 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 254 + ], + "errorMessage": "OnCompletion is not one of NoOp, CloseOut, DeleteApplication" + }, + { + "pc": [ + 823 + ], + "errorMessage": "Only creator can opt in to ASA" + }, + { + "pc": [ + 892 + ], + "errorMessage": "asset a == b" + }, + { + "pc": [ + 768 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 222, + 257, + 276, + 294, + 328, + 352, + 368, + 384, + 400, + 416, + 473, + 559, + 723 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 827, + 858 + ], + "errorMessage": "check self.asa exists" + }, + { + "pc": [ + 99 + ], + "errorMessage": "has method selector" + }, + { + "pc": [ + 862 + ], + "errorMessage": "is correct asset" + }, + { + "pc": [ + 868, + 882 + ], + "errorMessage": "is correct int" + }, + { + "pc": [ + 876 + ], + "errorMessage": "is payment to app" + }, + { + "pc": [ + 313, + 594, + 695 + ], + "errorMessage": "transaction type is pay" + }, + { + "pc": [ + 972 + ], + "errorMessage": "wrong 0th byte from storage" + }, + { + "pc": [ + 982 + ], + "errorMessage": "wrong 1st byte from storage" + }, + { + "pc": [ + 992 + ], + "errorMessage": "wrong 2nd byte from storage" + }, + { + "pc": [ + 950 + ], + "errorMessage": "wrong account from function" + }, + { + "pc": [ + 944 + ], + "errorMessage": "wrong account from storage" + }, + { + "pc": [ + 962 + ], + "errorMessage": "wrong application from function" + }, + { + "pc": [ + 955 + ], + "errorMessage": "wrong application from storage" + }, + { + "pc": [ + 938 + ], + "errorMessage": "wrong asset from function" + }, + { + "pc": [ + 931 + ], + "errorMessage": "wrong asset from storage" + }, + { + "pc": [ + 1005 + ], + "errorMessage": "wrong int from function" + }, + { + "pc": [ + 998 + ], + "errorMessage": "wrong int from storage" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBub29wX3dpdGhfdWludDY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxfdGhlX3RoaW5nc19yb3V0ZUAzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzNyAvLyAzNwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBtaXhlZF9vY2EKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgd2l0aF90cmFuc2FjdGlvbnMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY29tcGFyZV9hc3NldHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTA6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTE6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF8xNV9hcmdzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsb193aXRoX2FsZ29weV9zdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAQB7AiYDBBUffHUDYXNhCAAAAAAAAAHIMRhAAAOIAASIAD9DigAAKSRngAZhbl9pbnQlZ4ICCnNvbWVfYnl0ZXMDBwgJZ4AHY3JlYXRvcjEAZ4ADYXBwJGeABBiTksUVRImKAAExG0ECfoIOBNeNs1sEOlNT/ATS8vU8BCgmsgIEb46UzQQX3GjwBH+tl4AEL9+VpAQTmYJsBKEwCCEEZfTLmwRXMhlaBNF1UvsEkCO7GTYaAI4OAAIAFQAhADgASgBsAIQAlACkALQAxAD9AVMB9yOJMRkURDEYRDYaAYgCIyhMULAiiTYaAYgCJChMULAiiSIxGZCBJRpEMRhENhoBiAIaKExQsCKJMRkURDEYRDYaARfAMIgCESKJMRkURDEYRDYaARfAMDYaAjEWIglJOBAiEkQ2GgOIAhQiiTEZFEQxGEQ2GgEXwDA2GgIXwDCIAhwiiTEZFEQxGESIAhooTFCwIokxGRREMRhEiAIQKExQsCKJMRkURDEYRIgCBShMULAiiTEZFEQxGESIAfooTFCwIokxGRREMRhENhoBF8AwNhoCF8AwNhoDF8AcNhoEF8AcNhoFF8AyNhoGF8AyNhoHNhoINhoJiAHLIokxGRREMRhENhoBFzYaAhc2GgMXNhoEFzYaBRc2GgYXNhoHFzYaCBc2GgkXNhoKFzYaCxc2GgwXNhoNFzYaDhc2Gg9XAgCIAdRJFRZXBgJMUChMULAiiTEZFEQxGEQ2GgE2GgI2GgM2GgQXNhoFF8AwNhoGNhoHMRYlCUk4ECISRDYaCDYaCTYaCjYaCzYaDDYaDTYaDjYaD1cACDYaD1cICDYaD1cQCBc2Gg9XGAg2Gg9XIAg2Gg9JgShZSwGBKllSVwIANhoPSYEqWUsBFVJXAgA2Gg9XLAEXwDAxFiIJSTgQIhJENhoPVy0INhoPVzUIiAFYKExQsCKJMRkURDEYRDYaAVcCAIgBukkVFlcGAkxQKExQsCKJMRmNBgACAAIAAgALAAIAAiOJMRgURIgBpiKJI4mKAQGL/xciCBZXBwGJigEBi/8XIggWVwcBiYoBAYv/FyIIFlcHAYmKAQAxADIJEkQjKWVEFEQpi/9nsYEEshAjsgEyCrIUi/+yEbOJigQAIyllRIv8EkSL/RciEkSL/jgHMgoSRIv/FyUSRImKAgCL/ov/EkSJigABMgOJigABKomKAAEqiYoAAYAIAAAAAAAAAAOJigkAi/ckEkSL+IHIAxJEi/kyCRJEi/oyAxJEi/skEkSL/IHIAxJEi/1XAAGAAQeoRIv9VwEBgAEIqESL/VcCAYABCahEi/4XJRJEi/8XgQMSRImKDwGL8YvyCIvzCIv0CIv1CIv2CIv3CIv4CIv5CIv6CIv7CIv8CIv9CIv+CESL/4mKGgExG4EQEkSL7TgIgaCNBhJEi/04CIHAmgwSRIvqRIv8RIv6i/tQsIvmF4vnFwiL6BcIi+kIi+sXCIvsFwiL7hcIi+8XCIvwFwiL8RcIi/IXCIvzFwiL9BcIi/UXCIv2FwiL9wiL+BcIi/kXCIv+FwiL/xcIFomKAQGABkhlbGxvIIv/UIABIVCJigAAgAtIZWxsbyBXb3JsZLCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/abi_routing/out/Reference.destructured.ir b/test_cases/abi_routing/out/Reference.destructured.ir index 17b854483b..3106e65a42 100644 --- a/test_cases/abi_routing/out/Reference.destructured.ir +++ b/test_cases/abi_routing/out/Reference.destructured.ir @@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out/Reference.ssa.ir b/test_cases/abi_routing/out/Reference.ssa.ir index ffaaf78628..c76ea4cd05 100644 --- a/test_cases/abi_routing/out/Reference.ssa.ir +++ b/test_cases/abi_routing/out/Reference.ssa.ir @@ -39,10 +39,10 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -58,10 +58,10 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -70,10 +70,10 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -82,10 +82,10 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -101,10 +101,10 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (== tmp%38#0 NoOp) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (!= tmp%40#0 0u) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -116,10 +116,10 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (== tmp%48#0 NoOp) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) let tmp%51#0: bool = (!= tmp%50#0 0u) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -127,10 +127,10 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (== tmp%54#0 NoOp) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) let tmp%57#0: bool = (!= tmp%56#0 0u) - (assert tmp%57#0) // is not creating + (assert tmp%57#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -138,10 +138,10 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (== tmp%60#0 NoOp) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) let tmp%63#0: bool = (!= tmp%62#0 0u) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -149,10 +149,10 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -160,10 +160,10 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (== tmp%72#0 NoOp) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (!= tmp%74#0 0u) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -190,10 +190,10 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (== tmp%97#0 NoOp) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) let tmp%100#0: bool = (!= tmp%99#0 0u) - (assert tmp%100#0) // is not creating + (assert tmp%100#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -235,10 +235,10 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (== tmp%132#0 NoOp) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) let tmp%135#0: bool = (!= tmp%134#0 0u) - (assert tmp%135#0) // is not creating + (assert tmp%135#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -302,10 +302,10 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (== tmp%182#0 NoOp) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) let tmp%185#0: bool = (!= tmp%184#0 0u) - (assert tmp%185#0) // is not creating + (assert tmp%185#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -326,7 +326,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (== tmp%190#0 0u) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@20: // switch_case_default_L22 diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir index 2714d12041..8aa77383c7 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir @@ -37,9 +37,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -55,9 +55,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -66,9 +66,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -77,9 +77,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -95,9 +95,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -109,9 +109,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -119,9 +119,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -129,9 +129,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -139,9 +139,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -149,9 +149,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -178,9 +178,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -222,9 +222,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -288,9 +288,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -307,7 +307,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir index 6f10b647c2..1128c6fe93 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir @@ -35,9 +35,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -53,9 +53,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -64,9 +64,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -75,9 +75,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -93,9 +93,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -107,9 +107,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -117,9 +117,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -127,9 +127,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -137,9 +137,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -147,9 +147,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -176,9 +176,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -220,9 +220,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -286,9 +286,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -305,7 +305,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir index 3e13f06973..74906ed792 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir @@ -34,9 +34,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -52,9 +52,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -63,9 +63,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -74,9 +74,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -92,9 +92,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -106,9 +106,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -116,9 +116,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -126,9 +126,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -136,9 +136,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -146,9 +146,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -175,9 +175,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -219,9 +219,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -285,9 +285,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -304,7 +304,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir index 17b854483b..3106e65a42 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir @@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out/client_Reference.py b/test_cases/abi_routing/out/client_Reference.py index 03b489afb7..9c1b3d4e78 100644 --- a/test_cases/abi_routing/out/client_Reference.py +++ b/test_cases/abi_routing/out/client_Reference.py @@ -67,7 +67,7 @@ def get_an_int( self, ) -> algopy.arc4.UIntN[typing.Literal[64]]: ... - @algopy.arc4.abimethod(default_args={'asset_from_storage': 'asa', 'asset_from_function': 'get_asset', 'account_from_storage': 'creator', 'account_from_function': 'get_address', 'application_from_storage': 'app', 'application_from_function': 'get_application', 'bytes_from_storage': 'some_bytes', 'int_from_storage': 'an_int', 'int_from_function': 'get_an_int'}) + @algopy.arc4.abimethod def method_with_default_args( self, asset_from_storage: algopy.Asset, diff --git a/test_cases/abi_routing/out_O2/CustomApproval.approval.teal b/test_cases/abi_routing/out_O2/CustomApproval.approval.teal index 149eaea18a..8bf9c69e72 100644 --- a/test_cases/abi_routing/out_O2/CustomApproval.approval.teal +++ b/test_cases/abi_routing/out_O2/CustomApproval.approval.teal @@ -63,9 +63,9 @@ __puya_arc4_router__: __puya_arc4_router___add_one_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi callsub add_one @@ -82,7 +82,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir b/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir index ab1e1cce1d..641b61ee03 100644 --- a/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir +++ b/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir @@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@2: // add_one_route_L23 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0) @@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L6 return 0u diff --git a/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal b/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal index 3abc7c8bf8..14f6299c11 100644 --- a/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal +++ b/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal @@ -28,7 +28,7 @@ __puya_arc4_router__: bnz __puya_arc4_router___after_if_else@6 txn ApplicationID ! - assert // is creating + assert // can only call when creating pushint 1 // 1 retsub diff --git a/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir b/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir index ee66099ec0..9130ed8a13 100644 --- a/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir +++ b/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir @@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4: block@3: // __algopy_default_create_L1 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L4 return 0u diff --git a/test_cases/abi_routing/out_O2/Reference.approval.teal b/test_cases/abi_routing/out_O2/Reference.approval.teal index f7762bc27c..1eb2dfbc2c 100644 --- a/test_cases/abi_routing/out_O2/Reference.approval.teal +++ b/test_cases/abi_routing/out_O2/Reference.approval.teal @@ -49,9 +49,9 @@ __puya_arc4_router__: __puya_arc4_router___noop_with_uint64_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub noop_with_uint64 bytec_0 // 0x151f7c75 @@ -77,9 +77,9 @@ __puya_arc4_router___mixed_oca_route@4: shl pushint 37 // 37 & - assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication + assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub mixed_oca bytec_0 // 0x151f7c75 @@ -92,9 +92,9 @@ __puya_arc4_router___mixed_oca_route@4: __puya_arc4_router___opt_into_asset_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -105,9 +105,9 @@ __puya_arc4_router___opt_into_asset_route@5: __puya_arc4_router___with_transactions_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -128,9 +128,9 @@ __puya_arc4_router___with_transactions_route@6: __puya_arc4_router___compare_assets_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -144,9 +144,9 @@ __puya_arc4_router___compare_assets_route@7: __puya_arc4_router___get_address_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_address bytec_0 // 0x151f7c75 swap @@ -158,9 +158,9 @@ __puya_arc4_router___get_address_route@8: __puya_arc4_router___get_asset_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_asset bytec_0 // 0x151f7c75 swap @@ -172,9 +172,9 @@ __puya_arc4_router___get_asset_route@9: __puya_arc4_router___get_application_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_app bytec_0 // 0x151f7c75 swap @@ -186,9 +186,9 @@ __puya_arc4_router___get_application_route@10: __puya_arc4_router___get_an_int_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_a_int bytec_0 // 0x151f7c75 swap @@ -200,9 +200,9 @@ __puya_arc4_router___get_an_int_route@11: __puya_arc4_router___method_with_default_args_route@12: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -231,9 +231,9 @@ __puya_arc4_router___method_with_default_args_route@12: __puya_arc4_router___method_with_15_args_route@13: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -281,9 +281,9 @@ __puya_arc4_router___method_with_15_args_route@13: __puya_arc4_router___method_with_more_than_15_args_route@14: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 @@ -364,9 +364,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14: __puya_arc4_router___hello_with_algopy_string_route@15: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub hello_with_algopy_string @@ -392,7 +392,7 @@ __puya_arc4_router___bare_routing@18: __puya_arc4_router___bare_abi_config@19: txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub bare_abi_config intc_0 // 1 retsub diff --git a/test_cases/abi_routing/out_O2/Reference.destructured.ir b/test_cases/abi_routing/out_O2/Reference.destructured.ir index 17b854483b..3106e65a42 100644 --- a/test_cases/abi_routing/out_O2/Reference.destructured.ir +++ b/test_cases/abi_routing/out_O2/Reference.destructured.ir @@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (! tmp%54#0) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (! tmp%60#0) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (! tmp%72#0) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) - (assert tmp%74#0) // is not creating + (assert tmp%74#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (! tmp%97#0) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) - (assert tmp%99#0) // is not creating + (assert tmp%99#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (! tmp%132#0) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) - (assert tmp%134#0) // is not creating + (assert tmp%134#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (! tmp%182#0) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) - (assert tmp%184#0) // is not creating + (assert tmp%184#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (! tmp%190#0) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@22: // after_if_else_L22 diff --git a/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal b/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal index b94072ea4d..9d0021af45 100644 --- a/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal +++ b/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal @@ -93,11 +93,11 @@ __puya_arc4_router___add_one_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/custom_approval.py:6 // class CustomApproval(ARC4Contract): txna ApplicationArgs 1 @@ -129,7 +129,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir b/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir index a3b94cf3c3..56dcd9cae9 100644 --- a/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir @@ -51,10 +51,10 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@2: // add_one_route_L23 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0) @@ -72,7 +72,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating test_cases.abi_routing.custom_approval.CustomApproval.__algopy_default_create() return 1u block@7: // switch_case_default_L6 diff --git a/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal b/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal index 751cf63386..0aa218809c 100644 --- a/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal +++ b/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal @@ -48,7 +48,7 @@ __puya_arc4_router_____algopy_default_create@3: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create pushint 1 // 1 retsub diff --git a/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir b/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir index 03d7819430..513c08f61e 100644 --- a/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir @@ -29,7 +29,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4: block@3: // __algopy_default_create_L1 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (== tmp%3#0 0u) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating test_cases.abi_routing.minimal.MinimumARC4.__algopy_default_create() return 1u block@4: // switch_case_default_L4 diff --git a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal index ded65c06e2..a8d90027bf 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal +++ b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal @@ -97,11 +97,11 @@ __puya_arc4_router___noop_with_uint64_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -157,11 +157,11 @@ __puya_arc4_router___mixed_oca_route@4: shl pushint 37 // 37 & - assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication + assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -189,11 +189,11 @@ __puya_arc4_router___opt_into_asset_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -211,11 +211,11 @@ __puya_arc4_router___with_transactions_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -247,11 +247,11 @@ __puya_arc4_router___compare_assets_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -272,11 +272,11 @@ __puya_arc4_router___get_address_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_address bytec_0 // 0x151f7c75 swap @@ -291,11 +291,11 @@ __puya_arc4_router___get_asset_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_asset bytec_0 // 0x151f7c75 swap @@ -310,11 +310,11 @@ __puya_arc4_router___get_application_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_app bytec_0 // 0x151f7c75 swap @@ -329,11 +329,11 @@ __puya_arc4_router___get_an_int_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_a_int bytec_0 // 0x151f7c75 swap @@ -360,11 +360,11 @@ __puya_arc4_router___method_with_default_args_route@12: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -421,11 +421,11 @@ __puya_arc4_router___method_with_15_args_route@13: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -495,11 +495,11 @@ __puya_arc4_router___method_with_more_than_15_args_route@14: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -637,11 +637,11 @@ __puya_arc4_router___hello_with_algopy_string_route@15: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // abi_routing/contract.py:22 // class Reference(ARC4Contract): txna ApplicationArgs 1 @@ -693,7 +693,7 @@ __puya_arc4_router___bare_abi_config@19: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // abi_routing/contract.py:66-76 // @arc4.baremethod( // allow_actions=[ diff --git a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir index 1b5c33eef9..677ee46bbb 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir @@ -39,10 +39,10 @@ contract test_cases.abi_routing.contract.Reference: block@2: // noop_with_uint64_route_L32 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -58,10 +58,10 @@ contract test_cases.abi_routing.contract.Reference: let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: uint64 = (shl 1u tmp%13#0) let tmp%15#0: uint64 = (& tmp%14#0 37u) - (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication + (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0) let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0) @@ -70,10 +70,10 @@ contract test_cases.abi_routing.contract.Reference: block@5: // opt_into_asset_route_L79 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0) @@ -82,10 +82,10 @@ contract test_cases.abi_routing.contract.Reference: block@6: // with_transactions_route_L96 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0) @@ -101,10 +101,10 @@ contract test_cases.abi_routing.contract.Reference: block@7: // compare_assets_route_L109 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (== tmp%38#0 NoOp) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (!= tmp%40#0 0u) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) let tmp%43#0: uint64 = (btoi tmp%42#0) let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0) @@ -116,10 +116,10 @@ contract test_cases.abi_routing.contract.Reference: block@8: // get_address_route_L113 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (== tmp%48#0 NoOp) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) let tmp%51#0: bool = (!= tmp%50#0 0u) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address() let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0) (log tmp%53#0) @@ -127,10 +127,10 @@ contract test_cases.abi_routing.contract.Reference: block@9: // get_asset_route_L117 let tmp%54#0: uint64 = (txn OnCompletion) let tmp%55#0: bool = (== tmp%54#0 NoOp) - (assert tmp%55#0) // OnCompletion is NoOp + (assert tmp%55#0) // OnCompletion is not NoOp let tmp%56#0: uint64 = (txn ApplicationID) let tmp%57#0: bool = (!= tmp%56#0 0u) - (assert tmp%57#0) // is not creating + (assert tmp%57#0) // can only call when not creating let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset() let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0) (log tmp%59#0) @@ -138,10 +138,10 @@ contract test_cases.abi_routing.contract.Reference: block@10: // get_application_route_L121 let tmp%60#0: uint64 = (txn OnCompletion) let tmp%61#0: bool = (== tmp%60#0 NoOp) - (assert tmp%61#0) // OnCompletion is NoOp + (assert tmp%61#0) // OnCompletion is not NoOp let tmp%62#0: uint64 = (txn ApplicationID) let tmp%63#0: bool = (!= tmp%62#0 0u) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app() let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0) (log tmp%65#0) @@ -149,10 +149,10 @@ contract test_cases.abi_routing.contract.Reference: block@11: // get_an_int_route_L125 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int() let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0) (log tmp%71#0) @@ -160,10 +160,10 @@ contract test_cases.abi_routing.contract.Reference: block@12: // method_with_default_args_route_L129 let tmp%72#0: uint64 = (txn OnCompletion) let tmp%73#0: bool = (== tmp%72#0 NoOp) - (assert tmp%73#0) // OnCompletion is NoOp + (assert tmp%73#0) // OnCompletion is not NoOp let tmp%74#0: uint64 = (txn ApplicationID) let tmp%75#0: bool = (!= tmp%74#0 0u) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%76#0: bytes = (txna ApplicationArgs 1) let tmp%77#0: uint64 = (btoi tmp%76#0) let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0) @@ -190,10 +190,10 @@ contract test_cases.abi_routing.contract.Reference: block@13: // method_with_15_args_route_L166 let tmp%97#0: uint64 = (txn OnCompletion) let tmp%98#0: bool = (== tmp%97#0 NoOp) - (assert tmp%98#0) // OnCompletion is NoOp + (assert tmp%98#0) // OnCompletion is not NoOp let tmp%99#0: uint64 = (txn ApplicationID) let tmp%100#0: bool = (!= tmp%99#0 0u) - (assert tmp%100#0) // is not creating + (assert tmp%100#0) // can only call when not creating let tmp%101#0: bytes = (txna ApplicationArgs 1) let tmp%102#0: uint64 = (btoi tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 2) @@ -235,10 +235,10 @@ contract test_cases.abi_routing.contract.Reference: block@14: // method_with_more_than_15_args_route_L204 let tmp%132#0: uint64 = (txn OnCompletion) let tmp%133#0: bool = (== tmp%132#0 NoOp) - (assert tmp%133#0) // OnCompletion is NoOp + (assert tmp%133#0) // OnCompletion is not NoOp let tmp%134#0: uint64 = (txn ApplicationID) let tmp%135#0: bool = (!= tmp%134#0 0u) - (assert tmp%135#0) // is not creating + (assert tmp%135#0) // can only call when not creating let tmp%136#0: bytes = (txna ApplicationArgs 1) let tmp%137#0: bytes = (txna ApplicationArgs 2) let tmp%138#0: bytes = (txna ApplicationArgs 3) @@ -302,10 +302,10 @@ contract test_cases.abi_routing.contract.Reference: block@15: // hello_with_algopy_string_route_L270 let tmp%182#0: uint64 = (txn OnCompletion) let tmp%183#0: bool = (== tmp%182#0 NoOp) - (assert tmp%183#0) // OnCompletion is NoOp + (assert tmp%183#0) // OnCompletion is not NoOp let tmp%184#0: uint64 = (txn ApplicationID) let tmp%185#0: bool = (!= tmp%184#0 0u) - (assert tmp%185#0) // is not creating + (assert tmp%185#0) // can only call when not creating let tmp%186#0: bytes = (txna ApplicationArgs 1) let tmp%187#0: bytes = ((extract 2 0) tmp%186#0) let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0) @@ -326,7 +326,7 @@ contract test_cases.abi_routing.contract.Reference: block@19: // bare_abi_config_L66 let tmp%190#0: uint64 = (txn ApplicationID) let tmp%191#0: bool = (== tmp%190#0 0u) - (assert tmp%191#0) // is creating + (assert tmp%191#0) // can only call when creating test_cases.abi_routing.contract.Reference.bare_abi_config() return 1u block@20: // switch_case_default_L22 diff --git a/test_cases/abi_routing/puya.log b/test_cases/abi_routing/puya.log index 5c0210a16f..5f2a175161 100644 --- a/test_cases/abi_routing/puya.log +++ b/test_cases/abi_routing/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['abi_routing'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['abi_routing'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing abi_routing/out/module.awst debug: Sealing block@0: // L12 @@ -3048,6 +3048,7 @@ debug: Replaced hello_with_algopy_string_block@0.ops[10]: 'v-load tmp%1#0' with debug: Found 1 edge set/s for test_cases.abi_routing.contract.Reference.approval_program debug: Found 3 edge set/s for test_cases.abi_routing.contract.Reference.__puya_arc4_router__ info: Writing abi_routing/out/MinimumARC4.arc32.json +info: Writing abi_routing/out/MinimumARC4.arc56.json info: Writing abi_routing/out/MinimumARC4.approval.teal info: Writing abi_routing/out/MinimumARC4.clear.teal info: Writing abi_routing/out/MinimumARC4.approval.bin @@ -3055,6 +3056,7 @@ info: Writing abi_routing/out/MinimumARC4.clear.bin info: Writing abi_routing/out/MinimumARC4.approval.puya.map info: Writing abi_routing/out/MinimumARC4.clear.puya.map info: Writing abi_routing/out/CustomApproval.arc32.json +info: Writing abi_routing/out/CustomApproval.arc56.json info: Writing abi_routing/out/CustomApproval.approval.teal info: Writing abi_routing/out/CustomApproval.clear.teal info: Writing abi_routing/out/CustomApproval.approval.bin @@ -3062,6 +3064,7 @@ info: Writing abi_routing/out/CustomApproval.clear.bin info: Writing abi_routing/out/CustomApproval.approval.puya.map info: Writing abi_routing/out/CustomApproval.clear.puya.map info: Writing abi_routing/out/Reference.arc32.json +info: Writing abi_routing/out/Reference.arc56.json info: Writing abi_routing/out/Reference.approval.teal info: Writing abi_routing/out/Reference.clear.teal info: Writing abi_routing/out/Reference.approval.bin diff --git a/test_cases/application/puya.log b/test_cases/application/puya.log index 7c6cc6bdb9..9dd020d70c 100644 --- a/test_cases/application/puya.log +++ b/test_cases/application/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['application'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['application'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing application/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir index d20439da29..8e10476874 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir @@ -38,9 +38,9 @@ __puya_arc4_router___test_static_elements_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub test_static_elements int 1 1 retsub 1 @@ -50,9 +50,9 @@ __puya_arc4_router___test_dynamic_elements_route@3: // @arc4.abimethod() txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub test_dynamic_elements int 1 1 retsub 1 @@ -62,9 +62,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4: // @arc4.abimethod() txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating callsub test_mixed_single_dynamic_elements int 1 1 retsub 1 @@ -74,9 +74,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5: // @arc4.abimethod() txn OnCompletion tmp%15#0 ! tmp%16#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%17#0 - assert // is not creating + assert // can only call when not creating callsub test_mixed_multiple_dynamic_elements int 1 1 retsub 1 @@ -86,9 +86,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6: // @arc4.abimethod() txn OnCompletion tmp%19#0 ! tmp%20#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%21#0 - assert // is not creating + assert // can only call when not creating callsub test_nested_struct_replacement int 1 1 retsub 1 @@ -98,9 +98,9 @@ __puya_arc4_router___test_nested_tuple_modification_route@7: // @arc4.abimethod() txn OnCompletion tmp%23#0 ! tmp%24#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%25#0 - assert // is not creating + assert // can only call when not creating callsub test_nested_tuple_modification int 1 1 retsub 1 @@ -115,7 +115,7 @@ __puya_arc4_router___bare_routing@10: __puya_arc4_router_____algopy_default_create@11: txn ApplicationID tmp%28#0 ! tmp%29#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal index 24d8e44e9a..a4f9ab52d8 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_static_elements_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_static_elements intc_1 // 1 retsub @@ -37,9 +37,9 @@ __puya_arc4_router___test_dynamic_elements_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_dynamic_elements intc_1 // 1 retsub @@ -49,9 +49,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_mixed_single_dynamic_elements intc_1 // 1 retsub @@ -61,9 +61,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_mixed_multiple_dynamic_elements intc_1 // 1 retsub @@ -73,9 +73,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_nested_struct_replacement intc_1 // 1 retsub @@ -85,9 +85,9 @@ __puya_arc4_router___test_nested_tuple_modification_route@7: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_nested_tuple_modification intc_1 // 1 retsub @@ -99,7 +99,7 @@ __puya_arc4_router___bare_routing@10: bnz __puya_arc4_router___after_if_else@14 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json index 685073ad41..a3dc19f137 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json @@ -32,7 +32,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9zdGF0aWNfZWxlbWVudHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfZHluYW1pY19lbGVtZW50c19yb3V0ZUAzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50X3JvdXRlQDY6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb25fcm91dGVANzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3Rfc3RhdGljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9zdGF0aWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3Rfc3RhdGljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDIKICAgIC8vIGJ5dGVfYXJyYXkxID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MwogICAgLy8gYnl0ZV9hcnJheTIgPSBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMygpLCBnZXRfYnl0ZTQoKSkKICAgIGNhbGxzdWIgZ2V0X2J5dGUzCiAgICBjYWxsc3ViIGdldF9ieXRlNAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzdHJ1Y3QxID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBieXRlX2FycmF5MS5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDYKICAgIC8vIHN0cnVjdDIgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGJ5dGVfYXJyYXkyLmNvcHkoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NwogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OAogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICByZXBsYWNlMiAxMgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTAKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBleHRyYWN0IDEwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMSgpIC0+IGJ5dGVzOgpnZXRfYnl0ZTE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUxKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0KQogICAgcHVzaGJ5dGVzIDB4MDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTIoKSAtPiBieXRlczoKZ2V0X2J5dGUyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDMtMjA0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMigpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNSkKICAgIHB1c2hieXRlcyAweDA1CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUzKCkgLT4gYnl0ZXM6CmdldF9ieXRlMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTMoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEwCiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDQyKQogICAgcHVzaGJ5dGVzIDB4MmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTQoKSAtPiBieXRlczoKZ2V0X2J5dGU0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlNCgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoMjU1KQogICAgcHVzaGJ5dGVzIDB4ZmYKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdWludDEoKSAtPiBieXRlczoKZ2V0X3VpbnQxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODgtMTg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91aW50MSgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDMpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQyKCkgLT4gYnl0ZXM6CmdldF91aW50MjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTkzLTE5NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDIoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgyKio0MikKICAgIHB1c2hieXRlcyAweDAwMDAwNDAwMDAwMDAwMDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBzdHJ1Y3QxID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzdHJ1Y3QyID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMygpLCBnZXRfc3RyaW5nMSgpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMwogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDEuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhcnJheVsxXSA9IHN0cnVjdDIuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBsb2coYXJyYXlbMl0pCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzEKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MwogICAgLy8gbG9nKGFycmF5KQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzEoKSAtPiBieXRlczoKZ2V0X3N0cmluZzE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzEoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzUKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYSIpCiAgICBwdXNoYnl0ZXMgMHgwMDAxNjEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMigpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMigpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJiZWUiKQogICAgcHVzaGJ5dGVzIDB4MDAwMzYyNjU2NQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmczKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmczOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODMtMTg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmczKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoIkhlbGxvIFdvcmxkIikKICAgIHB1c2hieXRlcyAweDAwMGI0ODY1NmM2YzZmMjA1NzZmNzI2YzY0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NwogICAgLy8gc3RydWN0MSA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3OAogICAgLy8gc3RydWN0MiA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MAogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vIDB4CiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhcnJheS5hcHBlbmQoc3RydWN0Mi5jb3B5KCkpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhcnJheVswXSA9IHN0cnVjdDEuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODcKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50czoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAtOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5Mi05NAogICAgLy8gc3RydWN0MSA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NgogICAgLy8gZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfdTE2X2FycjIKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk1LTk3CiAgICAvLyBzdHJ1Y3QyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCksIGdldF91MTZfYXJyMigpLCBnZXRfdWludDIoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OQogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAwCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDEKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gbG9nKGFycmF5WzFdKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjEoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMSgpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigyKioxNiAtIDEpLCBhcmM0LlVJbnQxNigwKSwgYXJjNC5VSW50MTYoNDIpKQogICAgcHVzaGJ5dGVzIDB4MDAwM2ZmZmYwMDAwMDAyYQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91MTZfYXJyMigpIC0+IGJ5dGVzOgpnZXRfdTE2X2FycjI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyMy0yMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3UxNl9hcnIyKCkgLT4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50MTZdOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuVUludDE2KDEpLCBhcmM0LlVJbnQxNigyKSwgYXJjNC5VSW50MTYoMyksIGFyYzQuVUludDE2KDQpKQogICAgcHVzaGJ5dGVzIDB4MDAwNDAwMDEwMDAyMDAwMzAwMDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA5CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMAogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMi0xMTQKICAgIC8vIGZvdXIgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTE1CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNi0xMjIKICAgIC8vIHN0cnVjdDEgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz10d28uY29weSgpLAogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGRpZyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjUKICAgIC8vIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEyMy0xMjkKICAgIC8vIHN0cnVjdDIgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMxCiAgICAvLyBzdHJ1Y3QyLnR3byA9IHR3by5jb3B5KCkgICMgbm93IHN0cnVjdDIgc2hvdWxkIG1hdGNoIHN0cnVjdDEKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGRpZyAxCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgICsKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICByZXBsYWNlMiAyMgogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciA0CiAgICArCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmJ5dGVzID09IHN0cnVjdDIuYnl0ZXMsICJzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHN0cnVjdDEgZG9lcyBub3QgbWF0Y2ggc3RydWN0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzYKICAgIC8vIG9uZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM3CiAgICAvLyB0d28gPSBEeW5hbWljU3RydWN0KGdldF9zdHJpbmcxKCksIGdldF9zdHJpbmcyKCkpCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM4CiAgICAvLyB0aHJlZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDIoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTIoKSwgZ2V0X2J5dGUxKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQwCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM5LTE0MQogICAgLy8gZm91cjEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQzCiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gZ2V0X3N0cmluZzEoKSwKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBnZXRfdWludDIoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZ2V0X3UxNl9hcnIxKCkgKyAoYXJjNC5VSW50MTYoMTIzKSwpLCAgIyBub3FhOiBSVUYwMDUKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDA3YgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ3CiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0Mi0xNDgKICAgIC8vIGZvdXIyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwKICAgIC8vICAgICBnZXRfc3RyaW5nMSgpLAogICAgLy8gICAgIGdldF91aW50MigpLAogICAgLy8gICAgIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1MC0xNTgKICAgIC8vIHR1cDEgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMS5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgYnl0ZWMgNSAvLyAweDAwMWEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1OS0xNjcKICAgIC8vIHR1cDIgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMi5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gdHVwMlszXS5kLnBvcCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBidXJ5IDEKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNAogICAgZXh0cmFjdDMKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgc3dhcAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgIGRpZyAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDI0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gYXNzZXJ0IHR1cDEuYnl0ZXMgPT0gdHVwMi5ieXRlcywgInR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMiIKICAgID09CiAgICBhc3NlcnQgLy8gdHVwMSBkb2VzIG5vdCBtYXRjaCB0dXAyCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplKGFycmF5OiBieXRlcywgZml4ZWRfYnl0ZV9zaXplOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZToKICAgIHByb3RvIDIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBkdXAKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudChhcnJheTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMSAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2J1cnkgMQogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBzdGF0aWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50KGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQsIGFycmF5X2xlbmd0aDogdWludDY0KSAtPiBieXRlczoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTQKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X3N0YXRpY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnRfcm91dGVANjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uX3JvdXRlQDc6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X3N0YXRpY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3Rfc3RhdGljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3N0YXRpY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBieXRlX2FycmF5MSA9IGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDMKICAgIC8vIGJ5dGVfYXJyYXkyID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTMoKSwgZ2V0X2J5dGU0KCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMwogICAgY2FsbHN1YiBnZXRfYnl0ZTQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NQogICAgLy8gc3RydWN0MSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYnl0ZV9hcnJheTEuY29weSgpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzdHJ1Y3QyID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBieXRlX2FycmF5Mi5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDcKICAgIC8vIGFycmF5ID0gYXJjNC5EeW5hbWljQXJyYXkoc3RydWN0MS5jb3B5KCksIHN0cnVjdDEuY29weSgpKQogICAgZGlnIDEKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDgKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcmVwbGFjZTIgMTIKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDkKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MQogICAgLy8gbG9nKGFycmF5WzFdKQogICAgZXh0cmFjdCAxMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTEoKSAtPiBieXRlczoKZ2V0X2J5dGUxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTgtMTk5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMSgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDAKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNCkKICAgIHB1c2hieXRlcyAweDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUyKCkgLT4gYnl0ZXM6CmdldF9ieXRlMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjAzLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTIoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDUpCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMygpIC0+IGJ5dGVzOgpnZXRfYnl0ZTM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUzKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0MikKICAgIHB1c2hieXRlcyAweDJhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGU0KCkgLT4gYnl0ZXM6CmdldF9ieXRlNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTQoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDI1NSkKICAgIHB1c2hieXRlcyAweGZmCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQxKCkgLT4gYnl0ZXM6CmdldF91aW50MToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDEoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91aW50MigpIC0+IGJ5dGVzOgpnZXRfdWludDI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5My0xOTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3VpbnQyKCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMioqNDIpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDQwMDAwMDAwMDAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9keW5hbWljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OAogICAgLy8gc3RydWN0MSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OQogICAgLy8gc3RydWN0MiA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzMoKSwgZ2V0X3N0cmluZzEoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzMKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjEKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QxLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MgogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NgogICAgLy8gbG9nKGFycmF5WzJdKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBwdXNoaW50IDYgLy8gNgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzMKICAgIC8vIGxvZyhhcnJheSkKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmcxKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmcxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzMtMTc0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmcxKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoImEiKQogICAgcHVzaGJ5dGVzIDB4MDAwMTYxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzIoKSAtPiBieXRlczoKZ2V0X3N0cmluZzI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3OC0xNzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzIoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYmVlIikKICAgIHB1c2hieXRlcyAweDAwMDM2MjY1NjUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMygpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMygpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgMHgwMDBiNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzcKICAgIC8vIHN0cnVjdDEgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzgKICAgIC8vIHN0cnVjdDIgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODAKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QyLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MgogICAgLy8gYXJyYXlbMF0gPSBzdHJ1Y3QxLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGludGNfMyAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTItOTQKICAgIC8vIHN0cnVjdDEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTYKICAgIC8vIGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSwgZ2V0X3UxNl9hcnIyKCksIGdldF91aW50MigpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIyCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NS05NwogICAgLy8gc3RydWN0MiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTkKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAxCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIHVuY292ZXIgNAogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDIKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgcG9wCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3UxNl9hcnIxKCkgLT4gYnl0ZXM6CmdldF91MTZfYXJyMToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE4LTIxOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdTE2X2FycjEoKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQxNl06CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjIwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5VSW50MTYoMioqMTYgLSAxKSwgYXJjNC5VSW50MTYoMCksIGFyYzQuVUludDE2KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDNmZmZmMDAwMDAwMmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjIoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjMtMjI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMigpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjUKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigxKSwgYXJjNC5VSW50MTYoMiksIGFyYzQuVUludDE2KDMpLCBhcmM0LlVJbnQxNig0KSkKICAgIHB1c2hieXRlcyAweDAwMDQwMDAxMDAwMjAwMDMwMDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gb25lID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMSgpLCBnZXRfYnl0ZTIoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTAKICAgIC8vIHR3byA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTEKICAgIC8vIHRocmVlID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMigpLCBnZXRfYnl0ZTEoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTItMTE0CiAgICAvLyBmb3VyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTYtMTIyCiAgICAvLyBzdHJ1Y3QxID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289dHdvLmNvcHkoKSwKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlYyA1IC8vIDB4MDAxYQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBkaWcgMQogICAgKwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTI1CiAgICAvLyB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjMtMTI5CiAgICAvLyBzdHJ1Y3QyID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc3RydWN0Mi50d28gPSB0d28uY29weSgpICAjIG5vdyBzdHJ1Y3QyIHNob3VsZCBtYXRjaCBzdHJ1Y3QxCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBkaWcgMQogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICArCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgMjIKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMjQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgc3RydWN0MS5ieXRlcyA9PSBzdHJ1Y3QyLmJ5dGVzLCAic3RydWN0MSBkb2VzIG5vdCBtYXRjaCBzdHJ1Y3QyIgogICAgPT0KICAgIGFzc2VydCAvLyBzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb246CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM2CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOS0xNDEKICAgIC8vIGZvdXIxID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDQKICAgIC8vIGdldF9zdHJpbmcxKCksCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZ2V0X3VpbnQyKCksCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDYKICAgIC8vIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAwN2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDItMTQ4CiAgICAvLyBmb3VyMiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyAgICAgZ2V0X3N0cmluZzEoKSwKICAgIC8vICAgICBnZXRfdWludDIoKSwKICAgIC8vICAgICBnZXRfdTE2X2FycjEoKSArIChhcmM0LlVJbnQxNigxMjMpLCksICAjIG5vcWE6IFJVRjAwNQogICAgLy8gICAgIGdldF91aW50MSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTAtMTU4CiAgICAvLyB0dXAxID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjEuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTktMTY3CiAgICAvLyB0dXAyID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjIuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNjkKICAgIC8vIHR1cDJbM10uZC5wb3AoKQogICAgZHVwCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAxCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDQKICAgIGV4dHJhY3QzCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkaWcgMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzAKICAgIC8vIGFzc2VydCB0dXAxLmJ5dGVzID09IHR1cDIuYnl0ZXMsICJ0dXAxIGRvZXMgbm90IG1hdGNoIHR1cDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMgogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzMgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json new file mode 100644 index 0000000000..c958f96c26 --- /dev/null +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json @@ -0,0 +1,210 @@ +{ + "name": "DynamicArrayContract", + "structs": {}, + "methods": [ + { + "name": "test_static_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_mixed_single_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_mixed_multiple_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_struct_replacement", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_tuple_modification", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 215 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 91, + 103, + 115, + 127, + 139, + 151 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 168 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 94, + 106, + 118, + 130, + 142, + 154 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1189 + ], + "errorMessage": "struct1 does not match struct2" + }, + { + "pc": [ + 1521 + ], + "errorMessage": "tup1 does not match tup2" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X3N0YXRpY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnRfcm91dGVANjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uX3JvdXRlQDc6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X3N0YXRpY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3Rfc3RhdGljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3N0YXRpY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBieXRlX2FycmF5MSA9IGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDMKICAgIC8vIGJ5dGVfYXJyYXkyID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTMoKSwgZ2V0X2J5dGU0KCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMwogICAgY2FsbHN1YiBnZXRfYnl0ZTQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NQogICAgLy8gc3RydWN0MSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYnl0ZV9hcnJheTEuY29weSgpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzdHJ1Y3QyID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBieXRlX2FycmF5Mi5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDcKICAgIC8vIGFycmF5ID0gYXJjNC5EeW5hbWljQXJyYXkoc3RydWN0MS5jb3B5KCksIHN0cnVjdDEuY29weSgpKQogICAgZGlnIDEKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDgKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcmVwbGFjZTIgMTIKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDkKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MQogICAgLy8gbG9nKGFycmF5WzFdKQogICAgZXh0cmFjdCAxMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTEoKSAtPiBieXRlczoKZ2V0X2J5dGUxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTgtMTk5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMSgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDAKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNCkKICAgIHB1c2hieXRlcyAweDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUyKCkgLT4gYnl0ZXM6CmdldF9ieXRlMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjAzLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTIoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDUpCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMygpIC0+IGJ5dGVzOgpnZXRfYnl0ZTM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUzKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0MikKICAgIHB1c2hieXRlcyAweDJhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGU0KCkgLT4gYnl0ZXM6CmdldF9ieXRlNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTQoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDI1NSkKICAgIHB1c2hieXRlcyAweGZmCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQxKCkgLT4gYnl0ZXM6CmdldF91aW50MToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDEoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91aW50MigpIC0+IGJ5dGVzOgpnZXRfdWludDI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5My0xOTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3VpbnQyKCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMioqNDIpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDQwMDAwMDAwMDAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9keW5hbWljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OAogICAgLy8gc3RydWN0MSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OQogICAgLy8gc3RydWN0MiA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzMoKSwgZ2V0X3N0cmluZzEoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzMKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjEKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QxLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MgogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NgogICAgLy8gbG9nKGFycmF5WzJdKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBwdXNoaW50IDYgLy8gNgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzMKICAgIC8vIGxvZyhhcnJheSkKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmcxKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmcxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzMtMTc0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmcxKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoImEiKQogICAgcHVzaGJ5dGVzIDB4MDAwMTYxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzIoKSAtPiBieXRlczoKZ2V0X3N0cmluZzI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3OC0xNzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzIoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYmVlIikKICAgIHB1c2hieXRlcyAweDAwMDM2MjY1NjUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMygpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMygpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgMHgwMDBiNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzcKICAgIC8vIHN0cnVjdDEgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzgKICAgIC8vIHN0cnVjdDIgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODAKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QyLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MgogICAgLy8gYXJyYXlbMF0gPSBzdHJ1Y3QxLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGludGNfMyAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTItOTQKICAgIC8vIHN0cnVjdDEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTYKICAgIC8vIGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSwgZ2V0X3UxNl9hcnIyKCksIGdldF91aW50MigpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIyCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NS05NwogICAgLy8gc3RydWN0MiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTkKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAxCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIHVuY292ZXIgNAogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDIKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgcG9wCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3UxNl9hcnIxKCkgLT4gYnl0ZXM6CmdldF91MTZfYXJyMToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE4LTIxOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdTE2X2FycjEoKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQxNl06CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjIwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5VSW50MTYoMioqMTYgLSAxKSwgYXJjNC5VSW50MTYoMCksIGFyYzQuVUludDE2KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDNmZmZmMDAwMDAwMmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjIoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjMtMjI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMigpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjUKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigxKSwgYXJjNC5VSW50MTYoMiksIGFyYzQuVUludDE2KDMpLCBhcmM0LlVJbnQxNig0KSkKICAgIHB1c2hieXRlcyAweDAwMDQwMDAxMDAwMjAwMDMwMDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gb25lID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMSgpLCBnZXRfYnl0ZTIoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTAKICAgIC8vIHR3byA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTEKICAgIC8vIHRocmVlID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMigpLCBnZXRfYnl0ZTEoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTItMTE0CiAgICAvLyBmb3VyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTYtMTIyCiAgICAvLyBzdHJ1Y3QxID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289dHdvLmNvcHkoKSwKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlYyA1IC8vIDB4MDAxYQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBkaWcgMQogICAgKwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTI1CiAgICAvLyB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjMtMTI5CiAgICAvLyBzdHJ1Y3QyID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc3RydWN0Mi50d28gPSB0d28uY29weSgpICAjIG5vdyBzdHJ1Y3QyIHNob3VsZCBtYXRjaCBzdHJ1Y3QxCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBkaWcgMQogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICArCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgMjIKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMjQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgc3RydWN0MS5ieXRlcyA9PSBzdHJ1Y3QyLmJ5dGVzLCAic3RydWN0MSBkb2VzIG5vdCBtYXRjaCBzdHJ1Y3QyIgogICAgPT0KICAgIGFzc2VydCAvLyBzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb246CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM2CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOS0xNDEKICAgIC8vIGZvdXIxID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDQKICAgIC8vIGdldF9zdHJpbmcxKCksCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZ2V0X3VpbnQyKCksCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDYKICAgIC8vIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAwN2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDItMTQ4CiAgICAvLyBmb3VyMiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyAgICAgZ2V0X3N0cmluZzEoKSwKICAgIC8vICAgICBnZXRfdWludDIoKSwKICAgIC8vICAgICBnZXRfdTE2X2FycjEoKSArIChhcmM0LlVJbnQxNigxMjMpLCksICAjIG5vcWE6IFJVRjAwNQogICAgLy8gICAgIGdldF91aW50MSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTAtMTU4CiAgICAvLyB0dXAxID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjEuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTktMTY3CiAgICAvLyB0dXAyID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjIuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNjkKICAgIC8vIHR1cDJbM10uZC5wb3AoKQogICAgZHVwCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAxCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDQKICAgIGV4dHJhY3QzCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkaWcgMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzAKICAgIC8vIGFzc2VydCB0dXAxLmJ5dGVzID09IHR1cDIuYnl0ZXMsICJ0dXAxIGRvZXMgbm90IG1hdGNoIHR1cDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMgogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzMgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAAECBCYGAgAEAgACAgAcAAIAEgIAGogAAUOKAAExG0EAe4IGBFVxWCcEcT3W2wQ3FYqsBIVwvjsEUaqMSQQoOhhvNhoAjgYAAgAOABoAJgAyAD4iiTEZFEQxGESIAEsjiTEZFEQxGESIAMgjiTEZFEQxGESIAawjiTEZFEQxGESIAigjiTEZFEQxGESIAu4jiTEZFEQxGESIBAkjiTEZQAAGMRgURCOJIomKAACIAEuIAE9QiABSiABWUIgAWU8CUIgAYU8CUEsBSwJQKUxQSSJZIw1ESwFcDEmwSVcCAElXAAqwVwoKsIEKiAUDTE8CEkSBCogE+UgSRImKAAGAAQSJigABgAEFiYoAAYABKomKAAGAAf+JigABgAgAAAAAAAAAA4mKAAGACAAABAAAAAAAiYoAAIgAw4gAyUsBFSUIFlcGAihMUE8CUExQiADAiACpSwEVJQgWVwYCKExQTwJQTFBLARUlCBZXBgIoTFBLAlBLAlApTFApSwNQSwEiWU8CVwIAI08DiAToSwEjiAViSbBJVwIASSJZSwIiWUkjCUsDFUsEJFlKTwRNSwVPBU8CUrBLAiQJSwQlWUsDSwFPA01LBU8DTwJSsE8CgQMJSwOBBllPA0xPAk1SsIgEMUxLAxJESbCIBCdMTwISREmwiAQdTE8CEkSwiYoAAYADAAFhiYoAAYAFAANiZWWJigABgA0AC0hlbGxvIFdvcmxkiYoAAIj+7oj/0Ij+9k8CJwRQTFBMUIj+6oj/x4j+1k8CJwRQTFBMUClLAVAiKyNLA4gEHkkiWUxXAgAjTwOIBBFLAiKIBItJsElXAgBJIllLAiJZSSMJSwMVSwQkWUpPBE1LBU8FTwJSsE8CJAlLAyVZTwNMTwJNUrCIA3NMTwISRIgDa0gSRImKAACI/maI/0iI/m6IAKWI/lpPBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFCI/kqI/yeI/jaIAImI/j5PBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFBLARUlCBZXBgIoTFBLAlBLAlApTFBLASOIA9dJsElXAgBJIllLAiJZSSMJSwMVSwQkWUpPBE1LBU8FTwJSsE8CJAlLAyVZTwNMTwJNUrCIAr9MTwISRIgCt0gSRImKAAGACAAD//8AAAAqiYoAAYAKAAQAAQACAAMABImKAACI/ZSI/XWI/XlQUIj+boj+dEsBFSUIFlcGAihMUE8CUExQiP2AiP1aiP1QUFCI/WeI/kmI/W+I/6aI/VtPBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFCI/iKI/ihLARUlCBZXBgIoTFBPAlBMUE8EJwVQSwQVgRpLAQhPAk8FUEsBFlcGAksBTFBLBRVPA0sBCBZXBgJPAkxQSwZQSwVQSwRQiP3fiP3TSwEVJQgWVwYCKExQTwJQTFBJFYEaCEkWVwYCTwVMUExPBAgWVwYCUExQTwRQTwNQSYEKWUsBIksCWEsCgRZZSwMVTwRLAk8CUk8CTwZQTFBMTwIJSwGBFllLBAhLAQkWVwYCTwJMXBZJgRhZTwQITwIJFlcGAlwYEkSJigAAiPxtiPxOiPxSUFCI/UeI/U1LARUlCBZXBgIoTFBPAlBMUIj8WYj8M4j8KVBQiPxAiP0iiPxIiP5/iPw0TwQqUEsEFYEcCExPBFBMFlcGAlBMUE8CUExQiPwWiPz4iPweiP5VVwIAgAIAe1BJFSQKFlcGAkxQiPv4TwQqUEsEFYEcCExPBFBMFlcGAlBMUE8CUExQiPy/iPzFSwEVJQgWVwYCKExQTwJQTFBPBScFUEsFFYEaCExPBVBLARZXBgJQSwQVSwIIFlcGAksBTFBLBlBPBVBLA1BLBBVPAwgWVwYCTwJMUE8EUE8DUE8CUEmBFllLAYEYWUsCSwJLAlJJgRJZSwEVSwJLAk8CUiSIADlFAU8CIk8DWExQSwMiSwRYSwQVTwVLBE8CUkxLAlBMUE8CTwMJTwIVSwKBGFkITAkWVwYCXBgSRImKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUisiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAErSYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv+i/9PA4gAAlCJigQBi/4kC4v8TFmL/iMIJAtJTgKL/ExZi/wVi/+L/gkjCUsBTwNPAk1JSwMJTgOL/RVOA4v8Ik8EUov9UIv8TwJPA1JQi/8kC4sAiwQMQQAgiwNJiwBJTgNZiwIIiwEJFlcGAksCTF2MAyQIjABC/9iLA4wAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir index 86603710bf..c90ed30b2c 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir index 72e532cfca..f49f3cc535 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir @@ -16,55 +16,55 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@8: // switch_case_default_L38 @@ -77,7 +77,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (== tmp%28#0 0u) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.__algopy_default_create() return 1u block@12: // switch_case_default_L38 diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir index f50df3e9b3..df6050a2b4 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir index 4c66c3ec72..b1771bfc9e 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir index b4b9829bc0..08685c3832 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir index a01d2bbc4a..a1af477627 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir index 11198ea423..ce80d32b7e 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir index 63386337ae..39bf6095e0 100644 --- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal index 482571a29c..501c0eb530 100644 --- a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal +++ b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_static_elements_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_static_elements intc_1 // 1 retsub @@ -31,9 +31,9 @@ __puya_arc4_router___test_static_elements_route@2: __puya_arc4_router___test_dynamic_elements_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_dynamic_elements intc_1 // 1 retsub @@ -41,9 +41,9 @@ __puya_arc4_router___test_dynamic_elements_route@3: __puya_arc4_router___test_mixed_single_dynamic_elements_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_mixed_single_dynamic_elements intc_1 // 1 retsub @@ -51,9 +51,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4: __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_mixed_multiple_dynamic_elements intc_1 // 1 retsub @@ -61,9 +61,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5: __puya_arc4_router___test_nested_struct_replacement_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_nested_struct_replacement intc_1 // 1 retsub @@ -71,9 +71,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6: __puya_arc4_router___test_nested_tuple_modification_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_nested_tuple_modification intc_1 // 1 retsub @@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@10: bnz __puya_arc4_router___after_if_else@14 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir index 86603710bf..c90ed30b2c 100644 --- a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir +++ b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir @@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@10: // bare_routing_L38 @@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating return 1u block@14: // after_if_else_L38 return 0u diff --git a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal index b2cb51c6f8..87f6da9435 100644 --- a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal +++ b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal @@ -33,11 +33,11 @@ __puya_arc4_router___test_static_elements_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_static_elements intc_2 // 1 retsub @@ -48,11 +48,11 @@ __puya_arc4_router___test_dynamic_elements_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_dynamic_elements intc_2 // 1 retsub @@ -63,11 +63,11 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_mixed_single_dynamic_elements intc_2 // 1 retsub @@ -78,11 +78,11 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_mixed_multiple_dynamic_elements intc_2 // 1 retsub @@ -93,11 +93,11 @@ __puya_arc4_router___test_nested_struct_replacement_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_nested_struct_replacement intc_2 // 1 retsub @@ -108,11 +108,11 @@ __puya_arc4_router___test_nested_tuple_modification_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_nested_tuple_modification intc_2 // 1 retsub @@ -133,7 +133,7 @@ __puya_arc4_router_____algopy_default_create@11: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_2 // 1 retsub diff --git a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir index d4d68d664f..e1e9e4cb00 100644 --- a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir +++ b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir @@ -16,55 +16,55 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@2: // test_static_elements_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements() return 1u block@3: // test_dynamic_elements_route_L56 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements() return 1u block@4: // test_mixed_single_dynamic_elements_route_L75 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements() return 1u block@5: // test_mixed_multiple_dynamic_elements_route_L90 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements() return 1u block@6: // test_nested_struct_replacement_route_L107 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement() return 1u block@7: // test_nested_tuple_modification_route_L134 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification() return 1u block@8: // switch_case_default_L38 @@ -77,7 +77,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract: block@11: // __algopy_default_create_L1 let tmp%28#0: uint64 = (txn ApplicationID) let tmp%29#0: bool = (== tmp%28#0 0u) - (assert tmp%29#0) // is creating + (assert tmp%29#0) // can only call when creating test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.__algopy_default_create() return 1u block@12: // switch_case_default_L38 diff --git a/test_cases/arc4_dynamic_arrays/puya.log b/test_cases/arc4_dynamic_arrays/puya.log index 016351cc46..02e6383b8a 100644 --- a/test_cases/arc4_dynamic_arrays/puya.log +++ b/test_cases/arc4_dynamic_arrays/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_dynamic_arrays'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_dynamic_arrays'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv arc4_dynamic_arrays/contract.py:169:9 warning: expression result is ignored info: writing arc4_dynamic_arrays/out/module.awst @@ -4818,6 +4818,7 @@ debug: _puya_lib.arc4.dynamic_array_concat_dynamic_element f-stack on first stor debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack entry: [] debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack on first store: ['head_offset#0', 'original_item_length#0', 'new_item_length#0', 'new_head_and_tail#0', 'tmp%7#0'] info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json +info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.clear.teal info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.approval.bin diff --git a/test_cases/arc4_numeric_comparisons/puya.log b/test_cases/arc4_numeric_comparisons/puya.log index 77073d908b..b6b991dcbd 100644 --- a/test_cases/arc4_numeric_comparisons/puya.log +++ b/test_cases/arc4_numeric_comparisons/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_numeric_comparisons'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_numeric_comparisons'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing arc4_numeric_comparisons/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir index 6e29593f13..45b7dec6b0 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___xyz_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub xyz tmp%7#0 byte 0x151f7c75 tmp%7#0,0x151f7c75 l-load tmp%7#0 1 0x151f7c75,tmp%7#0 @@ -50,9 +50,9 @@ __puya_arc4_router___xyz_raw_route@3: // @arc4.abimethod txn OnCompletion tmp%9#0 ! tmp%10#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%11#0 - assert // is not creating + assert // can only call when not creating callsub xyz_raw tmp%13#0 byte 0x151f7c75 tmp%13#0,0x151f7c75 l-load tmp%13#0 1 0x151f7c75,tmp%13#0 @@ -71,7 +71,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%16#0 ! tmp%17#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal index fcc75ed098..3ba40307fb 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___xyz_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub xyz bytec_0 // 0x151f7c75 swap @@ -41,9 +41,9 @@ __puya_arc4_router___xyz_raw_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub xyz_raw bytec_0 // 0x151f7c75 swap @@ -59,7 +59,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json index cc42214eeb..bdd842620e 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXoKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXpfcmF3CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXooKSAtPiBieXRlczoKeHl6OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHh5eihzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6Ny0xMQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJYIiksCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlkiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWiIpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF90eXBlcy5keW5hbWljX3N0cmluZ19hcnJheS5BcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QueHl6X3JhdygpIC0+IGJ5dGVzOgp4eXpfcmF3OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMy0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6X3JhdyhzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTUtMTkKICAgIC8vIHJhdyA9IGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OCkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OSkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg5MCkpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10uZnJvbV9ieXRlcyhyYXcuYnl0ZXMpCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHh5egogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3Jhd19yb3V0ZUAzOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgeHl6X3JhdwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjQKICAgIC8vIGNsYXNzIEFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo0CiAgICAvLyBjbGFzcyBBcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Lnh5eigpIC0+IGJ5dGVzOgp4eXo6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo3LTExCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlgiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWSIpLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJaIiksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXpfcmF3KCkgLT4gYnl0ZXM6Cnh5el9yYXc6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjEzLTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB4eXpfcmF3KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxNS0xOQogICAgLy8gcmF3ID0gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg4KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg5KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDkwKSksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToyMAogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXS5mcm9tX2J5dGVzKHJhdy5ieXRlcykKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json new file mode 100644 index 0000000000..7a65d2c54d --- /dev/null +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "Arc4DynamicStringArrayContract", + "structs": {}, + "methods": [ + { + "name": "xyz", + "args": [], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "xyz_raw", + "args": [], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 68, + 84 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 105 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 71, + 87 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHh5egogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3Jhd19yb3V0ZUAzOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgeHl6X3JhdwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjQKICAgIC8vIGNsYXNzIEFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo0CiAgICAvLyBjbGFzcyBBcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Lnh5eigpIC0+IGJ5dGVzOgp4eXo6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo3LTExCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlgiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWSIpLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJaIiksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXpfcmF3KCkgLT4gYnl0ZXM6Cnh5el9yYXc6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjEzLTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB4eXpfcmF3KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxNS0xOQogICAgLy8gcmF3ID0gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg4KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg5KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDkwKSksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToyMAogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXS5mcm9tX2J5dGVzKHJhdy5ieXRlcykKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQAmAgQVH3x1EQADAAYACQAMAAFYAAFZAAFaiAABQ4oAATEbQQA3ggIEaxDlJwSU3bHCNhoAjgIAAgASI4kxGRREMRhEiAAjKExQsCKJMRkURDEYRIgAGChMULAiiTEZQAAGMRgURCKJI4mKAAEpiYoAASmJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir index 9663aaaf53..cd2de72fe9 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir index c23df53c99..d07c743082 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -27,10 +27,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -45,7 +45,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir index 52efe60ff5..277759cddc 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir index 5895e30179..dd80183432 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir index 6581d4843a..f6914af9f6 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir index d65503c117..e101e425ff 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir index 9663aaaf53..cd2de72fe9 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir index 305375d093..88801e399b 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir index 1c06d2a5ba..5688daa819 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir index 8ec92f7379..79944bce21 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir index e91d61e8c1..4485e21a8d 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir index 7093b68e1d..a1a1515c17 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir index dc24ce04ba..bcb500ffa6 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir index 9affae8a2d..9e994d6c82 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir index c33b934285..ef77535a0e 100644 --- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.approval.teal b/test_cases/arc4_types/out/MutableParams2.approval.teal index 4be905d621..221c2b6813 100644 --- a/test_cases/arc4_types/out/MutableParams2.approval.teal +++ b/test_cases/arc4_types/out/MutableParams2.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___test_array_rebinding_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_array_rebinding intc_1 // 1 retsub @@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/arc4_types/out/MutableParams2.arc32.json b/test_cases/arc4_types/out/MutableParams2.arc32.json index 1514d314eb..f84855e35f 100644 --- a/test_cases/arc4_types/out/MutableParams2.arc32.json +++ b/test_cases/arc4_types/out/MutableParams2.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJyYXlfcmViaW5kaW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcnJheV9yZWJpbmRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NAogICAgLy8gY2xhc3MgTXV0YWJsZVBhcmFtczIoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/arc4_types/out/MutableParams2.arc56.json b/test_cases/arc4_types/out/MutableParams2.arc56.json new file mode 100644 index 0000000000..4cca59f0bb --- /dev/null +++ b/test_cases/arc4_types/out/MutableParams2.arc56.json @@ -0,0 +1,102 @@ +{ + "name": "MutableParams2", + "structs": {}, + "methods": [ + { + "name": "test_array_rebinding", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 52 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcnJheV9yZWJpbmRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NAogICAgLy8gY2xhc3MgTXV0YWJsZVBhcmFtczIoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAGIAAFDigABMRtBABuABGrEpVc2GgCOAQACIokxGRREMRhEiAAPI4kxGUAABjEYFEQjiSKJigAAgAMAAQAjiAAbgAQAAgABEkSAAwABASKIAAqABQADASoEEkSJigIBIiOL/0EAJov+VwIAgAEBUEkVFlcGAkxQjP6ABQADAQIEIowBi/6MAIz+QgAZi/5XAgCAASpQSRUWVwYCTFBHAoz+jACM/ov+VwIAgAEEUEkVFlcGAkxQjP6LAUEABIv+jACJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/arc4_types/out/MutableParams2.destructured.ir b/test_cases/arc4_types/out/MutableParams2.destructured.ir index e39aa56ece..c49d5095cc 100644 --- a/test_cases/arc4_types/out/MutableParams2.destructured.ir +++ b/test_cases/arc4_types/out/MutableParams2.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.ir b/test_cases/arc4_types/out/MutableParams2.ssa.ir index e9b1880586..c269fbae23 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@3: // switch_case_default_L4 @@ -32,7 +32,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.arc4_types.mutable_params2.MutableParams2.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir index 962e5bb1a6..97e8c2a623 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir index 60427fa195..71ef69f96b 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir index 9827062f58..69d62d6816 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir index 8567cf917e..1a851bae1f 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir index 7a6e5a4609..dc588445a3 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir index 5116c57fed..bc418f5719 100644 --- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir +++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal index 1b55a7e756..afd90af95d 100644 --- a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal +++ b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___xyz_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub xyz bytec_0 // 0x151f7c75 swap @@ -35,9 +35,9 @@ __puya_arc4_router___xyz_route@2: __puya_arc4_router___xyz_raw_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub xyz_raw bytec_0 // 0x151f7c75 swap @@ -51,7 +51,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir index 9663aaaf53..cd2de72fe9 100644 --- a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir +++ b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out_O2/MutableParams2.approval.teal b/test_cases/arc4_types/out_O2/MutableParams2.approval.teal index 0c43532309..feb6100a87 100644 --- a/test_cases/arc4_types/out_O2/MutableParams2.approval.teal +++ b/test_cases/arc4_types/out_O2/MutableParams2.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___test_array_rebinding_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_array_rebinding intc_1 // 1 retsub @@ -32,7 +32,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir b/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir index e39aa56ece..c49d5095cc 100644 --- a/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir +++ b/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@5: // bare_routing_L4 @@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal index 1917b71a43..6459c02648 100644 --- a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal +++ b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___xyz_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub xyz bytec 5 // 0x151f7c75 swap @@ -48,11 +48,11 @@ __puya_arc4_router___xyz_raw_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub xyz_raw bytec 5 // 0x151f7c75 swap @@ -77,7 +77,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_2 // 1 retsub diff --git a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir index 6c0cc18301..a945f13c28 100644 --- a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir +++ b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@2: // xyz_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -27,10 +27,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@3: // xyz_raw_route_L13 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw() let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) (log tmp%14#0) @@ -45,7 +45,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal b/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal index 3df87a2107..9bf164f1e3 100644 --- a/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal +++ b/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal @@ -28,11 +28,11 @@ __puya_arc4_router___test_array_rebinding_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_array_rebinding intc_1 // 1 retsub @@ -53,7 +53,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir b/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir index d9f9171777..5221b2a9a5 100644 --- a/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir +++ b/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@2: // test_array_rebinding_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding() return 1u block@3: // switch_case_default_L4 @@ -32,7 +32,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.arc4_types.mutable_params2.MutableParams2.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log index 38e9362492..c0365d6c14 100644 --- a/test_cases/arc4_types/puya.log +++ b/test_cases/arc4_types/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_types'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_types'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv arc4_types/mutable_params.py:63:9 warning: expression result is ignored arc4_types/mutable_params.py:79:9 warning: expression result is ignored @@ -22242,6 +22242,7 @@ info: Writing arc4_types/out/Arc4MutationContract.clear.bin info: Writing arc4_types/out/Arc4MutationContract.approval.puya.map info: Writing arc4_types/out/Arc4MutationContract.clear.puya.map info: Writing arc4_types/out/MutableParams2.arc32.json +info: Writing arc4_types/out/MutableParams2.arc56.json info: Writing arc4_types/out/MutableParams2.approval.teal info: Writing arc4_types/out/MutableParams2.clear.teal info: Writing arc4_types/out/MutableParams2.approval.bin @@ -22255,6 +22256,7 @@ info: Writing arc4_types/out/Arc4MutableParamsContract.clear.bin info: Writing arc4_types/out/Arc4MutableParamsContract.approval.puya.map info: Writing arc4_types/out/Arc4MutableParamsContract.clear.puya.map info: Writing arc4_types/out/Arc4DynamicStringArrayContract.arc32.json +info: Writing arc4_types/out/Arc4DynamicStringArrayContract.arc56.json info: Writing arc4_types/out/Arc4DynamicStringArrayContract.approval.teal info: Writing arc4_types/out/Arc4DynamicStringArrayContract.clear.teal info: Writing arc4_types/out/Arc4DynamicStringArrayContract.approval.bin diff --git a/test_cases/arc_56/contract.py b/test_cases/arc_56/contract.py new file mode 100644 index 0000000000..5c7d7557cb --- /dev/null +++ b/test_cases/arc_56/contract.py @@ -0,0 +1,120 @@ +from algopy import ( + ARC4Contract, + Box, + BoxMap, + BoxRef, + GlobalState, + LocalState, + String, + TemplateVar, + UInt64, + arc4, + subroutine, +) + + +class SharedStruct(arc4.Struct): + """This struct is shared""" + + foo: arc4.DynamicBytes + bar: arc4.UInt8 + + +class EventOnly(arc4.Struct): + """This struct is only used in an event""" + + x: arc4.UInt64 + y: arc4.UInt64 + + +class TopLevelStruct(arc4.Struct): + a: arc4.UInt64 + b: arc4.String + shared: SharedStruct + + +class StateStruct(arc4.Struct): + a: arc4.UInt64 + b: arc4.String + + +class Contract(ARC4Contract): + + def __init__(self) -> None: + self.g_struct = GlobalState(StateStruct) + self.g_uint64 = GlobalState(UInt64, key=b"gu") + self.g_address = GlobalState(arc4.Address, key=b"ga") + + self.l_struct = LocalState(StateStruct) + self.l_uint64 = LocalState(UInt64, key=b"lu") + self.l_address = LocalState(arc4.Address, key=b"la") + + self.b_struct = Box(StateStruct) + self.b_uint64 = Box(UInt64, key=b"bu") + self.b_address = Box(arc4.Address, key=b"ba") + + self.box_map_struct = BoxMap(StateStruct, SharedStruct) + self.box_map_uint64 = BoxMap(UInt64, SharedStruct, key_prefix=b"bmu") + self.box_map_address = BoxMap(arc4.Address, SharedStruct, key_prefix=b"bma") + + self.box_ref = BoxRef() + self.box_ref2 = BoxRef(key=b"br") + + @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"]) + def bare_create(self) -> None: + pass + + @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"]) + def create(self) -> None: + pass + + @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + def transient(self) -> None: + pass + + @arc4.abimethod() + def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64: + assert arg.shared == shared, "this might error" + return UInt64(42) + + @arc4.abimethod(readonly=True) + def struct_return(self, arg: TopLevelStruct) -> SharedStruct: + assert arg.shared == echo(arg.shared), "this won't error" + return arg.shared + + @arc4.abimethod(name="emits_error", readonly=True) + def errors(self, arg: TopLevelStruct) -> None: + assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error" + + @arc4.abimethod() + def emitter(self) -> None: + arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42))) + + arc4.emit( + "Anonymous", + String("hello"), + SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)), + ) + + @arc4.abimethod() + def conditional_emit(self, should_emit: bool) -> None: + if should_emit: + arc4.emit( + "Anonymous2", + EventOnly(arc4.UInt64(42), arc4.UInt64(43)), + SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)), + ) + + @arc4.abimethod() + def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]: + return ( + TemplateVar[SharedStruct]("STRUCT"), + TemplateVar[UInt64]("AVM_UINT64"), + TemplateVar[String]("AVM_STRING"), + TemplateVar[arc4.UInt8]("ARC4_UINT8"), + ) + + +@subroutine +def echo(s: SharedStruct) -> SharedStruct: + return s diff --git a/test_cases/arc_56/out/Contract.approval.mir b/test_cases/arc_56/out/Contract.approval.mir new file mode 100644 index 0000000000..b2ca886fd6 --- /dev/null +++ b/test_cases/arc_56/out/Contract.approval.mir @@ -0,0 +1,403 @@ +// Op Stack (out) +// test_cases.arc_56.contract.Contract.approval_program() -> uint64: +main_block@0: + callsub __puya_arc4_router__ tmp%1#0 + return + + +// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + proto 0 1 + +__puya_arc4_router___block@0: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txn NumAppArgs tmp%0#0 + bz __puya_arc4_router___bare_routing@11 + // Implicit fall through to __puya_arc4_router___abi_routing@1 + +__puya_arc4_router___abi_routing@1: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 0 tmp%2#0 + method create()void tmp%2#0,Method(create()void) + method struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64 tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64) + method struct_return((uint64,string,(byte[],uint8)))(byte[],uint8) tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)) + method emits_error((uint64,string,(byte[],uint8)))void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void) + method emitter()void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void) + method conditional_emit(bool)void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void) + method template_value()((byte[],uint8),uint64,string,uint8) tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void),Method(template_value()((byte[],uint8),uint64,string,uint8)) + l-load tmp%2#0 7 Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void),Method(template_value()((byte[],uint8),uint64,string,uint8)),tmp%2#0 + match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8 + int 0 0 + retsub 0 + +__puya_arc4_router___create_route@2: + // arc_56/contract.py:67 + // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"]) + txn OnCompletion tmp%3#0 + int 1 tmp%3#0,1 + l-load tmp%3#0 1 1,tmp%3#0 + shl tmp%4#0 + int 3 tmp%4#0,3 + & tmp%5#0 + assert // OnCompletion is not one of NoOp, OptIn + int 1 1 + retsub 1 + +__puya_arc4_router___struct_arg_route@3: + // arc_56/contract.py:75 + // @arc4.abimethod() + txn OnCompletion tmp%6#0 + ! tmp%7#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%8#0 + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 tmp%10#0 + txna ApplicationArgs 2 tmp%10#0,tmp%11#0 + // arc_56/contract.py:75 + // @arc4.abimethod() + l-load tmp%10#0 1 tmp%11#0,tmp%10#0 + l-load tmp%11#0 1 tmp%10#0,tmp%11#0 + callsub struct_arg to_encode%0#0 + itob val_as_bytes%0#0 + byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 + l-load val_as_bytes%0#0 1 0x151f7c75,val_as_bytes%0#0 + concat tmp%12#0 + log + int 1 1 + retsub 1 + +__puya_arc4_router___struct_return_route@4: + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + txn OnCompletion tmp%13#0 + ! tmp%14#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%15#0 + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 tmp%17#0 + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + callsub struct_return tmp%18#0 + byte 0x151f7c75 tmp%18#0,0x151f7c75 + l-load tmp%18#0 1 0x151f7c75,tmp%18#0 + concat tmp%19#0 + log + int 1 1 + retsub 1 + +__puya_arc4_router___emits_error_route@5: + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + txn OnCompletion tmp%20#0 + ! tmp%21#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%22#0 + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 tmp%24#0 + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + callsub errors + int 1 1 + retsub 1 + +__puya_arc4_router___emitter_route@6: + // arc_56/contract.py:89 + // @arc4.abimethod() + txn OnCompletion tmp%25#0 + ! tmp%26#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%27#0 + assert // can only call when not creating + callsub emitter + int 1 1 + retsub 1 + +__puya_arc4_router___conditional_emit_route@7: + // arc_56/contract.py:99 + // @arc4.abimethod() + txn OnCompletion tmp%29#0 + ! tmp%30#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%31#0 + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 tmp%33#0 + int 0 tmp%33#0,0 + getbit tmp%34#0 + // arc_56/contract.py:99 + // @arc4.abimethod() + callsub conditional_emit + int 1 1 + retsub 1 + +__puya_arc4_router___template_value_route@8: + // arc_56/contract.py:108 + // @arc4.abimethod() + txn OnCompletion tmp%35#0 + ! tmp%36#0 + assert // OnCompletion is not NoOp + txn ApplicationID tmp%37#0 + assert // can only call when not creating + callsub template_value elements_to_encode%0#0,elements_to_encode%1#0,elements_to_encode%2#0,elements_to_encode%3#0 + l-load elements_to_encode%1#0 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,elements_to_encode%1#0 + itob elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0 + l-load-copy elements_to_encode%2#0 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,elements_to_encode%2#0 (copy) + len elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,length%0#0 + itob elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,as_bytes%0#0 + extract 6 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,length_uint16%0#0 + l-load elements_to_encode%2#0 3 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,length_uint16%0#0,elements_to_encode%2#0 + concat elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0 + l-load-copy elements_to_encode%0#0 3 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,elements_to_encode%0#0 (copy) + len elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,data_length%0#0 + int 13 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,data_length%0#0,13 + l-load data_length%0#0 1 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,13,data_length%0#0 + + elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,current_tail_offset%1#0 + byte 0x000d elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,current_tail_offset%1#0,0x000d + l-load val_as_bytes%1#0 3 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,current_tail_offset%1#0,0x000d,val_as_bytes%1#0 + concat elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,current_tail_offset%1#0,encoded_tuple_buffer%2#0 + l-load current_tail_offset%1#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,current_tail_offset%1#0 + itob elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,as_bytes%2#0 + extract 6 2 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,offset_as_uint16%1#0 + l-load encoded_tuple_buffer%2#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,offset_as_uint16%1#0,encoded_tuple_buffer%2#0 + l-load offset_as_uint16%1#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,offset_as_uint16%1#0 + concat elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%3#0 + l-load elements_to_encode%3#0 2 elements_to_encode%0#0,encoded_value%0#0,encoded_tuple_buffer%3#0,elements_to_encode%3#0 + concat elements_to_encode%0#0,encoded_value%0#0,encoded_tuple_buffer%4#0 + l-load elements_to_encode%0#0 2 encoded_value%0#0,encoded_tuple_buffer%4#0,elements_to_encode%0#0 + concat encoded_value%0#0,encoded_tuple_buffer%5#0 + l-load encoded_value%0#0 1 encoded_tuple_buffer%5#0,encoded_value%0#0 + concat encoded_tuple_buffer%6#0 + byte 0x151f7c75 encoded_tuple_buffer%6#0,0x151f7c75 + l-load encoded_tuple_buffer%6#0 1 0x151f7c75,encoded_tuple_buffer%6#0 + concat tmp%39#0 + log + int 1 1 + retsub 1 + +__puya_arc4_router___bare_routing@11: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txn OnCompletion tmp%40#0 + switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13 + int 0 0 + retsub 0 + +__puya_arc4_router___bare_create@12: + // arc_56/contract.py:63-64 + // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"]) + // def bare_create(self) -> None: + int 1 1 + retsub 1 + +__puya_arc4_router___transient@13: + // arc_56/contract.py:71 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + txn ApplicationID tmp%41#0 + ! tmp%42#0 + assert // can only call when creating + // arc_56/contract.py:71-72 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + // def transient(self) -> None: + int 1 1 + retsub 1 + +__puya_arc4_router___after_if_else@16: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + int 0 0 + retsub 0 + + +// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: +struct_arg: (𝕡) arg#0,shared#0 | + // arc_56/contract.py:75-76 + // @arc4.abimethod() + // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64: + proto 2 1 (𝕡) arg#0,shared#0 | + +struct_arg_block@0: (𝕡) arg#0,shared#0 | + // arc_56/contract.py:77 + // assert arg.shared == shared, "this might error" + p-load arg#0 (𝕡) arg#0,shared#0 | arg#0 (copy) + int 10 (𝕡) arg#0,shared#0 | arg#0 (copy),10 + extract_uint16 (𝕡) arg#0,shared#0 | item_start_offset%0#0 + p-load arg#0 (𝕡) arg#0,shared#0 | item_start_offset%0#0,arg#0 (copy) + len (𝕡) arg#0,shared#0 | item_start_offset%0#0,item_end_offset%0#0 + p-load arg#0 (𝕡) arg#0,shared#0 | item_start_offset%0#0,item_end_offset%0#0,arg#0 (copy) + l-load item_start_offset%0#0 2 (𝕡) arg#0,shared#0 | item_end_offset%0#0,arg#0 (copy),item_start_offset%0#0 + l-load item_end_offset%0#0 2 (𝕡) arg#0,shared#0 | arg#0 (copy),item_start_offset%0#0,item_end_offset%0#0 + substring3 (𝕡) arg#0,shared#0 | tmp%0#0 + p-load shared#0 (𝕡) arg#0,shared#0 | tmp%0#0,shared#0 (copy) + == (𝕡) arg#0,shared#0 | tmp%1#0 + assert // this might error (𝕡) arg#0,shared#0 | + // arc_56/contract.py:78 + // return UInt64(42) + int 42 (𝕡) arg#0,shared#0 | 42 + retsub 42 + + +// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: +struct_return: (𝕡) arg#0 | + // arc_56/contract.py:80-81 + // @arc4.abimethod(readonly=True) + // def struct_return(self, arg: TopLevelStruct) -> SharedStruct: + proto 1 1 (𝕡) arg#0 | + +struct_return_block@0: (𝕡) arg#0 | + // arc_56/contract.py:82 + // assert arg.shared == echo(arg.shared), "this won't error" + p-load arg#0 (𝕡) arg#0 | arg#0 (copy) + int 10 (𝕡) arg#0 | arg#0 (copy),10 + extract_uint16 (𝕡) arg#0 | item_start_offset%0#0 + p-load arg#0 (𝕡) arg#0 | item_start_offset%0#0,arg#0 (copy) + len (𝕡) arg#0 | item_start_offset%0#0,item_end_offset%0#0 + p-load arg#0 (𝕡) arg#0 | item_start_offset%0#0,item_end_offset%0#0,arg#0 (copy) + l-load item_start_offset%0#0 2 (𝕡) arg#0 | item_end_offset%0#0,arg#0 (copy),item_start_offset%0#0 + l-load item_end_offset%0#0 2 (𝕡) arg#0 | arg#0 (copy),item_start_offset%0#0,item_end_offset%0#0 + substring3 (𝕡) arg#0 | tmp%0#0 + l-load-copy tmp%0#0 0 (𝕡) arg#0 | tmp%0#0,tmp%0#0 (copy) + callsub echo (𝕡) arg#0 | tmp%0#0,echo%0#0,echo%1#0 + pop 1 (𝕡) arg#0 | tmp%0#0,echo%0#0 + l-store echo%0#0 0 (𝕡) arg#0 | tmp%0#0,echo%0#0 + l-load-copy tmp%0#0 1 (𝕡) arg#0 | tmp%0#0,echo%0#0,tmp%0#0 (copy) + l-load echo%0#0 1 (𝕡) arg#0 | tmp%0#0,tmp%0#0 (copy),echo%0#0 + == (𝕡) arg#0 | tmp%0#0,tmp%2#0 + assert // this won't error (𝕡) arg#0 | tmp%0#0 + // arc_56/contract.py:83 + // return arg.shared + l-load tmp%0#0 0 (𝕡) arg#0 | tmp%0#0 + retsub tmp%0#0 + + +// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes: +echo: (𝕡) s#0 | + // arc_56/contract.py:118-119 + // @subroutine + // def echo(s: SharedStruct) -> SharedStruct: + proto 1 2 (𝕡) s#0 | + +echo_block@0: (𝕡) s#0 | + // arc_56/contract.py:120 + // return s + p-load s#0 (𝕡) s#0 | s#0 (copy) + p-load s#0 (𝕡) s#0 | s#0 (copy),s#0 (copy) + retsub s#0 (copy),s#0 (copy) + + +// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: +errors: (𝕡) arg#0 | + // arc_56/contract.py:85-86 + // @arc4.abimethod(name="emits_error", readonly=True) + // def errors(self, arg: TopLevelStruct) -> None: + proto 1 0 (𝕡) arg#0 | + +errors_block@0: (𝕡) arg#0 | + // arc_56/contract.py:87 + // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error" + p-load arg#0 (𝕡) arg#0 | arg#0 (copy) + extract 0 8 // on error: Index access is out of bounds (𝕡) arg#0 | tmp%0#0 + byte 0x00 (𝕡) arg#0 | tmp%0#0,0x00 + == (𝕡) arg#0 | tmp%1#0 + assert // this will error (𝕡) arg#0 | + retsub + + +// test_cases.arc_56.contract.Contract.emitter() -> void: +emitter: + // arc_56/contract.py:89-90 + // @arc4.abimethod() + // def emitter(self) -> None: + proto 0 0 + +emitter_block@0: + // arc_56/contract.py:91 + // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42))) + method SharedStruct(byte[],uint8) Method(SharedStruct(byte[],uint8)) + byte 0x00032a000668656c6c6f31 Method(SharedStruct(byte[],uint8)),0x00032a000668656c6c6f31 + concat event%0#0 + log + // arc_56/contract.py:93-97 + // arc4.emit( + // "Anonymous", + // String("hello"), + // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)), + // ) + method Anonymous(string,(byte[],uint8)) Method(Anonymous(string,(byte[],uint8))) + byte 0x0004000b000568656c6c6f00032a000668656c6c6f32 Method(Anonymous(string,(byte[],uint8))),0x0004000b000568656c6c6f00032a000668656c6c6f32 + concat event%1#0 + log + retsub + + +// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void: +conditional_emit: (𝕡) should_emit#0 | + // arc_56/contract.py:99-100 + // @arc4.abimethod() + // def conditional_emit(self, should_emit: bool) -> None: + proto 1 0 (𝕡) should_emit#0 | + +conditional_emit_block@0: (𝕡) should_emit#0 | + // arc_56/contract.py:101 + // if should_emit: + p-load should_emit#0 (𝕡) should_emit#0 | should_emit#0 (copy) + bz conditional_emit_after_if_else@2 (𝕡) should_emit#0 | + // Implicit fall through to conditional_emit_if_body@1 (𝕡) should_emit#0 | + +conditional_emit_if_body@1: (𝕡) should_emit#0 | + // arc_56/contract.py:102-106 + // arc4.emit( + // "Anonymous2", + // EventOnly(arc4.UInt64(42), arc4.UInt64(43)), + // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)), + // ) + method Anonymous2((uint64,uint64),(byte[],uint8)) (𝕡) should_emit#0 | Method(Anonymous2((uint64,uint64),(byte[],uint8))) + byte 0x000000000000002a000000000000002b001200032a000668656c6c6f33 (𝕡) should_emit#0 | Method(Anonymous2((uint64,uint64),(byte[],uint8))),0x000000000000002a000000000000002b001200032a000668656c6c6f33 + concat (𝕡) should_emit#0 | event%0#0 + log (𝕡) should_emit#0 | + // Implicit fall through to conditional_emit_after_if_else@2 (𝕡) should_emit#0 | + +conditional_emit_after_if_else@2: (𝕡) should_emit#0 | + retsub + + +// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes: +template_value: + // arc_56/contract.py:108-109 + // @arc4.abimethod() + // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]: + proto 0 4 + +template_value_block@0: + // arc_56/contract.py:111 + // TemplateVar[SharedStruct]("STRUCT"), + byte TMPL_STRUCT TMPL_STRUCT + // arc_56/contract.py:112 + // TemplateVar[UInt64]("AVM_UINT64"), + int TMPL_AVM_UINT64 TMPL_STRUCT,TMPL_AVM_UINT64 + // arc_56/contract.py:113 + // TemplateVar[String]("AVM_STRING"), + byte TMPL_AVM_STRING TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING + // arc_56/contract.py:114 + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + byte TMPL_ARC4_UINT8 TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING,TMPL_ARC4_UINT8 + // arc_56/contract.py:110-115 + // return ( + // TemplateVar[SharedStruct]("STRUCT"), + // TemplateVar[UInt64]("AVM_UINT64"), + // TemplateVar[String]("AVM_STRING"), + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + // ) + retsub TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING,TMPL_ARC4_UINT8 + + diff --git a/test_cases/arc_56/out/Contract.approval.teal b/test_cases/arc_56/out/Contract.approval.teal new file mode 100644 index 0000000000..72a8a4092f --- /dev/null +++ b/test_cases/arc_56/out/Contract.approval.teal @@ -0,0 +1,355 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.approval_program: + intcblock 1 0 10 TMPL_AVM_UINT64 + bytecblock 0x151f7c75 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8 + callsub __puya_arc4_router__ + return + + +// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + proto 0 1 + txn NumAppArgs + bz __puya_arc4_router___bare_routing@11 + pushbytess 0x4c5c61ba 0x97e8e4a7 0x76c4de11 0xc1ca7709 0x6de762c2 0x59fc5282 0x9d9eecb0 // method "create()void", method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64", method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)", method "emits_error((uint64,string,(byte[],uint8)))void", method "emitter()void", method "conditional_emit(bool)void", method "template_value()((byte[],uint8),uint64,string,uint8)" + txna ApplicationArgs 0 + match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8 + intc_1 // 0 + retsub + +__puya_arc4_router___create_route@2: + // arc_56/contract.py:67 + // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"]) + intc_0 // 1 + txn OnCompletion + shl + pushint 3 // 3 + & + assert // OnCompletion is not one of NoOp, OptIn + intc_0 // 1 + retsub + +__puya_arc4_router___struct_arg_route@3: + // arc_56/contract.py:75 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // arc_56/contract.py:75 + // @arc4.abimethod() + callsub struct_arg + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___struct_return_route@4: + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + callsub struct_return + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___emits_error_route@5: + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + callsub errors + intc_0 // 1 + retsub + +__puya_arc4_router___emitter_route@6: + // arc_56/contract.py:89 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub emitter + intc_0 // 1 + retsub + +__puya_arc4_router___conditional_emit_route@7: + // arc_56/contract.py:99 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + intc_1 // 0 + getbit + // arc_56/contract.py:99 + // @arc4.abimethod() + callsub conditional_emit + intc_0 // 1 + retsub + +__puya_arc4_router___template_value_route@8: + // arc_56/contract.py:108 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub template_value + uncover 2 + itob + dig 2 + len + itob + extract 6 2 + uncover 3 + concat + dig 3 + len + pushint 13 // 13 + + + pushbytes 0x000d + uncover 3 + concat + swap + itob + extract 6 2 + concat + uncover 2 + concat + uncover 2 + concat + swap + concat + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@11: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txn OnCompletion + switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13 + intc_1 // 0 + retsub + +__puya_arc4_router___bare_create@12: + // arc_56/contract.py:63-64 + // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"]) + // def bare_create(self) -> None: + intc_0 // 1 + retsub + +__puya_arc4_router___transient@13: + // arc_56/contract.py:71 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + txn ApplicationID + ! + assert // can only call when creating + // arc_56/contract.py:71-72 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + // def transient(self) -> None: + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@16: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + intc_1 // 0 + retsub + + +// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: +struct_arg: + // arc_56/contract.py:75-76 + // @arc4.abimethod() + // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64: + proto 2 1 + // arc_56/contract.py:77 + // assert arg.shared == shared, "this might error" + frame_dig -2 + intc_2 // 10 + extract_uint16 + frame_dig -2 + len + frame_dig -2 + cover 2 + substring3 + frame_dig -1 + == + assert // this might error + // arc_56/contract.py:78 + // return UInt64(42) + pushint 42 // 42 + retsub + + +// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: +struct_return: + // arc_56/contract.py:80-81 + // @arc4.abimethod(readonly=True) + // def struct_return(self, arg: TopLevelStruct) -> SharedStruct: + proto 1 1 + // arc_56/contract.py:82 + // assert arg.shared == echo(arg.shared), "this won't error" + frame_dig -1 + intc_2 // 10 + extract_uint16 + frame_dig -1 + len + frame_dig -1 + cover 2 + substring3 + dup + callsub echo + pop + dig 1 + == + assert // this won't error + // arc_56/contract.py:83 + // return arg.shared + retsub + + +// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes: +echo: + // arc_56/contract.py:118-119 + // @subroutine + // def echo(s: SharedStruct) -> SharedStruct: + proto 1 2 + // arc_56/contract.py:120 + // return s + frame_dig -1 + dup + retsub + + +// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: +errors: + // arc_56/contract.py:85-86 + // @arc4.abimethod(name="emits_error", readonly=True) + // def errors(self, arg: TopLevelStruct) -> None: + proto 1 0 + // arc_56/contract.py:87 + // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error" + frame_dig -1 + extract 0 8 // on error: Index access is out of bounds + pushbytes 0x00 + == + assert // this will error + retsub + + +// test_cases.arc_56.contract.Contract.emitter() -> void: +emitter: + // arc_56/contract.py:89-90 + // @arc4.abimethod() + // def emitter(self) -> None: + proto 0 0 + // arc_56/contract.py:91 + // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42))) + pushbytess 0xd93f374e 0x00032a000668656c6c6f31 // method "SharedStruct(byte[],uint8)", 0x00032a000668656c6c6f31 + concat + log + // arc_56/contract.py:93-97 + // arc4.emit( + // "Anonymous", + // String("hello"), + // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)), + // ) + pushbytess 0x1e72af4e 0x0004000b000568656c6c6f00032a000668656c6c6f32 // method "Anonymous(string,(byte[],uint8))", 0x0004000b000568656c6c6f00032a000668656c6c6f32 + concat + log + retsub + + +// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void: +conditional_emit: + // arc_56/contract.py:99-100 + // @arc4.abimethod() + // def conditional_emit(self, should_emit: bool) -> None: + proto 1 0 + // arc_56/contract.py:101 + // if should_emit: + frame_dig -1 + bz conditional_emit_after_if_else@2 + // arc_56/contract.py:102-106 + // arc4.emit( + // "Anonymous2", + // EventOnly(arc4.UInt64(42), arc4.UInt64(43)), + // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)), + // ) + pushbytess 0x11c547ba 0x000000000000002a000000000000002b001200032a000668656c6c6f33 // method "Anonymous2((uint64,uint64),(byte[],uint8))", 0x000000000000002a000000000000002b001200032a000668656c6c6f33 + concat + log + +conditional_emit_after_if_else@2: + retsub + + +// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes: +template_value: + // arc_56/contract.py:108-109 + // @arc4.abimethod() + // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]: + proto 0 4 + // arc_56/contract.py:111 + // TemplateVar[SharedStruct]("STRUCT"), + bytec_1 // TMPL_STRUCT + // arc_56/contract.py:112 + // TemplateVar[UInt64]("AVM_UINT64"), + intc_3 // TMPL_AVM_UINT64 + // arc_56/contract.py:113 + // TemplateVar[String]("AVM_STRING"), + bytec_2 // TMPL_AVM_STRING + // arc_56/contract.py:114 + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + bytec_3 // TMPL_ARC4_UINT8 + // arc_56/contract.py:110-115 + // return ( + // TemplateVar[SharedStruct]("STRUCT"), + // TemplateVar[UInt64]("AVM_UINT64"), + // TemplateVar[String]("AVM_STRING"), + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + // ) + retsub diff --git a/test_cases/arc_56/out/Contract.arc32.json b/test_cases/arc_56/out/Contract.arc32.json new file mode 100644 index 0000000000..ccd02f8edd --- /dev/null +++ b/test_cases/arc_56/out/Contract.arc32.json @@ -0,0 +1,266 @@ +{ + "hints": { + "create()void": { + "call_config": { + "no_op": "ALL", + "opt_in": "ALL" + } + }, + "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64": { + "call_config": { + "no_op": "CALL" + }, + "structs": { + "arg": { + "name": "TopLevelStruct", + "elements": [ + [ + "a", + "uint64" + ], + [ + "b", + "string" + ], + [ + "shared", + "(byte[],uint8)" + ] + ] + }, + "shared": { + "name": "SharedStruct", + "elements": [ + [ + "foo", + "byte[]" + ], + [ + "bar", + "uint8" + ] + ] + } + } + }, + "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "arg": { + "name": "TopLevelStruct", + "elements": [ + [ + "a", + "uint64" + ], + [ + "b", + "string" + ], + [ + "shared", + "(byte[],uint8)" + ] + ] + }, + "output": { + "name": "SharedStruct", + "elements": [ + [ + "foo", + "byte[]" + ], + [ + "bar", + "uint8" + ] + ] + } + } + }, + "emits_error((uint64,string,(byte[],uint8)))void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "arg": { + "name": "TopLevelStruct", + "elements": [ + [ + "a", + "uint64" + ], + [ + "b", + "string" + ], + [ + "shared", + "(byte[],uint8)" + ] + ] + } + } + }, + "emitter()void": { + "call_config": { + "no_op": "CALL" + } + }, + "conditional_emit(bool)void": { + "call_config": { + "no_op": "CALL" + } + }, + "template_value()((byte[],uint8),uint64,string,uint8)": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMCBUTVBMX0FWTV9VSU5UNjQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSBUTVBMX1NUUlVDVCBUTVBMX0FWTV9TVFJJTkcgVE1QTF9BUkM0X1VJTlQ4CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTEKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDk3ZThlNGE3IDB4NzZjNGRlMTEgMHhjMWNhNzcwOSAweDZkZTc2MmMyIDB4NTlmYzUyODIgMHg5ZDllZWNiMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAic3RydWN0X2FyZygodWludDY0LHN0cmluZywoYnl0ZVtdLHVpbnQ4KSksKGJ5dGVbXSx1aW50OCkpdWludDY0IiwgbWV0aG9kICJzdHJ1Y3RfcmV0dXJuKCh1aW50NjQsc3RyaW5nLChieXRlW10sdWludDgpKSkoYnl0ZVtdLHVpbnQ4KSIsIG1ldGhvZCAiZW1pdHNfZXJyb3IoKHVpbnQ2NCxzdHJpbmcsKGJ5dGVbXSx1aW50OCkpKXZvaWQiLCBtZXRob2QgImVtaXR0ZXIoKXZvaWQiLCBtZXRob2QgImNvbmRpdGlvbmFsX2VtaXQoYm9vbCl2b2lkIiwgbWV0aG9kICJ0ZW1wbGF0ZV92YWx1ZSgpKChieXRlW10sdWludDgpLHVpbnQ2NCxzdHJpbmcsdWludDgpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RydWN0X2FyZ19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9yZXR1cm5fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VtaXR0ZXJfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb25kaXRpb25hbF9lbWl0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVtcGxhdGVfdmFsdWVfcm91dGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IiwgYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBvbmUgb2YgTm9PcCwgT3B0SW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9hcmdfcm91dGVAMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzdHJ1Y3RfYXJnCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdHJ1Y3RfcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBzdHJ1Y3RfcmV0dXJuCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iZW1pdHNfZXJyb3IiLCByZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJlbWl0c19lcnJvciIsIHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGVycm9ycwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdHRlcl9yb3V0ZUA2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGVtaXR0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbmRpdGlvbmFsX2VtaXRfcm91dGVANzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBjb25kaXRpb25hbF9lbWl0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZW1wbGF0ZV92YWx1ZV9yb3V0ZUA4OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZW1wbGF0ZV92YWx1ZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTMgLy8gMTMKICAgICsKICAgIHB1c2hieXRlcyAweDAwMGQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9jcmVhdGVAMTI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJhbGxvdyIsIGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgYmFyZV9jcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiLCBhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NzEtNzIKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIiwgYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdHJhbnNpZW50KHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LnN0cnVjdF9hcmcoYXJnOiBieXRlcywgc2hhcmVkOiBieXRlcykgLT4gdWludDY0OgpzdHJ1Y3RfYXJnOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHN0cnVjdF9hcmcoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCwgc2hhcmVkOiBTaGFyZWRTdHJ1Y3QpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgYXJnLnNoYXJlZCA9PSBzaGFyZWQsICJ0aGlzIG1pZ2h0IGVycm9yIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZnJhbWVfZGlnIC0yCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gdGhpcyBtaWdodCBlcnJvcgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gVUludDY0KDQyKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3Quc3RydWN0X3JldHVybihhcmc6IGJ5dGVzKSAtPiBieXRlczoKc3RydWN0X3JldHVybjoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MC04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgc3RydWN0X3JldHVybihzZWxmLCBhcmc6IFRvcExldmVsU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IGFyZy5zaGFyZWQgPT0gZWNobyhhcmcuc2hhcmVkKSwgInRoaXMgd29uJ3QgZXJyb3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY2FsbHN1YiBlY2hvCiAgICBwb3AKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRoaXMgd29uJ3QgZXJyb3IKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyZy5zaGFyZWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LmVjaG8oczogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZWNobzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8oczogU2hhcmVkU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMjAKICAgIC8vIHJldHVybiBzCiAgICBmcmFtZV9kaWcgLTEKICAgIGR1cAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuZXJyb3JzKGFyZzogYnl0ZXMpIC0+IHZvaWQ6CmVycm9yczoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImVtaXRzX2Vycm9yIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBlcnJvcnMoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJnLmEuYnl0ZXMgPT0gYXJjNC5VSW50OCgwKS5ieXRlcywgInRoaXMgd2lsbCBlcnJvciIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgPT0KICAgIGFzc2VydCAvLyB0aGlzIHdpbGwgZXJyb3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LmVtaXR0ZXIoKSAtPiB2b2lkOgplbWl0dGVyOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGVtaXR0ZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhcmM0LmVtaXQoU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMSIpLCBiYXI9YXJjNC5VSW50OCg0MikpKQogICAgcHVzaGJ5dGVzcyAweGQ5M2YzNzRlIDB4MDAwMzJhMDAwNjY4NjU2YzZjNmYzMSAvLyBtZXRob2QgIlNoYXJlZFN0cnVjdChieXRlW10sdWludDgpIiwgMHgwMDAzMmEwMDA2Njg2NTZjNmM2ZjMxCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkzLTk3CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91cyIsCiAgICAvLyAgICAgU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgIFNoYXJlZFN0cnVjdChmb289YXJjNC5EeW5hbWljQnl0ZXMoYiJoZWxsbzIiKSwgYmFyPWFyYzQuVUludDgoNDIpKSwKICAgIC8vICkKICAgIHB1c2hieXRlc3MgMHgxZTcyYWY0ZSAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyIC8vIG1ldGhvZCAiQW5vbnltb3VzKHN0cmluZywoYnl0ZVtdLHVpbnQ4KSkiLCAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuY29uZGl0aW9uYWxfZW1pdChzaG91bGRfZW1pdDogdWludDY0KSAtPiB2b2lkOgpjb25kaXRpb25hbF9lbWl0OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjb25kaXRpb25hbF9lbWl0KHNlbGYsIHNob3VsZF9lbWl0OiBib29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6MTAxCiAgICAvLyBpZiBzaG91bGRfZW1pdDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogY29uZGl0aW9uYWxfZW1pdF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMDItMTA2CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91czIiLAogICAgLy8gICAgIEV2ZW50T25seShhcmM0LlVJbnQ2NCg0MiksIGFyYzQuVUludDY0KDQzKSksCiAgICAvLyAgICAgU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMyIpLCBiYXI9YXJjNC5VSW50OCg0MikpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAweDExYzU0N2JhIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMyAvLyBtZXRob2QgIkFub255bW91czIoKHVpbnQ2NCx1aW50NjQpLChieXRlW10sdWludDgpKSIsIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMwogICAgY29uY2F0CiAgICBsb2cKCmNvbmRpdGlvbmFsX2VtaXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QudGVtcGxhdGVfdmFsdWUoKSAtPiBieXRlcywgdWludDY0LCBieXRlcywgYnl0ZXM6CnRlbXBsYXRlX3ZhbHVlOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVtcGxhdGVfdmFsdWUoc2VsZikgLT4gdHVwbGVbU2hhcmVkU3RydWN0LCBVSW50NjQsIFN0cmluZywgYXJjNC5VSW50OF06CiAgICBwcm90byAwIDQKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTEKICAgIC8vIFRlbXBsYXRlVmFyW1NoYXJlZFN0cnVjdF0oIlNUUlVDVCIpLAogICAgYnl0ZWNfMSAvLyBUTVBMX1NUUlVDVAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMgogICAgLy8gVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgaW50Y18zIC8vIFRNUExfQVZNX1VJTlQ2NAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMwogICAgLy8gVGVtcGxhdGVWYXJbU3RyaW5nXSgiQVZNX1NUUklORyIpLAogICAgYnl0ZWNfMiAvLyBUTVBMX0FWTV9TVFJJTkcKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTQKICAgIC8vIFRlbXBsYXRlVmFyW2FyYzQuVUludDhdKCJBUkM0X1VJTlQ4IiksCiAgICBieXRlY18zIC8vIFRNUExfQVJDNF9VSU5UOAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMC0xMTUKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbU2hhcmVkU3RydWN0XSgiU1RSVUNUIiksCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgLy8gICAgIFRlbXBsYXRlVmFyW1N0cmluZ10oIkFWTV9TVFJJTkciKSwKICAgIC8vICAgICBUZW1wbGF0ZVZhclthcmM0LlVJbnQ4XSgiQVJDNF9VSU5UOCIpLAogICAgLy8gKQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "state": { + "global": { + "num_byte_slices": 2, + "num_uints": 1 + }, + "local": { + "num_byte_slices": 2, + "num_uints": 1 + } + }, + "schema": { + "global": { + "declared": { + "g_address": { + "type": "bytes", + "key": "ga" + }, + "g_struct": { + "type": "bytes", + "key": "g_struct" + }, + "g_uint64": { + "type": "uint64", + "key": "gu" + } + }, + "reserved": {} + }, + "local": { + "declared": { + "l_address": { + "type": "bytes", + "key": "la" + }, + "l_struct": { + "type": "bytes", + "key": "l_struct" + }, + "l_uint64": { + "type": "uint64", + "key": "lu" + } + }, + "reserved": {} + } + }, + "contract": { + "name": "Contract", + "methods": [ + { + "name": "create", + "args": [], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "struct_arg", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "name": "arg" + }, + { + "type": "(byte[],uint8)", + "name": "shared" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "struct_return", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "name": "arg" + } + ], + "readonly": true, + "returns": { + "type": "(byte[],uint8)" + } + }, + { + "name": "emits_error", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "name": "arg" + } + ], + "readonly": true, + "returns": { + "type": "void" + } + }, + { + "name": "emitter", + "args": [], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "conditional_emit", + "args": [ + { + "type": "bool", + "name": "should_emit" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "template_value", + "args": [], + "readonly": false, + "returns": { + "type": "((byte[],uint8),uint64,string,uint8)" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "ALL", + "opt_in": "ALL", + "delete_application": "CREATE" + } +} \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.arc56.json b/test_cases/arc_56/out/Contract.arc56.json new file mode 100644 index 0000000000..60df709acf --- /dev/null +++ b/test_cases/arc_56/out/Contract.arc56.json @@ -0,0 +1,495 @@ +{ + "name": "Contract", + "structs": { + "EventOnly": [ + { + "name": "x", + "type": "uint64" + }, + { + "name": "y", + "type": "uint64" + } + ], + "SharedStruct": [ + { + "name": "foo", + "type": "byte[]" + }, + { + "name": "bar", + "type": "uint8" + } + ], + "StateStruct": [ + { + "name": "a", + "type": "uint64" + }, + { + "name": "b", + "type": "string" + } + ], + "TopLevelStruct": [ + { + "name": "a", + "type": "uint64" + }, + { + "name": "b", + "type": "string" + }, + { + "name": "shared", + "type": "SharedStruct" + } + ] + }, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp", + "OptIn" + ], + "call": [ + "NoOp", + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "struct_arg", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "struct": "TopLevelStruct", + "name": "arg" + }, + { + "type": "(byte[],uint8)", + "struct": "SharedStruct", + "name": "shared" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "struct_return", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "struct": "TopLevelStruct", + "name": "arg" + } + ], + "returns": { + "type": "(byte[],uint8)", + "struct": "SharedStruct" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "emits_error", + "args": [ + { + "type": "(uint64,string,(byte[],uint8))", + "struct": "TopLevelStruct", + "name": "arg" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "emitter", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "SharedStruct", + "args": [ + { + "type": "byte[]", + "name": "foo" + }, + { + "type": "uint8", + "name": "bar" + } + ], + "desc": "This struct is shared" + }, + { + "name": "Anonymous", + "args": [ + { + "type": "string", + "name": "field1" + }, + { + "type": "(byte[],uint8)", + "name": "field2", + "struct": "SharedStruct" + } + ] + } + ], + "recommendations": {} + }, + { + "name": "conditional_emit", + "args": [ + { + "type": "bool", + "name": "should_emit" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "Anonymous2", + "args": [ + { + "type": "(uint64,uint64)", + "name": "field1", + "struct": "EventOnly" + }, + { + "type": "(byte[],uint8)", + "name": "field2", + "struct": "SharedStruct" + } + ] + } + ], + "recommendations": {} + }, + { + "name": "template_value", + "args": [], + "returns": { + "type": "((byte[],uint8),uint64,string,uint8)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 2 + }, + "local": { + "ints": 1, + "bytes": 2 + } + }, + "keys": { + "global": { + "g_struct": { + "keyType": "AVMString", + "valueType": "StateStruct", + "key": "Z19zdHJ1Y3Q=" + }, + "g_uint64": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "Z3U=" + }, + "g_address": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "Z2E=" + } + }, + "local": { + "l_struct": { + "keyType": "AVMString", + "valueType": "StateStruct", + "key": "bF9zdHJ1Y3Q=" + }, + "l_uint64": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "bHU=" + }, + "l_address": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "bGE=" + } + }, + "box": { + "b_struct": { + "keyType": "AVMString", + "valueType": "StateStruct", + "key": "Yl9zdHJ1Y3Q=" + }, + "b_uint64": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "YnU=" + }, + "b_address": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "YmE=" + }, + "box_ref": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X3JlZg==" + }, + "box_ref2": { + "keyType": "AVMBytes", + "valueType": "AVMBytes", + "key": "YnI=" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "box_map_struct": { + "keyType": "StateStruct", + "valueType": "SharedStruct", + "prefix": "Ym94X21hcF9zdHJ1Y3Q=" + }, + "box_map_uint64": { + "keyType": "AVMUint64", + "valueType": "SharedStruct", + "prefix": "Ym11" + }, + "box_map_address": { + "keyType": "address", + "valueType": "SharedStruct", + "prefix": "Ym1h" + } + } + } + }, + "bareActions": { + "create": [ + "DeleteApplication", + "NoOp", + "OptIn" + ], + "call": [ + "NoOp", + "OptIn" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 113, + 136, + 155, + 170, + 182, + 199 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 107 + ], + "errorMessage": "OnCompletion is not one of NoOp, OptIn" + }, + { + "pc": [ + 275 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 116, + 139, + 158, + 173, + 185, + 202 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 298 + ], + "errorMessage": "this might error" + }, + { + "pc": [ + 346 + ], + "errorMessage": "this will error" + }, + { + "pc": [ + 325 + ], + "errorMessage": "this won't error" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMCBUTVBMX0FWTV9VSU5UNjQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSBUTVBMX1NUUlVDVCBUTVBMX0FWTV9TVFJJTkcgVE1QTF9BUkM0X1VJTlQ4CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTEKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDk3ZThlNGE3IDB4NzZjNGRlMTEgMHhjMWNhNzcwOSAweDZkZTc2MmMyIDB4NTlmYzUyODIgMHg5ZDllZWNiMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAic3RydWN0X2FyZygodWludDY0LHN0cmluZywoYnl0ZVtdLHVpbnQ4KSksKGJ5dGVbXSx1aW50OCkpdWludDY0IiwgbWV0aG9kICJzdHJ1Y3RfcmV0dXJuKCh1aW50NjQsc3RyaW5nLChieXRlW10sdWludDgpKSkoYnl0ZVtdLHVpbnQ4KSIsIG1ldGhvZCAiZW1pdHNfZXJyb3IoKHVpbnQ2NCxzdHJpbmcsKGJ5dGVbXSx1aW50OCkpKXZvaWQiLCBtZXRob2QgImVtaXR0ZXIoKXZvaWQiLCBtZXRob2QgImNvbmRpdGlvbmFsX2VtaXQoYm9vbCl2b2lkIiwgbWV0aG9kICJ0ZW1wbGF0ZV92YWx1ZSgpKChieXRlW10sdWludDgpLHVpbnQ2NCxzdHJpbmcsdWludDgpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RydWN0X2FyZ19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9yZXR1cm5fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VtaXR0ZXJfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb25kaXRpb25hbF9lbWl0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVtcGxhdGVfdmFsdWVfcm91dGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IiwgYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBvbmUgb2YgTm9PcCwgT3B0SW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9hcmdfcm91dGVAMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzdHJ1Y3RfYXJnCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdHJ1Y3RfcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBzdHJ1Y3RfcmV0dXJuCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iZW1pdHNfZXJyb3IiLCByZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJlbWl0c19lcnJvciIsIHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGVycm9ycwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdHRlcl9yb3V0ZUA2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGVtaXR0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbmRpdGlvbmFsX2VtaXRfcm91dGVANzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBjb25kaXRpb25hbF9lbWl0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZW1wbGF0ZV92YWx1ZV9yb3V0ZUA4OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZW1wbGF0ZV92YWx1ZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTMgLy8gMTMKICAgICsKICAgIHB1c2hieXRlcyAweDAwMGQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9jcmVhdGVAMTI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJhbGxvdyIsIGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgYmFyZV9jcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiLCBhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NzEtNzIKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIiwgYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdHJhbnNpZW50KHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LnN0cnVjdF9hcmcoYXJnOiBieXRlcywgc2hhcmVkOiBieXRlcykgLT4gdWludDY0OgpzdHJ1Y3RfYXJnOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHN0cnVjdF9hcmcoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCwgc2hhcmVkOiBTaGFyZWRTdHJ1Y3QpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgYXJnLnNoYXJlZCA9PSBzaGFyZWQsICJ0aGlzIG1pZ2h0IGVycm9yIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZnJhbWVfZGlnIC0yCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gdGhpcyBtaWdodCBlcnJvcgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gVUludDY0KDQyKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3Quc3RydWN0X3JldHVybihhcmc6IGJ5dGVzKSAtPiBieXRlczoKc3RydWN0X3JldHVybjoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MC04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgc3RydWN0X3JldHVybihzZWxmLCBhcmc6IFRvcExldmVsU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IGFyZy5zaGFyZWQgPT0gZWNobyhhcmcuc2hhcmVkKSwgInRoaXMgd29uJ3QgZXJyb3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY2FsbHN1YiBlY2hvCiAgICBwb3AKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRoaXMgd29uJ3QgZXJyb3IKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyZy5zaGFyZWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LmVjaG8oczogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZWNobzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8oczogU2hhcmVkU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMjAKICAgIC8vIHJldHVybiBzCiAgICBmcmFtZV9kaWcgLTEKICAgIGR1cAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuZXJyb3JzKGFyZzogYnl0ZXMpIC0+IHZvaWQ6CmVycm9yczoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImVtaXRzX2Vycm9yIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBlcnJvcnMoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJnLmEuYnl0ZXMgPT0gYXJjNC5VSW50OCgwKS5ieXRlcywgInRoaXMgd2lsbCBlcnJvciIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgPT0KICAgIGFzc2VydCAvLyB0aGlzIHdpbGwgZXJyb3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LmVtaXR0ZXIoKSAtPiB2b2lkOgplbWl0dGVyOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGVtaXR0ZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhcmM0LmVtaXQoU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMSIpLCBiYXI9YXJjNC5VSW50OCg0MikpKQogICAgcHVzaGJ5dGVzcyAweGQ5M2YzNzRlIDB4MDAwMzJhMDAwNjY4NjU2YzZjNmYzMSAvLyBtZXRob2QgIlNoYXJlZFN0cnVjdChieXRlW10sdWludDgpIiwgMHgwMDAzMmEwMDA2Njg2NTZjNmM2ZjMxCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkzLTk3CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91cyIsCiAgICAvLyAgICAgU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgIFNoYXJlZFN0cnVjdChmb289YXJjNC5EeW5hbWljQnl0ZXMoYiJoZWxsbzIiKSwgYmFyPWFyYzQuVUludDgoNDIpKSwKICAgIC8vICkKICAgIHB1c2hieXRlc3MgMHgxZTcyYWY0ZSAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyIC8vIG1ldGhvZCAiQW5vbnltb3VzKHN0cmluZywoYnl0ZVtdLHVpbnQ4KSkiLCAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuY29uZGl0aW9uYWxfZW1pdChzaG91bGRfZW1pdDogdWludDY0KSAtPiB2b2lkOgpjb25kaXRpb25hbF9lbWl0OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjb25kaXRpb25hbF9lbWl0KHNlbGYsIHNob3VsZF9lbWl0OiBib29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6MTAxCiAgICAvLyBpZiBzaG91bGRfZW1pdDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogY29uZGl0aW9uYWxfZW1pdF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMDItMTA2CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91czIiLAogICAgLy8gICAgIEV2ZW50T25seShhcmM0LlVJbnQ2NCg0MiksIGFyYzQuVUludDY0KDQzKSksCiAgICAvLyAgICAgU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMyIpLCBiYXI9YXJjNC5VSW50OCg0MikpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAweDExYzU0N2JhIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMyAvLyBtZXRob2QgIkFub255bW91czIoKHVpbnQ2NCx1aW50NjQpLChieXRlW10sdWludDgpKSIsIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMwogICAgY29uY2F0CiAgICBsb2cKCmNvbmRpdGlvbmFsX2VtaXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QudGVtcGxhdGVfdmFsdWUoKSAtPiBieXRlcywgdWludDY0LCBieXRlcywgYnl0ZXM6CnRlbXBsYXRlX3ZhbHVlOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVtcGxhdGVfdmFsdWUoc2VsZikgLT4gdHVwbGVbU2hhcmVkU3RydWN0LCBVSW50NjQsIFN0cmluZywgYXJjNC5VSW50OF06CiAgICBwcm90byAwIDQKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTEKICAgIC8vIFRlbXBsYXRlVmFyW1NoYXJlZFN0cnVjdF0oIlNUUlVDVCIpLAogICAgYnl0ZWNfMSAvLyBUTVBMX1NUUlVDVAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMgogICAgLy8gVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgaW50Y18zIC8vIFRNUExfQVZNX1VJTlQ2NAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMwogICAgLy8gVGVtcGxhdGVWYXJbU3RyaW5nXSgiQVZNX1NUUklORyIpLAogICAgYnl0ZWNfMiAvLyBUTVBMX0FWTV9TVFJJTkcKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTQKICAgIC8vIFRlbXBsYXRlVmFyW2FyYzQuVUludDhdKCJBUkM0X1VJTlQ4IiksCiAgICBieXRlY18zIC8vIFRNUExfQVJDNF9VSU5UOAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMC0xMTUKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbU2hhcmVkU3RydWN0XSgiU1RSVUNUIiksCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgLy8gICAgIFRlbXBsYXRlVmFyW1N0cmluZ10oIkFWTV9TVFJJTkciKSwKICAgIC8vICAgICBUZW1wbGF0ZVZhclthcmM0LlVJbnQ4XSgiQVJDNF9VSU5UOCIpLAogICAgLy8gKQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAQAKeyYEBBUffHUHAAP/AAJIaQVIZWxsbwH/iAABQ4oAATEbQQDSggcETFxhugSX6OSnBHbE3hEEwcp3CQRt52LCBFn8UoIEnZ7ssDYaAI4HAAIADAAjADYARQBRAGIjiSIxGZCBAxpEIokxGRREMRhENhoBNhoCiACaFihMULAiiTEZFEQxGEQ2GgGIAJwoTFCwIokxGRREMRhENhoBiACpIokxGRREMRhEiACrIokxGRREMRhENhoBI1OIANMiiTEZFEQxGESIAPdPAhZLAhUWVwYCTwNQSwMVgQ0IgAIADU8DUEwWVwYCUE8CUE8CUExQKExQsCKJMRmNBgACAAIACgAKAAoABCOJIokxGBREIokjiYoCAYv+JFmL/hWL/k4CUov/EkSBKomKAQGL/yRZi/8Vi/9OAlJJiAAGSEsBEkSJigECi/9JiYoBAIv/VwAIgAEAEkSJigAAggIE2T83TgsAAyoABmhlbGxvMVCwggIEHnKvThYABAALAAVoZWxsbwADKgAGaGVsbG8yULCJigEAi/9BACeCAgQRxUe6HQAAAAAAAAAqAAAAAAAAACsAEgADKgAGaGVsbG8zULCJigAEKSUqK4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [ + { + "name": "SharedStruct", + "args": [ + { + "type": "byte[]", + "name": "foo" + }, + { + "type": "uint8", + "name": "bar" + } + ], + "desc": "This struct is shared" + }, + { + "name": "Anonymous", + "args": [ + { + "type": "string", + "name": "field1" + }, + { + "type": "(byte[],uint8)", + "name": "field2", + "struct": "SharedStruct" + } + ] + }, + { + "name": "Anonymous2", + "args": [ + { + "type": "(uint64,uint64)", + "name": "field1", + "struct": "EventOnly" + }, + { + "type": "(byte[],uint8)", + "name": "field2", + "struct": "SharedStruct" + } + ] + } + ], + "templateVariables": { + "STRUCT": { + "type": "SharedStruct", + "value": "AAP/AAJIaQ==" + }, + "AVM_UINT64": { + "type": "AVMUint64", + "value": "AAAAAAAAAHs=" + }, + "AVM_STRING": { + "type": "AVMString", + "value": "SGVsbG8=" + }, + "ARC4_UINT8": { + "type": "uint8", + "value": "/w==" + } + } +} \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.clear.mir b/test_cases/arc_56/out/Contract.clear.mir new file mode 100644 index 0000000000..b72a9c6b48 --- /dev/null +++ b/test_cases/arc_56/out/Contract.clear.mir @@ -0,0 +1,7 @@ +// Op Stack (out) +// test_cases.arc_56.contract.Contract.clear_state_program() -> uint64: +main_block@0: + int 1 1 + return + + diff --git a/test_cases/arc_56/out/Contract.clear.teal b/test_cases/arc_56/out/Contract.clear.teal new file mode 100644 index 0000000000..883b1f693b --- /dev/null +++ b/test_cases/arc_56/out/Contract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.clear_state_program: + pushint 1 // 1 + return diff --git a/test_cases/arc_56/out/Contract.destructured.ir b/test_cases/arc_56/out/Contract.destructured.ir new file mode 100644 index 0000000000..e66d0bbe01 --- /dev/null +++ b/test_cases/arc_56/out/Contract.destructured.ir @@ -0,0 +1,164 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.ir b/test_cases/arc_56/out/Contract.ssa.ir new file mode 100644 index 0000000000..3823a10578 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.ir @@ -0,0 +1,290 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%0#0: bool = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // call __init___L1 + test_cases.arc_56.contract.Contract.__init__() + goto block@2 + block@2: // after_if_else_L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__init__() -> void: + block@0: // L43 + return + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + test_cases.arc_56.contract.Contract.create() + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (== tmp%6#0 NoOp) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + let tmp%9#0: bool = (!= tmp%8#0 0u) + (assert tmp%9#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (== tmp%13#0 NoOp) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + let tmp%16#0: bool = (!= tmp%15#0 0u) + (assert tmp%16#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (== tmp%20#0 NoOp) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + let tmp%23#0: bool = (!= tmp%22#0 0u) + (assert tmp%23#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (== tmp%25#0 NoOp) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + let tmp%28#0: bool = (!= tmp%27#0 0u) + (assert tmp%28#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (== tmp%29#0 NoOp) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + let tmp%32#0: bool = (!= tmp%31#0 0u) + (assert tmp%32#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (== tmp%35#0 NoOp) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + let tmp%38#0: bool = (!= tmp%37#0 0u) + (assert tmp%38#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let current_tail_offset%0#0: uint64 = 13u + let encoded_tuple_buffer%0#0: bytes = 0x + let as_bytes%1#0: bytes = (itob current_tail_offset%0#0) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 offset_as_uint16%0#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ current_tail_offset%0#0 data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let data_length%1#0: uint64 = (len encoded_value%0#0) + let current_tail_offset%2#0: uint64 = (+ current_tail_offset%1#0 data_length%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@9: // switch_case_default_L41 + goto block@10 + block@10: // switch_case_next_L41 + goto block@16 + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14} + block@12: // bare_create_L63 + test_cases.arc_56.contract.Contract.bare_create() + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (== tmp%41#0 0u) + (assert tmp%42#0) // can only call when creating + test_cases.arc_56.contract.Contract.transient() + return 1u + block@14: // switch_case_default_L41 + goto block@15 + block@15: // switch_case_next_L41 + goto block@16 + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.create() -> void: + block@0: // L67 + return + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%1#0: uint64 = (len arg#0) + let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%1#0 item_end_offset%1#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%1#0) + let tmp%1#1: bytes = echo%1#0 + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%2#0: uint64 = (len arg#0) + let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%2#0 item_end_offset%2#0) + return tmp%3#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + let s%is_original#0: bool = 1u + let s%out#0: bytes = s#0 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = (extract3 arg#0 0u 8u) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let length%0#0: uint64 = (len 0x68656c6c6f31) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31) + let current_tail_offset%0#0: uint64 = 3u + let encoded_tuple_buffer%0#0: bytes = 0x + let as_bytes%1#0: bytes = (itob current_tail_offset%0#0) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 offset_as_uint16%0#0) + let data_length%0#0: uint64 = (len encoded_value%0#0) + let current_tail_offset%1#0: uint64 = (+ current_tail_offset%0#0 data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0) + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let length%1#0: uint64 = (len "hello") + let as_bytes%2#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello") + let length%2#0: uint64 = (len 0x68656c6c6f32) + let as_bytes%3#0: bytes = (itob length%2#0) + let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0) + let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32) + let current_tail_offset%2#0: uint64 = 3u + let encoded_tuple_buffer%4#0: bytes = 0x + let as_bytes%4#0: bytes = (itob current_tail_offset%2#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%4#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 offset_as_uint16%1#0) + let data_length%1#0: uint64 = (len encoded_value%2#0) + let current_tail_offset%3#0: uint64 = (+ current_tail_offset%2#0 data_length%1#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a) + let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0) + let current_tail_offset%4#0: uint64 = 4u + let encoded_tuple_buffer%8#0: bytes = 0x + let as_bytes%5#0: bytes = (itob current_tail_offset%4#0) + let offset_as_uint16%2#0: bytes = ((extract 6 2) as_bytes%5#0) + let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%2#0) + let data_length%2#0: uint64 = (len encoded_value%1#0) + let current_tail_offset%5#0: uint64 = (+ current_tail_offset%4#0 data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0) + let data_length%3#0: uint64 = (len encoded_tuple_buffer%7#0) + let current_tail_offset%6#0: uint64 = (+ current_tail_offset%5#0 data_length%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let current_tail_offset%0#0: uint64 = 16u + let encoded_tuple_buffer%0#0: bytes = 0x + let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 0x000000000000002a) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b) + let length%0#0: uint64 = (len 0x68656c6c6f33) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33) + let current_tail_offset%1#0: uint64 = 3u + let encoded_tuple_buffer%3#0: bytes = 0x + let as_bytes%1#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 offset_as_uint16%0#0) + let data_length%0#0: uint64 = (len encoded_value%0#0) + let current_tail_offset%2#0: uint64 = (+ current_tail_offset%1#0 data_length%0#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let current_tail_offset%3#0: uint64 = 18u + let encoded_tuple_buffer%7#0: bytes = 0x + let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 encoded_tuple_buffer%2#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%3#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0) + let data_length%1#0: uint64 = (len encoded_tuple_buffer%6#0) + let current_tail_offset%4#0: uint64 = (+ current_tail_offset%3#0 data_length%1#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + subroutine test_cases.arc_56.contract.Contract.bare_create() -> void: + block@0: // L63 + return + + subroutine test_cases.arc_56.contract.Contract.transient() -> void: + block@0: // L71 + return + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir new file mode 100644 index 0000000000..c7236f5a8e --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir @@ -0,0 +1,220 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%0#0: bool = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // call __init___L1 + goto block@2 + block@2: // after_if_else_L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let offset_as_uint16%0#0: bytes = 0x000d + let encoded_tuple_buffer%1#0: bytes = offset_as_uint16%0#0 + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let data_length%1#0: uint64 = (len encoded_value%0#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let length%0#0: uint64 = 6u + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31) + let offset_as_uint16%0#0: bytes = 0x0003 + let encoded_tuple_buffer%1#0: bytes = offset_as_uint16%0#0 + let data_length%0#0: uint64 = (len encoded_value%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0) + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let length%1#0: uint64 = 5u + let as_bytes%2#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello") + let length%2#0: uint64 = 6u + let as_bytes%3#0: bytes = (itob length%2#0) + let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0) + let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32) + let offset_as_uint16%1#0: bytes = 0x0003 + let encoded_tuple_buffer%5#0: bytes = offset_as_uint16%1#0 + let data_length%1#0: uint64 = (len encoded_value%2#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a) + let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0) + let offset_as_uint16%2#0: bytes = 0x0004 + let encoded_tuple_buffer%9#0: bytes = offset_as_uint16%2#0 + let data_length%2#0: uint64 = (len encoded_value%1#0) + let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0) + let data_length%3#0: uint64 = (len encoded_tuple_buffer%7#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_tuple_buffer%1#0: bytes = 0x000000000000002a + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b) + let length%0#0: uint64 = 6u + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33) + let offset_as_uint16%0#0: bytes = 0x0003 + let encoded_tuple_buffer%4#0: bytes = offset_as_uint16%0#0 + let data_length%0#0: uint64 = (len encoded_value%0#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let encoded_tuple_buffer%8#0: bytes = encoded_tuple_buffer%2#0 + let offset_as_uint16%1#0: bytes = 0x0012 + let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0) + let data_length%1#0: uint64 = (len encoded_tuple_buffer%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir new file mode 100644 index 0000000000..e66d0bbe01 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir @@ -0,0 +1,164 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir new file mode 100644 index 0000000000..89fc4ae026 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir @@ -0,0 +1,191 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%0#0: bool = (txn ApplicationID) + goto block@2 + block@2: // after_if_else_L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let length_uint16%0#0: bytes = 0x0006 + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31) + let encoded_tuple_buffer%2#0: bytes = 0x00032a + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0) + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let length_uint16%1#0: bytes = 0x0005 + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello") + let length_uint16%2#0: bytes = 0x0006 + let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32) + let encoded_tuple_buffer%6#0: bytes = 0x00032a + let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0) + let data_length%2#0: uint64 = (len encoded_value%1#0) + let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_tuple_buffer%2#0: bytes = 0x000000000000002a000000000000002b + let length_uint16%0#0: bytes = 0x0006 + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33) + let encoded_tuple_buffer%5#0: bytes = 0x00032a + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%2#0 0x0012) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir new file mode 100644 index 0000000000..0625585356 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir @@ -0,0 +1,180 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let encoded_value%0#0: bytes = 0x000668656c6c6f31 + let encoded_tuple_buffer%3#0: bytes = (concat 0x00032a encoded_value%0#0) + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let encoded_value%1#0: bytes = 0x000568656c6c6f + let encoded_value%2#0: bytes = 0x000668656c6c6f32 + let encoded_tuple_buffer%7#0: bytes = (concat 0x00032a encoded_value%2#0) + let data_length%2#0: uint64 = (len encoded_value%1#0) + let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_value%0#0: bytes = 0x000668656c6c6f33 + let encoded_tuple_buffer%6#0: bytes = (concat 0x00032a encoded_value%0#0) + let encoded_tuple_buffer%9#0: bytes = 0x000000000000002a000000000000002b0012 + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir new file mode 100644 index 0000000000..3e7709a473 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir @@ -0,0 +1,175 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let encoded_tuple_buffer%3#0: bytes = 0x00032a000668656c6c6f31 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let encoded_tuple_buffer%7#0: bytes = 0x00032a000668656c6c6f32 + let data_length%2#0: uint64 = 7u + let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_tuple_buffer%6#0: bytes = 0x00032a000668656c6c6f33 + let encoded_tuple_buffer%10#0: bytes = (concat 0x000000000000002a000000000000002b0012 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir new file mode 100644 index 0000000000..7086ebbe50 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir @@ -0,0 +1,171 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let current_tail_offset%5#0: uint64 = 11u + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_tuple_buffer%10#0: bytes = 0x000000000000002a000000000000002b001200032a000668656c6c6f33 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir new file mode 100644 index 0000000000..8624f8f768 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir @@ -0,0 +1,168 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let offset_as_uint16%3#0: bytes = 0x000b + let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir new file mode 100644 index 0000000000..9f9e2bbdb1 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir @@ -0,0 +1,167 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let encoded_tuple_buffer%10#0: bytes = 0x0004000b + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir new file mode 100644 index 0000000000..3969c10884 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir @@ -0,0 +1,166 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let encoded_tuple_buffer%11#0: bytes = 0x0004000b000568656c6c6f + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir new file mode 100644 index 0000000000..d23c1c2c44 --- /dev/null +++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir @@ -0,0 +1,165 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let encoded_tuple_buffer%12#0: bytes = 0x0004000b000568656c6c6f00032a000668656c6c6f32 + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out/client_Contract.py b/test_cases/arc_56/out/client_Contract.py new file mode 100644 index 0000000000..767d3f8567 --- /dev/null +++ b/test_cases/arc_56/out/client_Contract.py @@ -0,0 +1,56 @@ +# This file is auto-generated, do not modify +# flake8: noqa +# fmt: off +import typing + +import algopy + +class SharedStruct(algopy.arc4.Struct): + foo: algopy.arc4.DynamicBytes + bar: algopy.arc4.UIntN[typing.Literal[8]] + +class TopLevelStruct(algopy.arc4.Struct): + a: algopy.arc4.UIntN[typing.Literal[64]] + b: algopy.arc4.String + shared: SharedStruct + +class Contract(algopy.arc4.ARC4Client, typing.Protocol): + @algopy.arc4.abimethod(allow_actions=['NoOp', 'OptIn'], create='allow') + def create( + self, + ) -> None: ... + + @algopy.arc4.abimethod + def struct_arg( + self, + arg: TopLevelStruct, + shared: SharedStruct, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: ... + + @algopy.arc4.abimethod(readonly=True) + def struct_return( + self, + arg: TopLevelStruct, + ) -> SharedStruct: ... + + @algopy.arc4.abimethod(readonly=True) + def emits_error( + self, + arg: TopLevelStruct, + ) -> None: ... + + @algopy.arc4.abimethod + def emitter( + self, + ) -> None: ... + + @algopy.arc4.abimethod + def conditional_emit( + self, + should_emit: algopy.arc4.Bool, + ) -> None: ... + + @algopy.arc4.abimethod + def template_value( + self, + ) -> algopy.arc4.Tuple[algopy.arc4.Tuple[algopy.arc4.DynamicBytes, algopy.arc4.UIntN[typing.Literal[8]]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.String, algopy.arc4.UIntN[typing.Literal[8]]]: ... diff --git a/test_cases/arc_56/out/module.awst b/test_cases/arc_56/out/module.awst new file mode 100644 index 0000000000..775bcb68a9 --- /dev/null +++ b/test_cases/arc_56/out/module.awst @@ -0,0 +1,100 @@ +contract Contract +{ + method_resolution_order: ( + algopy.arc4.ARC4Contract, + ) + globals { + ['g_struct']: test_cases.arc_56.contract.StateStruct + [hex<"6775">]: uint64 + [hex<"6761">]: arc4.static_array + } + locals { + ['l_struct']: test_cases.arc_56.contract.StateStruct + [hex<"6C75">]: uint64 + [hex<"6C61">]: arc4.static_array + } + boxes { + ['b_struct']: test_cases.arc_56.contract.StateStruct + [hex<"6275">]: uint64 + [hex<"6261">]: arc4.static_array + ['box_map_struct']: test_cases.arc_56.contract.StateStruct => test_cases.arc_56.contract.SharedStruct + [hex<"626D75">]: uint64 => test_cases.arc_56.contract.SharedStruct + [hex<"626D61">]: arc4.static_array => test_cases.arc_56.contract.SharedStruct + ['box_ref']: bytes + [hex<"6272">]: bytes + } + + subroutine test_cases.arc_56.contract.Contract.approval_program(): bool + { + if (!(txn())) { + this::__init__() + } + return arc4_router() + } + + subroutine algopy.arc4.ARC4Contract.clear_state_program(): bool + { + return true + } + + subroutine test_cases.arc_56.contract.Contract.__init__(): void + { + } + + baremethod test_cases.arc_56.contract.Contract.bare_create(): void + { + } + + abimethod test_cases.arc_56.contract.Contract.create(): void + { + } + + baremethod test_cases.arc_56.contract.Contract.transient(): void + { + } + + abimethod test_cases.arc_56.contract.Contract.struct_arg(arg: test_cases.arc_56.contract.TopLevelStruct, shared: test_cases.arc_56.contract.SharedStruct): uint64 + { + assert(arg.shared == shared, comment="this might error") + return 42u + } + + abimethod test_cases.arc_56.contract.Contract.struct_return(arg: test_cases.arc_56.contract.TopLevelStruct): test_cases.arc_56.contract.SharedStruct + { + assert(arg.shared == test_cases.arc_56.contract.echo(arg.shared), comment="this won't error") + return arg.shared + } + + abimethod[name_override=emits_error] test_cases.arc_56.contract.Contract.errors(arg: test_cases.arc_56.contract.TopLevelStruct): void + { + assert(reinterpret_cast(arg.a) == reinterpret_cast(0_arc4u8), comment="this will error") + } + + abimethod test_cases.arc_56.contract.Contract.emitter(): void + { + emit('SharedStruct(byte[],uint8)', new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F31">, arc4.dynamic_array), bar=42_arc4u8)) + emit('Anonymous(string,(byte[],uint8))', new Anonymous(field1=arc4_encode('hello', arc4.dynamic_array), field2=new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F32">, arc4.dynamic_array), bar=42_arc4u8))) + } + + abimethod test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool): void + { + if (should_emit) { + emit('Anonymous2((uint64,uint64),(byte[],uint8))', new Anonymous2(field1=new test_cases.arc_56.contract.EventOnly(x=42_arc4u64, y=43_arc4u64), field2=new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F33">, arc4.dynamic_array), bar=42_arc4u8))) + } + } + + abimethod test_cases.arc_56.contract.Contract.template_value(): tuple + { + return (TemplateVar[test_cases.arc_56.contract.SharedStruct](TMPL_STRUCT), TemplateVar[uint64](TMPL_AVM_UINT64), TemplateVar[string](TMPL_AVM_STRING), TemplateVar[arc4.uint8](TMPL_ARC4_UINT8)) + } + + subroutine algopy.arc4.ARC4Contract.approval_program(): bool + { + return arc4_router() + } +} + +subroutine echo(s: test_cases.arc_56.contract.SharedStruct): test_cases.arc_56.contract.SharedStruct +{ + return s +} \ No newline at end of file diff --git a/test_cases/arc_56/out_O2/Contract.approval.teal b/test_cases/arc_56/out_O2/Contract.approval.teal new file mode 100644 index 0000000000..0e1c40e44e --- /dev/null +++ b/test_cases/arc_56/out_O2/Contract.approval.teal @@ -0,0 +1,247 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.approval_program: + intcblock 1 0 10 TMPL_AVM_UINT64 + bytecblock 0x151f7c75 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8 + callsub __puya_arc4_router__ + return + + +// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + proto 0 1 + txn NumAppArgs + bz __puya_arc4_router___bare_routing@11 + pushbytess 0x4c5c61ba 0x97e8e4a7 0x76c4de11 0xc1ca7709 0x6de762c2 0x59fc5282 0x9d9eecb0 // method "create()void", method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64", method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)", method "emits_error((uint64,string,(byte[],uint8)))void", method "emitter()void", method "conditional_emit(bool)void", method "template_value()((byte[],uint8),uint64,string,uint8)" + txna ApplicationArgs 0 + match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8 + intc_1 // 0 + retsub + +__puya_arc4_router___create_route@2: + intc_0 // 1 + txn OnCompletion + shl + pushint 3 // 3 + & + assert // OnCompletion is not one of NoOp, OptIn + intc_0 // 1 + retsub + +__puya_arc4_router___struct_arg_route@3: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + txna ApplicationArgs 1 + txna ApplicationArgs 2 + callsub struct_arg + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___struct_return_route@4: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + txna ApplicationArgs 1 + callsub struct_return + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___emits_error_route@5: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + txna ApplicationArgs 1 + callsub errors + intc_0 // 1 + retsub + +__puya_arc4_router___emitter_route@6: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub emitter + intc_0 // 1 + retsub + +__puya_arc4_router___conditional_emit_route@7: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + txna ApplicationArgs 1 + intc_1 // 0 + getbit + callsub conditional_emit + intc_0 // 1 + retsub + +__puya_arc4_router___template_value_route@8: + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub template_value + uncover 2 + itob + dig 2 + len + itob + extract 6 2 + uncover 3 + concat + dig 3 + len + pushint 13 // 13 + + + pushbytes 0x000d + uncover 3 + concat + swap + itob + extract 6 2 + concat + uncover 2 + concat + uncover 2 + concat + swap + concat + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@11: + txn OnCompletion + switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13 + intc_1 // 0 + retsub + +__puya_arc4_router___bare_create@12: + intc_0 // 1 + retsub + +__puya_arc4_router___transient@13: + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@16: + intc_1 // 0 + retsub + + +// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: +struct_arg: + proto 2 1 + frame_dig -2 + intc_2 // 10 + extract_uint16 + frame_dig -2 + len + frame_dig -2 + cover 2 + substring3 + frame_dig -1 + == + assert // this might error + pushint 42 // 42 + retsub + + +// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: +struct_return: + proto 1 1 + frame_dig -1 + intc_2 // 10 + extract_uint16 + frame_dig -1 + len + frame_dig -1 + cover 2 + substring3 + dup + callsub echo + pop + dig 1 + == + assert // this won't error + retsub + + +// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes: +echo: + proto 1 2 + frame_dig -1 + dup + retsub + + +// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: +errors: + proto 1 0 + frame_dig -1 + extract 0 8 // on error: Index access is out of bounds + pushbytes 0x00 + == + assert // this will error + retsub + + +// test_cases.arc_56.contract.Contract.emitter() -> void: +emitter: + proto 0 0 + pushbytess 0xd93f374e 0x00032a000668656c6c6f31 // method "SharedStruct(byte[],uint8)", 0x00032a000668656c6c6f31 + concat + log + pushbytess 0x1e72af4e 0x0004000b000568656c6c6f00032a000668656c6c6f32 // method "Anonymous(string,(byte[],uint8))", 0x0004000b000568656c6c6f00032a000668656c6c6f32 + concat + log + retsub + + +// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void: +conditional_emit: + proto 1 0 + frame_dig -1 + bz conditional_emit_after_if_else@2 + pushbytess 0x11c547ba 0x000000000000002a000000000000002b001200032a000668656c6c6f33 // method "Anonymous2((uint64,uint64),(byte[],uint8))", 0x000000000000002a000000000000002b001200032a000668656c6c6f33 + concat + log + +conditional_emit_after_if_else@2: + retsub + + +// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes: +template_value: + proto 0 4 + bytec_1 // TMPL_STRUCT + intc_3 // TMPL_AVM_UINT64 + bytec_2 // TMPL_AVM_STRING + bytec_3 // TMPL_ARC4_UINT8 + retsub diff --git a/test_cases/arc_56/out_O2/Contract.clear.teal b/test_cases/arc_56/out_O2/Contract.clear.teal new file mode 100644 index 0000000000..883b1f693b --- /dev/null +++ b/test_cases/arc_56/out_O2/Contract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.clear_state_program: + pushint 1 // 1 + return diff --git a/test_cases/arc_56/out_O2/Contract.destructured.ir b/test_cases/arc_56/out_O2/Contract.destructured.ir new file mode 100644 index 0000000000..e66d0bbe01 --- /dev/null +++ b/test_cases/arc_56/out_O2/Contract.destructured.ir @@ -0,0 +1,164 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + goto tmp%0#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (! tmp%6#0) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (! tmp%13#0) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + (assert tmp%15#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (! tmp%20#0) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + (assert tmp%22#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (! tmp%25#0) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + (assert tmp%27#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (! tmp%29#0) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + (assert tmp%31#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (! tmp%35#0) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + (assert tmp%37#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u + block@12: // bare_create_L63 + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (! tmp%41#0) + (assert tmp%42#0) // can only call when creating + return 1u + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + return tmp%0#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31) + (log event%0#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/out_unoptimized/Contract.approval.teal b/test_cases/arc_56/out_unoptimized/Contract.approval.teal new file mode 100644 index 0000000000..9273c50511 --- /dev/null +++ b/test_cases/arc_56/out_unoptimized/Contract.approval.teal @@ -0,0 +1,561 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.approval_program: + intcblock 0 1 3 10 TMPL_AVM_UINT64 + bytecblock 0x 0x151f7c75 0x2a 0x68656c6c6f31 "hello" 0x68656c6c6f32 0x68656c6c6f33 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8 + txn ApplicationID + bnz main_after_if_else@2 + callsub __init__ + +main_after_if_else@2: + callsub __puya_arc4_router__ + return + + +// test_cases.arc_56.contract.Contract.__init__() -> void: +__init__: + // arc_56/contract.py:43 + // def __init__(self) -> None: + proto 0 0 + retsub + + +// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + proto 0 1 + txn NumAppArgs + intc_0 // 0 + != + bz __puya_arc4_router___bare_routing@11 + txna ApplicationArgs 0 + pushbytes 0x4c5c61ba // method "create()void" + pushbytes 0x97e8e4a7 // method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" + pushbytes 0x76c4de11 // method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" + pushbytes 0xc1ca7709 // method "emits_error((uint64,string,(byte[],uint8)))void" + pushbytes 0x6de762c2 // method "emitter()void" + pushbytes 0x59fc5282 // method "conditional_emit(bool)void" + pushbytes 0x9d9eecb0 // method "template_value()((byte[],uint8),uint64,string,uint8)" + uncover 7 + match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8 + b __puya_arc4_router___switch_case_default@9 + +__puya_arc4_router___create_route@2: + // arc_56/contract.py:67 + // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"]) + txn OnCompletion + intc_1 // 1 + swap + shl + intc_2 // 3 + & + assert // OnCompletion is not one of NoOp, OptIn + callsub create + intc_1 // 1 + retsub + +__puya_arc4_router___struct_arg_route@3: + // arc_56/contract.py:75 + // @arc4.abimethod() + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // arc_56/contract.py:75 + // @arc4.abimethod() + callsub struct_arg + itob + bytec_1 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + retsub + +__puya_arc4_router___struct_return_route@4: + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + // arc_56/contract.py:80 + // @arc4.abimethod(readonly=True) + callsub struct_return + bytec_1 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + retsub + +__puya_arc4_router___emits_error_route@5: + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + // arc_56/contract.py:85 + // @arc4.abimethod(name="emits_error", readonly=True) + callsub errors + intc_1 // 1 + retsub + +__puya_arc4_router___emitter_route@6: + // arc_56/contract.py:89 + // @arc4.abimethod() + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + callsub emitter + intc_1 // 1 + retsub + +__puya_arc4_router___conditional_emit_route@7: + // arc_56/contract.py:99 + // @arc4.abimethod() + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txna ApplicationArgs 1 + intc_0 // 0 + getbit + // arc_56/contract.py:99 + // @arc4.abimethod() + callsub conditional_emit + intc_1 // 1 + retsub + +__puya_arc4_router___template_value_route@8: + // arc_56/contract.py:108 + // @arc4.abimethod() + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + callsub template_value + cover 3 + cover 2 + swap + cover 2 + itob + cover 2 + dup + len + itob + extract 6 2 + swap + concat + cover 2 + pushint 13 // 13 + itob + extract 6 2 + bytec_0 // 0x + swap + concat + dig 1 + len + pushint 13 // 13 + + + swap + uncover 3 + concat + swap + itob + extract 6 2 + concat + uncover 3 + concat + swap + concat + swap + concat + bytec_1 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + retsub + +__puya_arc4_router___switch_case_default@9: + b __puya_arc4_router___after_if_else@16 + +__puya_arc4_router___bare_routing@11: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + txn OnCompletion + intc_0 // 0 + intc_1 // 1 + pushint 5 // 5 + uncover 3 + match __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___transient@13 + b __puya_arc4_router___switch_case_default@14 + +__puya_arc4_router___bare_create@12: + // arc_56/contract.py:63-64 + // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"]) + // def bare_create(self) -> None: + callsub bare_create + intc_1 // 1 + retsub + +__puya_arc4_router___transient@13: + // arc_56/contract.py:71 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + txn ApplicationID + intc_0 // 0 + == + assert // can only call when creating + // arc_56/contract.py:71-72 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + // def transient(self) -> None: + callsub transient + intc_1 // 1 + retsub + +__puya_arc4_router___switch_case_default@14: + +__puya_arc4_router___after_if_else@16: + // arc_56/contract.py:41 + // class Contract(ARC4Contract): + intc_0 // 0 + retsub + + +// test_cases.arc_56.contract.Contract.create() -> void: +create: + // arc_56/contract.py:67-68 + // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"]) + // def create(self) -> None: + proto 0 0 + retsub + + +// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: +struct_arg: + // arc_56/contract.py:75-76 + // @arc4.abimethod() + // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64: + proto 2 1 + // arc_56/contract.py:77 + // assert arg.shared == shared, "this might error" + frame_dig -2 + intc_3 // 10 + extract_uint16 + frame_dig -2 + len + frame_dig -2 + uncover 2 + uncover 2 + substring3 + frame_dig -1 + == + assert // this might error + // arc_56/contract.py:78 + // return UInt64(42) + pushint 42 // 42 + retsub + + +// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: +struct_return: + // arc_56/contract.py:80-81 + // @arc4.abimethod(readonly=True) + // def struct_return(self, arg: TopLevelStruct) -> SharedStruct: + proto 1 1 + // arc_56/contract.py:82 + // assert arg.shared == echo(arg.shared), "this won't error" + frame_dig -1 + intc_3 // 10 + extract_uint16 + frame_dig -1 + len + frame_dig -1 + uncover 2 + uncover 2 + substring3 + frame_dig -1 + intc_3 // 10 + extract_uint16 + frame_dig -1 + len + frame_dig -1 + uncover 2 + uncover 2 + substring3 + callsub echo + pop + == + assert // this won't error + // arc_56/contract.py:83 + // return arg.shared + frame_dig -1 + intc_3 // 10 + extract_uint16 + frame_dig -1 + len + frame_dig -1 + uncover 2 + uncover 2 + substring3 + retsub + + +// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes: +echo: + // arc_56/contract.py:118-119 + // @subroutine + // def echo(s: SharedStruct) -> SharedStruct: + proto 1 2 + // arc_56/contract.py:120 + // return s + frame_dig -1 + dup + retsub + + +// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: +errors: + // arc_56/contract.py:85-86 + // @arc4.abimethod(name="emits_error", readonly=True) + // def errors(self, arg: TopLevelStruct) -> None: + proto 1 0 + // arc_56/contract.py:87 + // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error" + frame_dig -1 + intc_0 // 0 + pushint 8 // 8 + extract3 // on error: Index access is out of bounds + pushbytes 0x00 + == + assert // this will error + retsub + + +// test_cases.arc_56.contract.Contract.emitter() -> void: +emitter: + // arc_56/contract.py:89-90 + // @arc4.abimethod() + // def emitter(self) -> None: + proto 0 0 + // arc_56/contract.py:91 + // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42))) + bytec_3 // 0x68656c6c6f31 + len + itob + extract 6 2 + bytec_3 // 0x68656c6c6f31 + concat + intc_2 // 3 + itob + extract 6 2 + bytec_0 // 0x + swap + concat + bytec_2 // 0x2a + concat + swap + concat + pushbytes 0xd93f374e // method "SharedStruct(byte[],uint8)" + swap + concat + log + // arc_56/contract.py:95 + // String("hello"), + bytec 4 // "hello" + len + itob + extract 6 2 + bytec 4 // "hello" + concat + // arc_56/contract.py:96 + // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)), + bytec 5 // 0x68656c6c6f32 + len + itob + extract 6 2 + bytec 5 // 0x68656c6c6f32 + concat + intc_2 // 3 + itob + extract 6 2 + bytec_0 // 0x + swap + concat + bytec_2 // 0x2a + concat + swap + concat + // arc_56/contract.py:93-97 + // arc4.emit( + // "Anonymous", + // String("hello"), + // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)), + // ) + pushint 4 // 4 + itob + extract 6 2 + bytec_0 // 0x + swap + concat + dig 2 + len + pushint 4 // 4 + + + itob + extract 6 2 + concat + uncover 2 + concat + swap + concat + pushbytes 0x1e72af4e // method "Anonymous(string,(byte[],uint8))" + swap + concat + log + retsub + + +// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void: +conditional_emit: + // arc_56/contract.py:99-100 + // @arc4.abimethod() + // def conditional_emit(self, should_emit: bool) -> None: + proto 1 0 + // arc_56/contract.py:101 + // if should_emit: + frame_dig -1 + bz conditional_emit_after_if_else@2 + // arc_56/contract.py:104 + // EventOnly(arc4.UInt64(42), arc4.UInt64(43)), + bytec_0 // 0x + pushbytes 0x000000000000002a + concat + pushbytes 0x000000000000002b + concat + // arc_56/contract.py:105 + // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)), + bytec 6 // 0x68656c6c6f33 + len + itob + extract 6 2 + bytec 6 // 0x68656c6c6f33 + concat + intc_2 // 3 + itob + extract 6 2 + bytec_0 // 0x + swap + concat + bytec_2 // 0x2a + concat + swap + concat + // arc_56/contract.py:102-106 + // arc4.emit( + // "Anonymous2", + // EventOnly(arc4.UInt64(42), arc4.UInt64(43)), + // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)), + // ) + bytec_0 // 0x + uncover 2 + concat + pushint 18 // 18 + itob + extract 6 2 + concat + swap + concat + pushbytes 0x11c547ba // method "Anonymous2((uint64,uint64),(byte[],uint8))" + swap + concat + log + +conditional_emit_after_if_else@2: + retsub + + +// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes: +template_value: + // arc_56/contract.py:108-109 + // @arc4.abimethod() + // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]: + proto 0 4 + // arc_56/contract.py:111 + // TemplateVar[SharedStruct]("STRUCT"), + bytec 7 // TMPL_STRUCT + // arc_56/contract.py:112 + // TemplateVar[UInt64]("AVM_UINT64"), + intc 4 // TMPL_AVM_UINT64 + // arc_56/contract.py:113 + // TemplateVar[String]("AVM_STRING"), + bytec 8 // TMPL_AVM_STRING + // arc_56/contract.py:114 + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + bytec 9 // TMPL_ARC4_UINT8 + // arc_56/contract.py:110-115 + // return ( + // TemplateVar[SharedStruct]("STRUCT"), + // TemplateVar[UInt64]("AVM_UINT64"), + // TemplateVar[String]("AVM_STRING"), + // TemplateVar[arc4.UInt8]("ARC4_UINT8"), + // ) + retsub + + +// test_cases.arc_56.contract.Contract.bare_create() -> void: +bare_create: + // arc_56/contract.py:63-64 + // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"]) + // def bare_create(self) -> None: + proto 0 0 + retsub + + +// test_cases.arc_56.contract.Contract.transient() -> void: +transient: + // arc_56/contract.py:71-72 + // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"]) + // def transient(self) -> None: + proto 0 0 + retsub diff --git a/test_cases/arc_56/out_unoptimized/Contract.clear.teal b/test_cases/arc_56/out_unoptimized/Contract.clear.teal new file mode 100644 index 0000000000..883b1f693b --- /dev/null +++ b/test_cases/arc_56/out_unoptimized/Contract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.arc_56.contract.Contract.clear_state_program: + pushint 1 // 1 + return diff --git a/test_cases/arc_56/out_unoptimized/Contract.destructured.ir b/test_cases/arc_56/out_unoptimized/Contract.destructured.ir new file mode 100644 index 0000000000..b07d431d36 --- /dev/null +++ b/test_cases/arc_56/out_unoptimized/Contract.destructured.ir @@ -0,0 +1,261 @@ +contract test_cases.arc_56.contract.Contract: + program approval: + subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool: + block@0: // L1 + let tmp%0#0: bool = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // call __init___L1 + test_cases.arc_56.contract.Contract.__init__() + goto block@2 + block@2: // after_if_else_L1 + let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__() + return tmp%1#0 + + subroutine test_cases.arc_56.contract.Contract.__init__() -> void: + block@0: // L43 + return + + subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool: + block@0: // L41 + let tmp%0#0: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@11 + block@1: // abi_routing_L41 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9} + block@2: // create_route_L67 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: uint64 = (shl 1u tmp%3#0) + let tmp%5#0: uint64 = (& tmp%4#0 3u) + (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn + test_cases.arc_56.contract.Contract.create() + return 1u + block@3: // struct_arg_route_L75 + let tmp%6#0: uint64 = (txn OnCompletion) + let tmp%7#0: bool = (== tmp%6#0 NoOp) + (assert tmp%7#0) // OnCompletion is not NoOp + let tmp%8#0: uint64 = (txn ApplicationID) + let tmp%9#0: bool = (!= tmp%8#0 0u) + (assert tmp%9#0) // can only call when not creating + let tmp%10#0: bytes = (txna ApplicationArgs 1) + let tmp%11#0: bytes = (txna ApplicationArgs 2) + let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0) + let val_as_bytes%0#0: bytes = (itob to_encode%0#0) + let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%12#0) + return 1u + block@4: // struct_return_route_L80 + let tmp%13#0: uint64 = (txn OnCompletion) + let tmp%14#0: bool = (== tmp%13#0 NoOp) + (assert tmp%14#0) // OnCompletion is not NoOp + let tmp%15#0: uint64 = (txn ApplicationID) + let tmp%16#0: bool = (!= tmp%15#0 0u) + (assert tmp%16#0) // can only call when not creating + let tmp%17#0: bytes = (txna ApplicationArgs 1) + let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0) + let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0) + (log tmp%19#0) + return 1u + block@5: // emits_error_route_L85 + let tmp%20#0: uint64 = (txn OnCompletion) + let tmp%21#0: bool = (== tmp%20#0 NoOp) + (assert tmp%21#0) // OnCompletion is not NoOp + let tmp%22#0: uint64 = (txn ApplicationID) + let tmp%23#0: bool = (!= tmp%22#0 0u) + (assert tmp%23#0) // can only call when not creating + let tmp%24#0: bytes = (txna ApplicationArgs 1) + test_cases.arc_56.contract.Contract.errors(tmp%24#0) + return 1u + block@6: // emitter_route_L89 + let tmp%25#0: uint64 = (txn OnCompletion) + let tmp%26#0: bool = (== tmp%25#0 NoOp) + (assert tmp%26#0) // OnCompletion is not NoOp + let tmp%27#0: uint64 = (txn ApplicationID) + let tmp%28#0: bool = (!= tmp%27#0 0u) + (assert tmp%28#0) // can only call when not creating + test_cases.arc_56.contract.Contract.emitter() + return 1u + block@7: // conditional_emit_route_L99 + let tmp%29#0: uint64 = (txn OnCompletion) + let tmp%30#0: bool = (== tmp%29#0 NoOp) + (assert tmp%30#0) // OnCompletion is not NoOp + let tmp%31#0: uint64 = (txn ApplicationID) + let tmp%32#0: bool = (!= tmp%31#0 0u) + (assert tmp%32#0) // can only call when not creating + let tmp%33#0: bytes = (txna ApplicationArgs 1) + let tmp%34#0: bool = (getbit tmp%33#0 0u) + test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0) + return 1u + block@8: // template_value_route_L108 + let tmp%35#0: uint64 = (txn OnCompletion) + let tmp%36#0: bool = (== tmp%35#0 NoOp) + (assert tmp%36#0) // OnCompletion is not NoOp + let tmp%37#0: uint64 = (txn ApplicationID) + let tmp%38#0: bool = (!= tmp%37#0 0u) + (assert tmp%38#0) // can only call when not creating + let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value() + let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0) + let length%0#0: uint64 = (len elements_to_encode%2#0) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0) + let as_bytes%1#0: bytes = (itob 13u) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%1#0: bytes = (concat 0x offset_as_uint16%0#0) + let data_length%0#0: uint64 = (len elements_to_encode%0#0) + let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0) + let as_bytes%2#0: bytes = (itob current_tail_offset%1#0) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) + (log tmp%39#0) + return 1u + block@9: // switch_case_default_L41 + goto block@10 + block@10: // switch_case_next_L41 + goto block@16 + block@11: // bare_routing_L41 + let tmp%40#0: uint64 = (txn OnCompletion) + switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14} + block@12: // bare_create_L63 + test_cases.arc_56.contract.Contract.bare_create() + return 1u + block@13: // transient_L71 + let tmp%41#0: uint64 = (txn ApplicationID) + let tmp%42#0: bool = (== tmp%41#0 0u) + (assert tmp%42#0) // can only call when creating + test_cases.arc_56.contract.Contract.transient() + return 1u + block@14: // switch_case_default_L41 + goto block@15 + block@15: // switch_case_next_L41 + goto block@16 + block@16: // after_if_else_L41 + return 0u + + subroutine test_cases.arc_56.contract.Contract.create() -> void: + block@0: // L67 + return + + subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64: + block@0: // L75 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let tmp%1#0: bool = (== tmp%0#0 shared#0) + (assert tmp%1#0) // this might error + return 42u + + subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes: + block@0: // L80 + let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%0#0: uint64 = (len arg#0) + let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) + let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%1#0: uint64 = (len arg#0) + let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%1#0 item_end_offset%1#0) + let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%1#0) + let tmp%2#0: bool = (== tmp%0#0 echo%0#0) + (assert tmp%2#0) // this won't error + let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u) + let item_end_offset%2#0: uint64 = (len arg#0) + let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%2#0 item_end_offset%2#0) + return tmp%3#0 + + subroutine test_cases.arc_56.contract.echo(s: bytes) -> : + block@0: // L118 + return s#0 s#0 + + subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void: + block@0: // L85 + let tmp%0#0: bytes = (extract3 arg#0 0u 8u) // on error: Index access is out of bounds + let tmp%1#0: bool = (== tmp%0#0 0x00) + (assert tmp%1#0) // this will error + return + + subroutine test_cases.arc_56.contract.Contract.emitter() -> void: + block@0: // L89 + let length%0#0: uint64 = (len 0x68656c6c6f31) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31) + let as_bytes%1#0: bytes = (itob 3u) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%1#0: bytes = (concat 0x offset_as_uint16%0#0) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a) + let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0) + let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0) + (log event%0#0) + let length%1#0: uint64 = (len "hello") + let as_bytes%2#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello") + let length%2#0: uint64 = (len 0x68656c6c6f32) + let as_bytes%3#0: bytes = (itob length%2#0) + let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0) + let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32) + let as_bytes%4#0: bytes = (itob 3u) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%4#0) + let encoded_tuple_buffer%5#0: bytes = (concat 0x offset_as_uint16%1#0) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a) + let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0) + let as_bytes%5#0: bytes = (itob 4u) + let offset_as_uint16%2#0: bytes = ((extract 6 2) as_bytes%5#0) + let encoded_tuple_buffer%9#0: bytes = (concat 0x offset_as_uint16%2#0) + let data_length%2#0: uint64 = (len encoded_value%1#0) + let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0) + let as_bytes%6#0: bytes = (itob current_tail_offset%5#0) + let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0) + let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0) + let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0) + let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0) + (log event%1#0) + return + + subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void: + block@0: // L99 + goto should_emit#0 ? block@1 : block@2 + block@1: // if_body_L102 + let encoded_tuple_buffer%1#0: bytes = (concat 0x 0x000000000000002a) + let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b) + let length%0#0: uint64 = (len 0x68656c6c6f33) + let as_bytes%0#0: bytes = (itob length%0#0) + let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0) + let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33) + let as_bytes%1#0: bytes = (itob 3u) + let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_tuple_buffer%4#0: bytes = (concat 0x offset_as_uint16%0#0) + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a) + let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0) + let encoded_tuple_buffer%8#0: bytes = (concat 0x encoded_tuple_buffer%2#0) + let as_bytes%2#0: bytes = (itob 18u) + let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0) + let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0) + let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0) + let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0) + (log event%0#0) + goto block@2 + block@2: // after_if_else_L101 + return + + subroutine test_cases.arc_56.contract.Contract.template_value() -> : + block@0: // L108 + return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8) + + subroutine test_cases.arc_56.contract.Contract.bare_create() -> void: + block@0: // L63 + return + + subroutine test_cases.arc_56.contract.Contract.transient() -> void: + block@0: // L71 + return + + program clear-state: + subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/test_cases/arc_56/puya.log b/test_cases/arc_56/puya.log new file mode 100644 index 0000000000..e1199e069f --- /dev/null +++ b/test_cases/arc_56/puya.log @@ -0,0 +1,2319 @@ +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'STRUCT': b'/x00/x03/xff/x00/x02Hi', 'AVM_UINT64': 123, 'AVM_STRING': b'Hello', 'ARC4_UINT8': b'/xff'}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_56'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +info: Found python prefix: /.venv +info: writing arc_56/out/module.awst +debug: Sealing block@0: // L12 +debug: Terminated block@0: // L12 +debug: Looking for 'required_budget_with_buffer' in an unsealed block creating an incomplete Phi: block@1: // while_top_L20 +debug: Created Phi assignment: let required_budget_with_buffer#1: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@1: // while_top_L20 +debug: Terminated block@1: // while_top_L20 +debug: Sealing block@2: // while_body_L21 +debug: Looking for 'fee_source' in an unsealed block creating an incomplete Phi: block@1: // while_top_L20 +debug: Created Phi assignment: let fee_source#1: uint64 = undefined while trying to resolve 'fee_source' in block@1: // while_top_L20 +debug: Terminated block@2: // while_body_L21 +debug: Sealing block@3: // switch_case_0_L28 +debug: Terminated block@3: // switch_case_0_L28 +debug: Sealing block@4: // switch_case_1_L30 +debug: Terminated block@4: // switch_case_1_L30 +debug: Sealing block@5: // switch_case_default_L26 +debug: Terminated block@5: // switch_case_default_L26 +debug: Sealing block@6: // switch_case_next_L26 +debug: Terminated block@6: // switch_case_next_L26 +debug: Sealing block@1: // while_top_L20 +debug: Added required_budget_with_buffer#0 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0) in block@0: // L12 +debug: Created Phi assignment: let required_budget_with_buffer#2: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@6: // switch_case_next_L26 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3) in block@3: // switch_case_0_L28 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4) in block@4: // switch_case_1_L30 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) in block@5: // switch_case_default_L26 +debug: Replacing trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1 +debug: Deleting Phi assignment: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) +debug: Replaced trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1 in current definition for 1 blocks +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) in block@6: // switch_case_next_L26 +debug: Replacing trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0 +debug: Deleting Phi assignment: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) +debug: Replaced trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0 in current definition for 6 blocks +debug: Added fee_source#0 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0) in block@0: // L12 +debug: Created Phi assignment: let fee_source#2: uint64 = undefined while trying to resolve 'fee_source' in block@6: // switch_case_next_L26 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3) in block@3: // switch_case_0_L28 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4) in block@4: // switch_case_1_L30 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) in block@5: // switch_case_default_L26 +debug: Replacing trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1 +debug: Deleting Phi assignment: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) +debug: Replaced trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1 in current definition for 1 blocks +debug: Added fee_source#1 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) in block@6: // switch_case_next_L26 +debug: Replacing trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0 +debug: Deleting Phi assignment: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) +debug: Replaced trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0 in current definition for 6 blocks +debug: Sealing block@7: // after_while_L20 +debug: Terminated block@7: // after_while_L20 +debug: Sealing block@0: // L4 +debug: Terminated block@0: // L4 +debug: Looking for 'start' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let start#1: uint64 = undefined while trying to resolve 'start' in block@1: // while_top_L11 +debug: Looking for 'item' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let item#1: bytes = undefined while trying to resolve 'item' in block@1: // while_top_L11 +debug: Looking for 'sequence' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let sequence#1: bytes = undefined while trying to resolve 'sequence' in block@1: // while_top_L11 +debug: Terminated block@1: // while_top_L11 +debug: Sealing block@2: // while_body_L12 +debug: Terminated block@2: // while_body_L12 +debug: Sealing block@3: // if_body_L13 +debug: Terminated block@3: // if_body_L13 +debug: Sealing block@4: // after_if_else_L12 +debug: Terminated block@4: // after_if_else_L12 +debug: Sealing block@1: // while_top_L11 +debug: Added start#0 to Phi node: let start#1: uint64 = φ(start#0 <- block@0) in block@0: // L4 +debug: Added start#2 to Phi node: let start#1: uint64 = φ(start#0 <- block@0, start#2 <- block@4) in block@4: // after_if_else_L12 +debug: Added item#0 to Phi node: let item#1: bytes = φ(item#0 <- block@0) in block@0: // L4 +debug: Added item#1 to Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) in block@4: // after_if_else_L12 +debug: Replacing trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0 +debug: Deleting Phi assignment: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) +debug: Replaced trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0 in current definition for 3 blocks +debug: Added sequence#0 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0) in block@0: // L4 +debug: Added sequence#1 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) in block@4: // after_if_else_L12 +debug: Replacing trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 +debug: Deleting Phi assignment: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) +debug: Replaced trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 in current definition for 3 blocks +debug: Sealing block@5: // after_while_L11 +debug: Terminated block@5: // after_while_L11 +debug: Sealing block@0: // L25 +debug: Terminated block@0: // L25 +debug: Sealing block@0: // L44 +debug: Terminated block@0: // L44 +debug: Sealing block@0: // L62 +debug: Terminated block@0: // L62 +debug: Sealing block@0: // L92 +debug: Terminated block@0: // L92 +debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110 +debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L110 +debug: Terminated block@1: // for_header_L110 +debug: Sealing block@2: // for_body_L111 +debug: Looking for 'head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110 +debug: Created Phi assignment: let head_and_tail#1: bytes = undefined while trying to resolve 'head_and_tail' in block@1: // for_header_L110 +debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110 +debug: Created Phi assignment: let new_head#1: bytes = undefined while trying to resolve 'new_head' in block@1: // for_header_L110 +debug: Terminated block@2: // for_body_L111 +debug: Sealing block@3: // for_footer_L110 +debug: Terminated block@3: // for_footer_L110 +debug: Sealing block@1: // for_header_L110 +debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L92 +debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L110 +debug: Added head_and_tail#0 to Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0) in block@0: // L92 +debug: Added head_and_tail#1 to Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) in block@3: // for_footer_L110 +debug: Replacing trivial Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) (head_and_tail#1) with head_and_tail#0 +debug: Deleting Phi assignment: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) +debug: Replaced trivial Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) (head_and_tail#1) with head_and_tail#0 in current definition for 3 blocks +debug: Added new_head#0 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0) in block@0: // L92 +debug: Added new_head#2 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0, new_head#2 <- block@3) in block@3: // for_footer_L110 +debug: Sealing block@4: // after_for_L110 +debug: Created Phi assignment: let length_minus_1#1: uint64 = undefined while trying to resolve 'length_minus_1' in block@1: // for_header_L110 +debug: Added length_minus_1#0 to Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0) in block@0: // L92 +debug: Added length_minus_1#1 to Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) in block@3: // for_footer_L110 +debug: Replacing trivial Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) (length_minus_1#1) with length_minus_1#0 +debug: Deleting Phi assignment: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) +debug: Replaced trivial Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) (length_minus_1#1) with length_minus_1#0 in current definition for 3 blocks +debug: Created Phi assignment: let popped_header_offset#1: uint64 = undefined while trying to resolve 'popped_header_offset' in block@1: // for_header_L110 +debug: Added popped_header_offset#0 to Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0) in block@0: // L92 +debug: Added popped_header_offset#1 to Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) in block@3: // for_footer_L110 +debug: Replacing trivial Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) (popped_header_offset#1) with popped_header_offset#0 +debug: Deleting Phi assignment: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) +debug: Replaced trivial Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) (popped_header_offset#1) with popped_header_offset#0 in current definition for 3 blocks +debug: Created Phi assignment: let popped_offset#1: uint64 = undefined while trying to resolve 'popped_offset' in block@1: // for_header_L110 +debug: Added popped_offset#0 to Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0) in block@0: // L92 +debug: Added popped_offset#1 to Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) in block@3: // for_footer_L110 +debug: Replacing trivial Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) (popped_offset#1) with popped_offset#0 +debug: Deleting Phi assignment: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) +debug: Replaced trivial Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) (popped_offset#1) with popped_offset#0 in current definition for 3 blocks +debug: Created Phi assignment: let popped#1: bytes = undefined while trying to resolve 'popped' in block@1: // for_header_L110 +debug: Added popped#0 to Phi node: let popped#1: bytes = φ(popped#0 <- block@0) in block@0: // L92 +debug: Added popped#1 to Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) in block@3: // for_footer_L110 +debug: Replacing trivial Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) (popped#1) with popped#0 +debug: Deleting Phi assignment: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) +debug: Replaced trivial Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) (popped#1) with popped#0 in current definition for 3 blocks +debug: Terminated block@4: // after_for_L110 +debug: Sealing block@0: // L124 +debug: Terminated block@0: // L124 +debug: Sealing block@1: // if_body_L147 +debug: Terminated block@1: // if_body_L147 +debug: Sealing block@2: // after_if_else_L146 +debug: Created Phi assignment: let array_length#1: uint64 = undefined while trying to resolve 'array_length' in block@2: // after_if_else_L146 +debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0) in block@0: // L124 +debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) in block@1: // if_body_L147 +debug: Replacing trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0 +debug: Deleting Phi assignment: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) +debug: Replaced trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0 in current definition for 1 blocks +debug: Created Phi assignment: let is_packed#1: bool = undefined while trying to resolve 'is_packed' in block@2: // after_if_else_L146 +debug: Added is_packed#0 to Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0) in block@0: // L124 +debug: Added is_packed#0 to Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) in block@1: // if_body_L147 +debug: Replacing trivial Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0 +debug: Deleting Phi assignment: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) +debug: Replaced trivial Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0 in current definition for 1 blocks +debug: Created Phi assignment: let new_items_count#1: uint64 = undefined while trying to resolve 'new_items_count' in block@2: // after_if_else_L146 +debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0) in block@0: // L124 +debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) in block@1: // if_body_L147 +debug: Replacing trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#1) with new_items_count#0 +debug: Deleting Phi assignment: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) +debug: Replaced trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#1) with new_items_count#0 in current definition for 1 blocks +debug: Terminated block@2: // after_if_else_L146 +debug: Looking for 'i' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150 +debug: Created Phi assignment: let i#1: uint64 = undefined while trying to resolve 'i' in block@3: // for_header_L150 +debug: Terminated block@3: // for_header_L150 +debug: Sealing block@4: // for_body_L151 +debug: Looking for 'result' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150 +debug: Created Phi assignment: let result#2: bytes = undefined while trying to resolve 'result' in block@3: // for_header_L150 +debug: Looking for 'write_offset' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150 +debug: Created Phi assignment: let write_offset#1: uint64 = undefined while trying to resolve 'write_offset' in block@3: // for_header_L150 +debug: Looking for 'new_items_bytes' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150 +debug: Created Phi assignment: let new_items_bytes#1: bytes = undefined while trying to resolve 'new_items_bytes' in block@3: // for_header_L150 +debug: Terminated block@4: // for_body_L151 +debug: Sealing block@5: // for_footer_L150 +debug: Terminated block@5: // for_footer_L150 +debug: Sealing block@3: // for_header_L150 +debug: Added i#0 to Phi node: let i#1: uint64 = φ(i#0 <- block@2) in block@2: // after_if_else_L146 +debug: Added i#2 to Phi node: let i#1: uint64 = φ(i#0 <- block@2, i#2 <- block@5) in block@5: // for_footer_L150 +debug: Created Phi assignment: let result#4: bytes = undefined while trying to resolve 'result' in block@2: // after_if_else_L146 +debug: Added result#0 to Phi node: let result#4: bytes = φ(result#0 <- block@0) in block@0: // L124 +debug: Added result#1 to Phi node: let result#4: bytes = φ(result#0 <- block@0, result#1 <- block@1) in block@1: // if_body_L147 +debug: Added result#4 to Phi node: let result#2: bytes = φ(result#4 <- block@2) in block@2: // after_if_else_L146 +debug: Added result#3 to Phi node: let result#2: bytes = φ(result#4 <- block@2, result#3 <- block@5) in block@5: // for_footer_L150 +debug: Added write_offset#0 to Phi node: let write_offset#1: uint64 = φ(write_offset#0 <- block@2) in block@2: // after_if_else_L146 +debug: Added write_offset#2 to Phi node: let write_offset#1: uint64 = φ(write_offset#0 <- block@2, write_offset#2 <- block@5) in block@5: // for_footer_L150 +debug: Created Phi assignment: let new_items_bytes#2: bytes = undefined while trying to resolve 'new_items_bytes' in block@2: // after_if_else_L146 +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0) in block@0: // L124 +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) in block@1: // if_body_L147 +debug: Replacing trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#2) with new_items_bytes#0 +debug: Deleting Phi assignment: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) +debug: Replaced trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#2) with new_items_bytes#0 in current definition for 1 blocks +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2) in block@2: // after_if_else_L146 +debug: Added new_items_bytes#1 to Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) in block@5: // for_footer_L150 +debug: Replacing trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) (new_items_bytes#1) with new_items_bytes#0 +debug: Deleting Phi assignment: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) +debug: Replaced trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) (new_items_bytes#1) with new_items_bytes#0 in current definition for 3 blocks +debug: Sealing block@6: // after_for_L150 +debug: Terminated block@6: // after_for_L150 +debug: Sealing block@0: // L157 +debug: Terminated block@0: // L157 +debug: Sealing block@0: // L189 +debug: Terminated block@0: // L189 +debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199 +debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L199 +debug: Terminated block@1: // for_header_L199 +debug: Sealing block@2: // for_body_L200 +debug: Looking for 'array_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199 +debug: Created Phi assignment: let array_head_and_tail#1: bytes = undefined while trying to resolve 'array_head_and_tail' in block@1: // for_header_L199 +debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199 +debug: Created Phi assignment: let new_head#1: bytes = undefined while trying to resolve 'new_head' in block@1: // for_header_L199 +debug: Looking for 'item_offset_adjustment' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199 +debug: Created Phi assignment: let item_offset_adjustment#1: uint64 = undefined while trying to resolve 'item_offset_adjustment' in block@1: // for_header_L199 +debug: Terminated block@2: // for_body_L200 +debug: Sealing block@3: // for_footer_L199 +debug: Terminated block@3: // for_footer_L199 +debug: Sealing block@1: // for_header_L199 +debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L189 +debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L199 +debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0) in block@0: // L189 +debug: Added array_head_and_tail#1 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) in block@3: // for_footer_L199 +debug: Replacing trivial Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) (array_head_and_tail#1) with array_head_and_tail#0 +debug: Deleting Phi assignment: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) +debug: Replaced trivial Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) (array_head_and_tail#1) with array_head_and_tail#0 in current definition for 3 blocks +debug: Added new_head#0 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0) in block@0: // L189 +debug: Added new_head#2 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0, new_head#2 <- block@3) in block@3: // for_footer_L199 +debug: Added item_offset_adjustment#0 to Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0) in block@0: // L189 +debug: Added item_offset_adjustment#1 to Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) in block@3: // for_footer_L199 +debug: Replacing trivial Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) (item_offset_adjustment#1) with item_offset_adjustment#0 +debug: Deleting Phi assignment: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) +debug: Replaced trivial Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) (item_offset_adjustment#1) with item_offset_adjustment#0 in current definition for 3 blocks +debug: Sealing block@4: // after_for_L199 +debug: Created Phi assignment: let new_items_count#1: uint64 = undefined while trying to resolve 'new_items_count' in block@1: // for_header_L199 +debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0) in block@0: // L189 +debug: Added new_items_count#1 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) in block@3: // for_footer_L199 +debug: Replacing trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) (new_items_count#1) with new_items_count#0 +debug: Deleting Phi assignment: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) +debug: Replaced trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) (new_items_count#1) with new_items_count#0 in current definition for 3 blocks +debug: Terminated block@4: // after_for_L199 +debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204 +debug: Created Phi assignment: let head_offset#4: uint64 = undefined while trying to resolve 'head_offset' in block@5: // for_header_L204 +debug: Terminated block@5: // for_header_L204 +debug: Sealing block@6: // for_body_L205 +debug: Looking for 'new_head_and_tail' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204 +debug: Created Phi assignment: let new_head_and_tail#1: bytes = undefined while trying to resolve 'new_head_and_tail' in block@5: // for_header_L204 +debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204 +debug: Created Phi assignment: let new_head#3: bytes = undefined while trying to resolve 'new_head' in block@5: // for_header_L204 +debug: Looking for 'item_offset_adjustment' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204 +debug: Created Phi assignment: let item_offset_adjustment#3: uint64 = undefined while trying to resolve 'item_offset_adjustment' in block@5: // for_header_L204 +debug: Terminated block@6: // for_body_L205 +debug: Sealing block@7: // for_footer_L204 +debug: Terminated block@7: // for_footer_L204 +debug: Sealing block@5: // for_header_L204 +debug: Added head_offset#3 to Phi node: let head_offset#4: uint64 = φ(head_offset#3 <- block@4) in block@4: // after_for_L199 +debug: Added head_offset#5 to Phi node: let head_offset#4: uint64 = φ(head_offset#3 <- block@4, head_offset#5 <- block@7) in block@7: // for_footer_L204 +debug: Created Phi assignment: let new_head_and_tail#2: bytes = undefined while trying to resolve 'new_head_and_tail' in block@1: // for_header_L199 +debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0) in block@0: // L189 +debug: Added new_head_and_tail#2 to Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) in block@3: // for_footer_L199 +debug: Replacing trivial Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) (new_head_and_tail#2) with new_head_and_tail#0 +debug: Deleting Phi assignment: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) +debug: Replaced trivial Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) (new_head_and_tail#2) with new_head_and_tail#0 in current definition for 3 blocks +debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4) in block@4: // after_for_L199 +debug: Added new_head_and_tail#1 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) in block@7: // for_footer_L204 +debug: Replacing trivial Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) (new_head_and_tail#1) with new_head_and_tail#0 +debug: Deleting Phi assignment: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) +debug: Replaced trivial Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) (new_head_and_tail#1) with new_head_and_tail#0 in current definition for 3 blocks +debug: Added new_head#1 to Phi node: let new_head#3: bytes = φ(new_head#1 <- block@4) in block@4: // after_for_L199 +debug: Added new_head#4 to Phi node: let new_head#3: bytes = φ(new_head#1 <- block@4, new_head#4 <- block@7) in block@7: // for_footer_L204 +debug: Added item_offset_adjustment#2 to Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4) in block@4: // after_for_L199 +debug: Added item_offset_adjustment#3 to Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) in block@7: // for_footer_L204 +debug: Replacing trivial Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) (item_offset_adjustment#3) with item_offset_adjustment#2 +debug: Deleting Phi assignment: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) +debug: Replaced trivial Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) (item_offset_adjustment#3) with item_offset_adjustment#2 in current definition for 3 blocks +debug: Sealing block@8: // after_for_L204 +debug: Created Phi assignment: let array_items_count#1: uint64 = undefined while trying to resolve 'array_items_count' in block@5: // for_header_L204 +debug: Created Phi assignment: let array_items_count#2: uint64 = undefined while trying to resolve 'array_items_count' in block@1: // for_header_L199 +debug: Added array_items_count#0 to Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0) in block@0: // L189 +debug: Added array_items_count#2 to Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) in block@3: // for_footer_L199 +debug: Replacing trivial Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) (array_items_count#2) with array_items_count#0 +debug: Deleting Phi assignment: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) +debug: Replaced trivial Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) (array_items_count#2) with array_items_count#0 in current definition for 3 blocks +debug: Added array_items_count#0 to Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4) in block@4: // after_for_L199 +debug: Added array_items_count#1 to Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) in block@7: // for_footer_L204 +debug: Replacing trivial Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) (array_items_count#1) with array_items_count#0 +debug: Deleting Phi assignment: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) +debug: Replaced trivial Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) (array_items_count#1) with array_items_count#0 in current definition for 3 blocks +debug: Created Phi assignment: let new_items_count#2: uint64 = undefined while trying to resolve 'new_items_count' in block@5: // for_header_L204 +debug: Added new_items_count#0 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4) in block@4: // after_for_L199 +debug: Added new_items_count#2 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) in block@7: // for_footer_L204 +debug: Replacing trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) (new_items_count#2) with new_items_count#0 +debug: Deleting Phi assignment: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) +debug: Replaced trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) (new_items_count#2) with new_items_count#0 in current definition for 3 blocks +debug: Created Phi assignment: let array_head_and_tail#2: bytes = undefined while trying to resolve 'array_head_and_tail' in block@5: // for_header_L204 +debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4) in block@4: // after_for_L199 +debug: Added array_head_and_tail#2 to Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) in block@7: // for_footer_L204 +debug: Replacing trivial Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) (array_head_and_tail#2) with array_head_and_tail#0 +debug: Deleting Phi assignment: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) +debug: Replaced trivial Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) (array_head_and_tail#2) with array_head_and_tail#0 in current definition for 3 blocks +debug: Terminated block@8: // after_for_L204 +debug: Sealing block@0: // L217 +debug: Terminated block@0: // L217 +debug: Sealing block@0: // L240 +debug: Terminated block@0: // L240 +debug: Sealing block@0: // L252 +debug: Terminated block@0: // L252 +debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269 +debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L269 +debug: Terminated block@1: // for_header_L269 +debug: Sealing block@2: // for_body_L270 +debug: Looking for 'new_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269 +debug: Created Phi assignment: let new_head_and_tail#1: bytes = undefined while trying to resolve 'new_head_and_tail' in block@1: // for_header_L269 +debug: Looking for 'new_item_length' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269 +debug: Created Phi assignment: let new_item_length#1: uint64 = undefined while trying to resolve 'new_item_length' in block@1: // for_header_L269 +debug: Looking for 'original_item_length' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269 +debug: Created Phi assignment: let original_item_length#1: uint64 = undefined while trying to resolve 'original_item_length' in block@1: // for_header_L269 +debug: Terminated block@2: // for_body_L270 +debug: Sealing block@3: // for_footer_L269 +debug: Terminated block@3: // for_footer_L269 +debug: Sealing block@1: // for_header_L269 +debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L252 +debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L269 +debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@0) in block@0: // L252 +debug: Added new_head_and_tail#2 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) in block@3: // for_footer_L269 +debug: Added new_item_length#0 to Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0) in block@0: // L252 +debug: Added new_item_length#1 to Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) in block@3: // for_footer_L269 +debug: Replacing trivial Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) (new_item_length#1) with new_item_length#0 +debug: Deleting Phi assignment: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) +debug: Replaced trivial Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) (new_item_length#1) with new_item_length#0 in current definition for 3 blocks +debug: Added original_item_length#0 to Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0) in block@0: // L252 +debug: Added original_item_length#1 to Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) in block@3: // for_footer_L269 +debug: Replacing trivial Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) (original_item_length#1) with original_item_length#0 +debug: Deleting Phi assignment: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) +debug: Replaced trivial Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) (original_item_length#1) with original_item_length#0 in current definition for 3 blocks +debug: Sealing block@4: // after_for_L269 +debug: Terminated block@4: // after_for_L269 +debug: Sealing block@0: // L278 +debug: Terminated block@0: // L278 +debug: Sealing block@0: // L306 +debug: Terminated block@0: // L306 +debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327 +debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L327 +debug: Terminated block@1: // for_header_L327 +debug: Sealing block@2: // for_body_L328 +debug: Looking for 'tail_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327 +debug: Created Phi assignment: let tail_offset#1: uint64 = undefined while trying to resolve 'tail_offset' in block@1: // for_header_L327 +debug: Looking for 'array_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327 +debug: Created Phi assignment: let array_head_and_tail#1: bytes = undefined while trying to resolve 'array_head_and_tail' in block@1: // for_header_L327 +debug: Terminated block@2: // for_body_L328 +debug: Sealing block@3: // for_footer_L327 +debug: Terminated block@3: // for_footer_L327 +debug: Sealing block@1: // for_header_L327 +debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L306 +debug: Added head_offset#3 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#3 <- block@3) in block@3: // for_footer_L327 +debug: Added tail_offset#0 to Phi node: let tail_offset#1: uint64 = φ(tail_offset#0 <- block@0) in block@0: // L306 +debug: Added tail_offset#2 to Phi node: let tail_offset#1: uint64 = φ(tail_offset#0 <- block@0, tail_offset#2 <- block@3) in block@3: // for_footer_L327 +debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0) in block@0: // L306 +debug: Added array_head_and_tail#2 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#2 <- block@3) in block@3: // for_footer_L327 +debug: Sealing block@4: // after_for_L327 +debug: Terminated block@4: // after_for_L327 +debug: Sealing block@0: // L41 +debug: Terminated block@0: // L41 +debug: Sealing block@1: // abi_routing_L41 +debug: Terminated block@1: // abi_routing_L41 +debug: Sealing block@2: // create_route_L67 +debug: Terminated block@2: // create_route_L67 +debug: Sealing block@3: // struct_arg_route_L75 +debug: Terminated block@3: // struct_arg_route_L75 +debug: Sealing block@4: // struct_return_route_L80 +debug: Terminated block@4: // struct_return_route_L80 +debug: Sealing block@5: // emits_error_route_L85 +debug: Terminated block@5: // emits_error_route_L85 +debug: Sealing block@6: // emitter_route_L89 +debug: Terminated block@6: // emitter_route_L89 +debug: Sealing block@7: // conditional_emit_route_L99 +debug: Terminated block@7: // conditional_emit_route_L99 +debug: Sealing block@8: // template_value_route_L108 +debug: Terminated block@8: // template_value_route_L108 +debug: Sealing block@9: // switch_case_default_L41 +debug: Terminated block@9: // switch_case_default_L41 +debug: Sealing block@10: // switch_case_next_L41 +debug: Terminated block@10: // switch_case_next_L41 +debug: Sealing block@11: // bare_routing_L41 +debug: Terminated block@11: // bare_routing_L41 +debug: Sealing block@12: // bare_create_L63 +debug: Terminated block@12: // bare_create_L63 +debug: Sealing block@13: // transient_L71 +debug: Terminated block@13: // transient_L71 +debug: Sealing block@14: // switch_case_default_L41 +debug: Terminated block@14: // switch_case_default_L41 +debug: Sealing block@15: // switch_case_next_L41 +debug: Terminated block@15: // switch_case_next_L41 +debug: Sealing block@16: // after_if_else_L41 +debug: Terminated block@16: // after_if_else_L41 +debug: Sealing block@0: // L43 +debug: Terminated block@0: // L43 +debug: Sealing block@0: // L67 +debug: Terminated block@0: // L67 +debug: Sealing block@0: // L75 +debug: Terminated block@0: // L75 +debug: Sealing block@0: // L80 +debug: Terminated block@0: // L80 +debug: Sealing block@0: // L118 +debug: Terminated block@0: // L118 +debug: Sealing block@0: // L85 +debug: Terminated block@0: // L85 +debug: Sealing block@0: // L89 +debug: Terminated block@0: // L89 +debug: Sealing block@0: // L99 +debug: Terminated block@0: // L99 +debug: Sealing block@1: // if_body_L102 +debug: Terminated block@1: // if_body_L102 +debug: Sealing block@2: // after_if_else_L101 +debug: Terminated block@2: // after_if_else_L101 +debug: Sealing block@0: // L108 +debug: Terminated block@0: // L108 +debug: Sealing block@0: // L63 +debug: Terminated block@0: // L63 +debug: Sealing block@0: // L71 +debug: Terminated block@0: // L71 +debug: Sealing block@0: // L1 +debug: Terminated block@0: // L1 +debug: Sealing block@1: // call __init___L1 +debug: Terminated block@1: // call __init___L1 +debug: Sealing block@2: // after_if_else_L1 +debug: Terminated block@2: // after_if_else_L1 +debug: Sealing block@0: // L1 +debug: Terminated block@0: // L1 +debug: Output IR to arc_56/out/Contract.ssa.ir +info: optimizing test_cases.arc_56.contract.Contract at level 1 +debug: Begin optimization pass 1/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__init__ +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (== tmp%6#0 NoOp) to (! tmp%6#0) +debug: Simplified (== tmp%13#0 NoOp) to (! tmp%13#0) +debug: Simplified (== tmp%20#0 NoOp) to (! tmp%20#0) +debug: Simplified (== tmp%25#0 NoOp) to (! tmp%25#0) +debug: Simplified (== tmp%29#0 NoOp) to (! tmp%29#0) +debug: Simplified (== tmp%35#0 NoOp) to (! tmp%35#0) +debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x000d +debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0 +debug: Simplified (== tmp%41#0 0u) to (! tmp%41#0) +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable tmp%1#0 +debug: Removing unused variable tmp%9#0 +debug: Removing unused variable tmp%16#0 +debug: Removing unused variable tmp%23#0 +debug: Removing unused variable tmp%28#0 +debug: Removing unused variable tmp%32#0 +debug: Removing unused variable tmp%38#0 +debug: Removing unused variable current_tail_offset%0#0 +debug: Removing unused variable encoded_tuple_buffer%0#0 +debug: Removing unused variable as_bytes%1#0 +debug: Removing unused variable current_tail_offset%2#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: inlining the default target of a switch/goto nth +debug: adding block@1: // abi_routing_L41 as a predecessor of block@10: // switch_case_next_L41 due to inlining of block@9: // switch_case_default_L41 +debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@10} +debug: simplifying a switch with constants into goto nth +debug: simplified terminator of block@11: // bare_routing_L41 from switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14} to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@14 +debug: inlining the default target of a switch/goto nth +debug: adding block@1: // abi_routing_L41 as a predecessor of block@16: // after_if_else_L41 due to inlining of block@10: // switch_case_next_L41 +debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@10} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@16} +debug: inlining the default target of a switch/goto nth +debug: adding block@11: // bare_routing_L41 as a predecessor of block@15: // switch_case_next_L41 due to inlining of block@14: // switch_case_default_L41 +debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@14 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@15 +debug: inlining the default target of a switch/goto nth +debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@16} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u} +debug: inlining the default target of a switch/goto nth +debug: adding block@11: // bare_routing_L41 as a predecessor of block@16: // after_if_else_L41 due to inlining of block@15: // switch_case_next_L41 +debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@15 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@16 +debug: inlining the default target of a switch/goto nth +debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@16 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else return 0u +debug: Optimizer: Remove Linear Jump +debug: Replaced predecessor block@10: // switch_case_next_L41 with block@9: // switch_case_default_L41 in block@16: // after_if_else_L41 +debug: Merged linear block@10: // switch_case_next_L41 into block@9: // switch_case_default_L41 +debug: Replaced predecessor block@15: // switch_case_next_L41 with block@14: // switch_case_default_L41 in block@16: // after_if_else_L41 +debug: Merged linear block@15: // switch_case_next_L41 into block@14: // switch_case_default_L41 +debug: Optimizer: Remove Empty Blocks +debug: Removed empty block: block@9: // switch_case_default_L41 +debug: Removed empty block: block@14: // switch_case_default_L41 +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.create +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Found equivalence set: echo%1#0, tmp%1#1 +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Replacing redundant declaration let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_start_offset%0', version=0),) +debug: Replacing redundant declaration let item_end_offset%1#0: uint64 = (len arg#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_end_offset%0', version=0),) +debug: Replacing redundant declaration let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_start_offset%0', version=0),) +debug: Replacing redundant declaration let item_end_offset%2#0: uint64 = (len arg#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_end_offset%0', version=0),) +debug: Found equivalence set: item_start_offset%0#0, item_start_offset%1#0, item_start_offset%2#0 +debug: Replacing {item_start_offset%1#0, item_start_offset%2#0} with item_start_offset%0#0 made 2 modifications +debug: Found equivalence set: item_end_offset%0#0, item_end_offset%1#0, item_end_offset%2#0 +debug: Replacing {item_end_offset%1#0, item_end_offset%2#0} with item_end_offset%0#0 made 2 modifications +debug: Replacing redundant declaration let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=bytes, name='tmp%0', version=0),) +debug: Replacing redundant declaration let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=bytes, name='tmp%0', version=0),) +debug: Found equivalence set: tmp%0#0, tmp%1#0, tmp%3#0 +debug: Replacing {tmp%1#0, tmp%3#0} with tmp%0#0 made 2 modifications +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Found equivalence set: s#0, s%out#0 +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable s%is_original#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (extract3 arg#0 0u 8u) // on error: Index access is out of bounds to ((extract 0 8) arg#0) // on error: Index access is out of bounds +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (len 0x68656c6c6f31) to 6u +debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x0003 +debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0 +debug: Simplified (len "hello") to 5u +debug: Simplified (len 0x68656c6c6f32) to 6u +debug: Simplified ((extract 6 2) as_bytes%4#0) to 0x0003 +debug: Simplified (concat 0x offset_as_uint16%1#0) to offset_as_uint16%1#0 +debug: Simplified ((extract 6 2) as_bytes%5#0) to 0x0004 +debug: Simplified (concat 0x offset_as_uint16%2#0) to offset_as_uint16%2#0 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable current_tail_offset%0#0 +debug: Removing unused variable encoded_tuple_buffer%0#0 +debug: Removing unused variable as_bytes%1#0 +debug: Removing unused variable current_tail_offset%1#0 +debug: Removing unused variable current_tail_offset%2#0 +debug: Removing unused variable encoded_tuple_buffer%4#0 +debug: Removing unused variable as_bytes%4#0 +debug: Removing unused variable current_tail_offset%3#0 +debug: Removing unused variable current_tail_offset%4#0 +debug: Removing unused variable encoded_tuple_buffer%8#0 +debug: Removing unused variable as_bytes%5#0 +debug: Removing unused variable current_tail_offset%6#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x 0x000000000000002a) to 0x000000000000002a +debug: Simplified (len 0x68656c6c6f33) to 6u +debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x0003 +debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0 +debug: Simplified (concat 0x encoded_tuple_buffer%2#0) to encoded_tuple_buffer%2#0 +debug: Simplified ((extract 6 2) as_bytes%2#0) to 0x0012 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable current_tail_offset%0#0 +debug: Removing unused variable encoded_tuple_buffer%0#0 +debug: Removing unused variable current_tail_offset%1#0 +debug: Removing unused variable encoded_tuple_buffer%3#0 +debug: Removing unused variable as_bytes%1#0 +debug: Removing unused variable current_tail_offset%2#0 +debug: Removing unused variable current_tail_offset%3#0 +debug: Removing unused variable encoded_tuple_buffer%7#0 +debug: Removing unused variable as_bytes%2#0 +debug: Removing unused variable current_tail_offset%4#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.bare_create +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.transient +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_1.ir +debug: Begin optimization pass 2/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: replaced goto tmp%0#0 ? block@2 : block@2 with goto block@2 +debug: Removed empty block: block@1: // call __init___L1 +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable offset_as_uint16%0#0 +debug: Removing unused variable encoded_tuple_buffer%1#0 +debug: Removing unused variable data_length%1#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified ((extract 6 2) as_bytes%0#0) to 0x0006 +debug: Simplified (concat 0x0003 0x2a) to 0x00032a +debug: Simplified ((extract 6 2) as_bytes%2#0) to 0x0005 +debug: Simplified ((extract 6 2) as_bytes%3#0) to 0x0006 +debug: Simplified (concat 0x0003 0x2a) to 0x00032a +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable length%0#0 +debug: Removing unused variable as_bytes%0#0 +debug: Removing unused variable offset_as_uint16%0#0 +debug: Removing unused variable encoded_tuple_buffer%1#0 +debug: Removing unused variable data_length%0#0 +debug: Removing unused variable length%1#0 +debug: Removing unused variable as_bytes%2#0 +debug: Removing unused variable length%2#0 +debug: Removing unused variable as_bytes%3#0 +debug: Removing unused variable offset_as_uint16%1#0 +debug: Removing unused variable encoded_tuple_buffer%5#0 +debug: Removing unused variable data_length%1#0 +debug: Removing unused variable offset_as_uint16%2#0 +debug: Removing unused variable encoded_tuple_buffer%9#0 +debug: Removing unused variable data_length%3#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Found equivalence set: encoded_tuple_buffer%2#0, encoded_tuple_buffer%8#0 +debug: Replacing {encoded_tuple_buffer%8#0} with encoded_tuple_buffer%2#0 made 1 modifications +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x000000000000002a 0x000000000000002b) to 0x000000000000002a000000000000002b +debug: Simplified ((extract 6 2) as_bytes%0#0) to 0x0006 +debug: Simplified (concat 0x0003 0x2a) to 0x00032a +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%1#0 +debug: Removing unused variable length%0#0 +debug: Removing unused variable as_bytes%0#0 +debug: Removing unused variable offset_as_uint16%0#0 +debug: Removing unused variable encoded_tuple_buffer%4#0 +debug: Removing unused variable data_length%0#0 +debug: Removing unused variable offset_as_uint16%1#0 +debug: Removing unused variable data_length%1#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_2.ir +debug: Begin optimization pass 3/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable tmp%0#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Merged linear block@2: // after_if_else_L1 into block@0: // L1 +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0006 0x68656c6c6f31) to 0x000668656c6c6f31 +debug: Simplified (concat 0x0005 "hello") to 0x000568656c6c6f +debug: Simplified (concat 0x0006 0x68656c6c6f32) to 0x000668656c6c6f32 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable length_uint16%0#0 +debug: Removing unused variable encoded_tuple_buffer%2#0 +debug: Removing unused variable length_uint16%1#0 +debug: Removing unused variable length_uint16%2#0 +debug: Removing unused variable encoded_tuple_buffer%6#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0006 0x68656c6c6f33) to 0x000668656c6c6f33 +debug: Simplified (concat 0x000000000000002a000000000000002b 0x0012) to 0x000000000000002a000000000000002b0012 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%2#0 +debug: Removing unused variable length_uint16%0#0 +debug: Removing unused variable encoded_tuple_buffer%5#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_3.ir +debug: Begin optimization pass 4/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x00032a 0x000668656c6c6f31) to 0x00032a000668656c6c6f31 +debug: Simplified (concat 0x00032a 0x000668656c6c6f32) to 0x00032a000668656c6c6f32 +debug: Simplified (len 0x000568656c6c6f) to 7u +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_value%0#0 +debug: Removing unused variable encoded_value%1#0 +debug: Removing unused variable encoded_value%2#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x00032a 0x000668656c6c6f33) to 0x00032a000668656c6c6f33 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_value%0#0 +debug: Removing unused variable encoded_tuple_buffer%9#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_4.ir +debug: Begin optimization pass 5/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (+ 4u 7u) to 11u +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%3#0 +debug: Removing unused variable encoded_tuple_buffer%7#0 +debug: Removing unused variable data_length%2#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x000000000000002a000000000000002b0012 0x00032a000668656c6c6f33) to 0x000000000000002a000000000000002b001200032a000668656c6c6f33 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%6#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_5.ir +debug: Begin optimization pass 6/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified ((extract 6 2) as_bytes%6#0) to 0x000b +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable current_tail_offset%5#0 +debug: Removing unused variable as_bytes%6#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%10#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_6.ir +debug: Begin optimization pass 7/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0004 0x000b) to 0x0004000b +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable offset_as_uint16%3#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_7.ir +debug: Begin optimization pass 8/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0004000b 0x000568656c6c6f) to 0x0004000b000568656c6c6f +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%10#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_8.ir +debug: Begin optimization pass 9/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0004000b000568656c6c6f 0x00032a000668656c6c6f32) to 0x0004000b000568656c6c6f00032a000668656c6c6f32 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%11#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_9.ir +debug: Begin optimization pass 10/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%12#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Output IR to arc_56/out/Contract.ssa.opt_pass_10.ir +debug: Begin optimization pass 11/100 +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.echo +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizer: Remove Calls To No Op Subroutines +debug: No optimizations performed in pass 11, ending loop +debug: Removing Phis from test_cases.arc_56.contract.Contract.approval_program +debug: Removing Phis from test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Removing Phis from test_cases.arc_56.contract.Contract.struct_arg +debug: Removing Phis from test_cases.arc_56.contract.Contract.struct_return +debug: Removing Phis from test_cases.arc_56.contract.echo +debug: Removing Phis from test_cases.arc_56.contract.Contract.errors +debug: Removing Phis from test_cases.arc_56.contract.Contract.emitter +debug: Removing Phis from test_cases.arc_56.contract.Contract.conditional_emit +debug: Removing Phis from test_cases.arc_56.contract.Contract.template_value +debug: Removing Phis from algopy.arc4.ARC4Contract.clear_state_program +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.approval_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.__puya_arc4_router__ using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.struct_arg using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.struct_return using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.echo using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.errors using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.emitter using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.conditional_emit using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc_56.contract.Contract.template_value using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in algopy.arc4.ARC4Contract.clear_state_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.approval_program +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.struct_arg +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.struct_return +debug: Sequentializing parallel copies in test_cases.arc_56.contract.echo +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.errors +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.emitter +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.conditional_emit +debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.template_value +debug: Sequentializing parallel copies in algopy.arc4.ARC4Contract.clear_state_program +debug: Performing post-SSA optimizations +debug: Output IR to arc_56/out/Contract.destructured.ir +debug: Inserted main_block@0.ops[1]: 'l-store-copy tmp%1#0 0' +debug: Replaced main_block@0.ops[3]: 'v-load tmp%1#0' with 'l-load tmp%1#0' +debug: Inserted __puya_arc4_router___block@0.ops[1]: 'l-store-copy tmp%0#0 0' +debug: Replaced __puya_arc4_router___block@0.ops[3]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted __puya_arc4_router___abi_routing@1.ops[1]: 'l-store-copy tmp%2#0 0' +debug: Replaced __puya_arc4_router___abi_routing@1.ops[10]: 'v-load tmp%2#0' with 'l-load tmp%2#0' +debug: Inserted __puya_arc4_router___create_route@2.ops[5]: 'l-store-copy tmp%4#0 0' +debug: Replaced __puya_arc4_router___create_route@2.ops[7]: 'v-load tmp%4#0' with 'l-load tmp%4#0' +debug: Inserted __puya_arc4_router___create_route@2.ops[10]: 'l-store-copy tmp%5#0 0' +debug: Replaced __puya_arc4_router___create_route@2.ops[12]: 'v-load tmp%5#0' with 'l-load tmp%5#0' +debug: Inserted __puya_arc4_router___create_route@2.ops[1]: 'l-store-copy tmp%3#0 0' +debug: Replaced __puya_arc4_router___create_route@2.ops[4]: 'v-load tmp%3#0' with 'l-load tmp%3#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[1]: 'l-store-copy tmp%6#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[3]: 'v-load tmp%6#0' with 'l-load tmp%6#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[5]: 'l-store-copy tmp%7#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[7]: 'v-load tmp%7#0' with 'l-load tmp%7#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[10]: 'l-store-copy tmp%8#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[12]: 'v-load tmp%8#0' with 'l-load tmp%8#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[21]: 'l-store-copy to_encode%0#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[23]: 'v-load to_encode%0#0' with 'l-load to_encode%0#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[29]: 'l-store-copy tmp%12#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[31]: 'v-load tmp%12#0' with 'l-load tmp%12#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[17]: 'l-store-copy tmp%11#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[20]: 'v-load tmp%11#0' with 'l-load tmp%11#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[26]: 'l-store-copy val_as_bytes%0#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[29]: 'v-load val_as_bytes%0#0' with 'l-load val_as_bytes%0#0' +debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[15]: 'l-store-copy tmp%10#0 0' +debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[20]: 'v-load tmp%10#0' with 'l-load tmp%10#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[1]: 'l-store-copy tmp%13#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[3]: 'v-load tmp%13#0' with 'l-load tmp%13#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[5]: 'l-store-copy tmp%14#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[7]: 'v-load tmp%14#0' with 'l-load tmp%14#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[10]: 'l-store-copy tmp%15#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[12]: 'v-load tmp%15#0' with 'l-load tmp%15#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[15]: 'l-store-copy tmp%17#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[17]: 'v-load tmp%17#0' with 'l-load tmp%17#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[23]: 'l-store-copy tmp%19#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[25]: 'v-load tmp%19#0' with 'l-load tmp%19#0' +debug: Inserted __puya_arc4_router___struct_return_route@4.ops[19]: 'l-store-copy tmp%18#0 0' +debug: Replaced __puya_arc4_router___struct_return_route@4.ops[22]: 'v-load tmp%18#0' with 'l-load tmp%18#0' +debug: Inserted __puya_arc4_router___emits_error_route@5.ops[1]: 'l-store-copy tmp%20#0 0' +debug: Replaced __puya_arc4_router___emits_error_route@5.ops[3]: 'v-load tmp%20#0' with 'l-load tmp%20#0' +debug: Inserted __puya_arc4_router___emits_error_route@5.ops[5]: 'l-store-copy tmp%21#0 0' +debug: Replaced __puya_arc4_router___emits_error_route@5.ops[7]: 'v-load tmp%21#0' with 'l-load tmp%21#0' +debug: Inserted __puya_arc4_router___emits_error_route@5.ops[10]: 'l-store-copy tmp%22#0 0' +debug: Replaced __puya_arc4_router___emits_error_route@5.ops[12]: 'v-load tmp%22#0' with 'l-load tmp%22#0' +debug: Inserted __puya_arc4_router___emits_error_route@5.ops[15]: 'l-store-copy tmp%24#0 0' +debug: Replaced __puya_arc4_router___emits_error_route@5.ops[17]: 'v-load tmp%24#0' with 'l-load tmp%24#0' +debug: Inserted __puya_arc4_router___emitter_route@6.ops[1]: 'l-store-copy tmp%25#0 0' +debug: Replaced __puya_arc4_router___emitter_route@6.ops[3]: 'v-load tmp%25#0' with 'l-load tmp%25#0' +debug: Inserted __puya_arc4_router___emitter_route@6.ops[5]: 'l-store-copy tmp%26#0 0' +debug: Replaced __puya_arc4_router___emitter_route@6.ops[7]: 'v-load tmp%26#0' with 'l-load tmp%26#0' +debug: Inserted __puya_arc4_router___emitter_route@6.ops[10]: 'l-store-copy tmp%27#0 0' +debug: Replaced __puya_arc4_router___emitter_route@6.ops[12]: 'v-load tmp%27#0' with 'l-load tmp%27#0' +debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[1]: 'l-store-copy tmp%29#0 0' +debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[3]: 'v-load tmp%29#0' with 'l-load tmp%29#0' +debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[5]: 'l-store-copy tmp%30#0 0' +debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[7]: 'v-load tmp%30#0' with 'l-load tmp%30#0' +debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[10]: 'l-store-copy tmp%31#0 0' +debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[12]: 'v-load tmp%31#0' with 'l-load tmp%31#0' +debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[15]: 'l-store-copy tmp%33#0 0' +debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[17]: 'v-load tmp%33#0' with 'l-load tmp%33#0' +debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[20]: 'l-store-copy tmp%34#0 0' +debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[22]: 'v-load tmp%34#0' with 'l-load tmp%34#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[1]: 'l-store-copy tmp%35#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[3]: 'v-load tmp%35#0' with 'l-load tmp%35#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[5]: 'l-store-copy tmp%36#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[7]: 'v-load tmp%36#0' with 'l-load tmp%36#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[10]: 'l-store-copy tmp%37#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[12]: 'v-load tmp%37#0' with 'l-load tmp%37#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[24]: 'l-store-copy length%0#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[26]: 'v-load length%0#0' with 'l-load length%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[28]: 'l-store-copy as_bytes%0#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[30]: 'v-load as_bytes%0#0' with 'l-load as_bytes%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[32]: 'l-store-copy length_uint16%0#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[34]: 'v-load length_uint16%0#0' with 'l-load length_uint16%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[51]: 'l-store-copy as_bytes%2#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[53]: 'v-load as_bytes%2#0' with 'l-load as_bytes%2#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[59]: 'l-store-copy encoded_tuple_buffer%3#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[61]: 'v-load encoded_tuple_buffer%3#0' with 'l-load encoded_tuple_buffer%3#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[64]: 'l-store-copy encoded_tuple_buffer%4#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[66]: 'v-load encoded_tuple_buffer%4#0' with 'l-load encoded_tuple_buffer%4#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[69]: 'l-store-copy encoded_tuple_buffer%5#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[71]: 'v-load encoded_tuple_buffer%5#0' with 'l-load encoded_tuple_buffer%5#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[78]: 'l-store-copy tmp%39#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[80]: 'v-load tmp%39#0' with 'l-load tmp%39#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[17]: 'l-store-copy elements_to_encode%1#0 1' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[20]: 'v-load elements_to_encode%1#0' with 'l-load elements_to_encode%1#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[41]: 'l-store-copy data_length%0#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[44]: 'v-load data_length%0#0' with 'l-load data_length%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[57]: 'l-store-copy offset_as_uint16%1#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[60]: 'v-load offset_as_uint16%1#0' with 'l-load offset_as_uint16%1#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[77]: 'l-store-copy encoded_tuple_buffer%6#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[80]: 'v-load encoded_tuple_buffer%6#0' with 'l-load encoded_tuple_buffer%6#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[46]: 'l-store-copy current_tail_offset%1#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[52]: 'v-load current_tail_offset%1#0' with 'l-load current_tail_offset%1#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[16]: 'l-store-copy elements_to_encode%2#0 2' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[24]: 'v-load elements_to_encode%2#0' with 'l-load elements_to_encode%2#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[52]: 'l-store-copy encoded_tuple_buffer%2#0 1' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[62]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[25]: 'l-store-copy elements_to_encode%2#0 0' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[38]: 'v-load elements_to_encode%2#0' with 'l-load elements_to_encode%2#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[20]: 'l-store-copy elements_to_encode%0#0 2' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[42]: 'v-load elements_to_encode%0#0' with 'l-load elements_to_encode%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[24]: 'l-store-copy val_as_bytes%1#0 2' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[53]: 'v-load val_as_bytes%1#0' with 'l-load val_as_bytes%1#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[44]: 'l-store-copy elements_to_encode%0#0 1' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[77]: 'v-load elements_to_encode%0#0' with 'l-load elements_to_encode%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[42]: 'l-store-copy encoded_value%0#0 2' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[83]: 'v-load encoded_value%0#0' with 'l-load encoded_value%0#0' +debug: Inserted __puya_arc4_router___template_value_route@8.ops[15]: 'l-store-copy elements_to_encode%3#0 3' +debug: Replaced __puya_arc4_router___template_value_route@8.ops[74]: 'v-load elements_to_encode%3#0' with 'l-load elements_to_encode%3#0' +debug: Inserted __puya_arc4_router___bare_routing@11.ops[1]: 'l-store-copy tmp%40#0 0' +debug: Replaced __puya_arc4_router___bare_routing@11.ops[3]: 'v-load tmp%40#0' with 'l-load tmp%40#0' +debug: Inserted __puya_arc4_router___transient@13.ops[1]: 'l-store-copy tmp%41#0 0' +debug: Replaced __puya_arc4_router___transient@13.ops[3]: 'v-load tmp%41#0' with 'l-load tmp%41#0' +debug: Inserted __puya_arc4_router___transient@13.ops[5]: 'l-store-copy tmp%42#0 0' +debug: Replaced __puya_arc4_router___transient@13.ops[7]: 'v-load tmp%42#0' with 'l-load tmp%42#0' +debug: Inserted struct_arg_block@0.ops[11]: 'l-store-copy tmp%0#0 0' +debug: Replaced struct_arg_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted struct_arg_block@0.ops[16]: 'l-store-copy tmp%1#0 0' +debug: Replaced struct_arg_block@0.ops[18]: 'v-load tmp%1#0' with 'l-load tmp%1#0' +debug: Inserted struct_arg_block@0.ops[6]: 'l-store-copy item_end_offset%0#0 0' +debug: Replaced struct_arg_block@0.ops[10]: 'v-load item_end_offset%0#0' with 'l-load item_end_offset%0#0' +debug: Inserted struct_arg_block@0.ops[3]: 'l-store-copy item_start_offset%0#0 0' +debug: Replaced struct_arg_block@0.ops[10]: 'v-load item_start_offset%0#0' with 'l-load item_start_offset%0#0' +debug: Inserted struct_return_block@0.ops[11]: 'l-store-copy tmp%0#0 0' +debug: Replaced struct_return_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted struct_return_block@0.ops[20]: 'l-store-copy tmp%2#0 0' +debug: Replaced struct_return_block@0.ops[22]: 'v-load tmp%2#0' with 'l-load tmp%2#0' +debug: Inserted struct_return_block@0.ops[16]: 'l-store-copy echo%0#0 0' +debug: Replaced struct_return_block@0.ops[19]: 'v-load echo%0#0' with 'l-load echo%0#0' +debug: Inserted struct_return_block@0.ops[6]: 'l-store-copy item_end_offset%0#0 0' +debug: Replaced struct_return_block@0.ops[10]: 'v-load item_end_offset%0#0' with 'l-load item_end_offset%0#0' +debug: Inserted struct_return_block@0.ops[15]: 'l-store-copy tmp%0#0 0' +debug: Replaced struct_return_block@0.ops[20]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted struct_return_block@0.ops[3]: 'l-store-copy item_start_offset%0#0 0' +debug: Replaced struct_return_block@0.ops[10]: 'v-load item_start_offset%0#0' with 'l-load item_start_offset%0#0' +debug: Inserted struct_return_block@0.ops[22]: 'l-store-copy tmp%0#0 1' +debug: Replaced struct_return_block@0.ops[29]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted errors_block@0.ops[2]: 'l-store-copy tmp%0#0 0' +debug: Replaced errors_block@0.ops[4]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted errors_block@0.ops[7]: 'l-store-copy tmp%1#0 0' +debug: Replaced errors_block@0.ops[9]: 'v-load tmp%1#0' with 'l-load tmp%1#0' +debug: Inserted emitter_block@0.ops[3]: 'l-store-copy event%0#0 0' +debug: Replaced emitter_block@0.ops[5]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Inserted emitter_block@0.ops[10]: 'l-store-copy event%1#0 0' +debug: Replaced emitter_block@0.ops[12]: 'v-load event%1#0' with 'l-load event%1#0' +debug: Inserted conditional_emit_if_body@1.ops[3]: 'l-store-copy event%0#0 0' +debug: Replaced conditional_emit_if_body@1.ops[5]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Found 3 edge set/s for test_cases.arc_56.contract.Contract.__puya_arc4_router__ +debug: Found 1 edge set/s for test_cases.arc_56.contract.Contract.conditional_emit +info: Writing arc_56/out/Contract.arc32.json +info: Writing arc_56/out/Contract.arc56.json +info: Writing arc_56/out/Contract.approval.teal +info: Writing arc_56/out/Contract.clear.teal +info: Writing arc_56/out/Contract.approval.bin +info: Writing arc_56/out/Contract.clear.bin +info: Writing arc_56/out/Contract.approval.puya.map +info: Writing arc_56/out/Contract.clear.puya.map +info: writing arc_56/out/client_Contract.py \ No newline at end of file diff --git a/test_cases/arc_56/template.vars b/test_cases/arc_56/template.vars new file mode 100644 index 0000000000..6909f62702 --- /dev/null +++ b/test_cases/arc_56/template.vars @@ -0,0 +1,4 @@ +STRUCT=0x0003FF00024869 +AVM_UINT64=123 +AVM_STRING="Hello" +ARC4_UINT8=0xFF diff --git a/test_cases/asset/puya.log b/test_cases/asset/puya.log index 2856abd0c2..2c1f3f8f5d 100644 --- a/test_cases/asset/puya.log +++ b/test_cases/asset/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['asset'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['asset'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing asset/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/augmented_assignment/puya.log b/test_cases/augmented_assignment/puya.log index 0b18e4e363..a3a46bc32f 100644 --- a/test_cases/augmented_assignment/puya.log +++ b/test_cases/augmented_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['augmented_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['augmented_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing augmented_assignment/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/avm_11/out/Contract.approval.teal b/test_cases/avm_11/out/Contract.approval.teal index e05c11f54b..adca28a0f1 100644 --- a/test_cases/avm_11/out/Contract.approval.teal +++ b/test_cases/avm_11/out/Contract.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___test_new_ops_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_new_ops intc_1 // 1 retsub @@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/avm_11/out/Contract.arc32.json b/test_cases/avm_11/out/Contract.arc32.json index 39c621d99b..3263ec3ac5 100644 --- a/test_cases/avm_11/out/Contract.arc32.json +++ b/test_cases/avm_11/out/Contract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9uZXdfb3BzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25ld19vcHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/avm_11/out/Contract.arc56.json b/test_cases/avm_11/out/Contract.arc56.json new file mode 100644 index 0000000000..48144a2c95 --- /dev/null +++ b/test_cases/avm_11/out/Contract.arc56.json @@ -0,0 +1,180 @@ +{ + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "test_new_ops", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 93 + ], + "errorMessage": "bonus" + }, + { + "pc": [ + 98 + ], + "errorMessage": "branch" + }, + { + "pc": [ + 52 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 105 + ], + "errorMessage": "fee sink" + }, + { + "pc": [ + 89 + ], + "errorMessage": "fees collected" + }, + { + "pc": [ + 121 + ], + "errorMessage": "payouts_enabled" + }, + { + "pc": [ + 124 + ], + "errorMessage": "payouts_go_online_fee" + }, + { + "pc": [ + 133 + ], + "errorMessage": "payouts_max_balance" + }, + { + "pc": [ + 130 + ], + "errorMessage": "payouts_min_balance" + }, + { + "pc": [ + 127 + ], + "errorMessage": "payouts_percent" + }, + { + "pc": [ + 85 + ], + "errorMessage": "proposer" + }, + { + "pc": [ + 118 + ], + "errorMessage": "proposer payout" + }, + { + "pc": [ + 110 + ], + "errorMessage": "protocol" + }, + { + "pc": [ + 114 + ], + "errorMessage": "txn counter" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25ld19vcHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CyACAAGIAAFDigABMRtBABuABMK43Yo2GgCOAQACIokxGRREMRhEiAAPI4kxGUAABjEYFEQjiSKJigAAgYEOr4AASU8ChRREgACGFUR1RCLRAjIDEkQi0QNEItEERCLRBRVEItEGMgMTRCLRBxVEItEIRCLRCUQyEkQyE0QyFEQyFUQyFkQidABGAiJ0AUYCiQ==", + "clear": "C4EBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/avm_11/out/Contract.destructured.ir b/test_cases/avm_11/out/Contract.destructured.ir index 0d60a684c3..7d0e031f4e 100644 --- a/test_cases/avm_11/out/Contract.destructured.ir +++ b/test_cases/avm_11/out/Contract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@5: // bare_routing_L9 @@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/test_cases/avm_11/out/Contract.ssa.ir b/test_cases/avm_11/out/Contract.ssa.ir index 0112af3013..2e5b011f4e 100644 --- a/test_cases/avm_11/out/Contract.ssa.ir +++ b/test_cases/avm_11/out/Contract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@3: // switch_case_default_L9 @@ -32,7 +32,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.avm_11.contract.Contract.__algopy_default_create() return 1u block@7: // switch_case_default_L9 diff --git a/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir b/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir index 51f314905e..c64108251d 100644 --- a/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir +++ b/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@5: // bare_routing_L9 @@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir b/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir index 0d60a684c3..7d0e031f4e 100644 --- a/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir +++ b/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@5: // bare_routing_L9 @@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/test_cases/avm_11/out_O2/Contract.approval.teal b/test_cases/avm_11/out_O2/Contract.approval.teal index 7e0118f54d..28565a674d 100644 --- a/test_cases/avm_11/out_O2/Contract.approval.teal +++ b/test_cases/avm_11/out_O2/Contract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___test_new_ops_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_new_ops intc_1 // 1 retsub @@ -32,7 +32,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/avm_11/out_O2/Contract.destructured.ir b/test_cases/avm_11/out_O2/Contract.destructured.ir index 0d60a684c3..7d0e031f4e 100644 --- a/test_cases/avm_11/out_O2/Contract.destructured.ir +++ b/test_cases/avm_11/out_O2/Contract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@5: // bare_routing_L9 @@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L9 return 0u diff --git a/test_cases/avm_11/out_unoptimized/Contract.approval.teal b/test_cases/avm_11/out_unoptimized/Contract.approval.teal index 657ee040f3..7ead1d7aaa 100644 --- a/test_cases/avm_11/out_unoptimized/Contract.approval.teal +++ b/test_cases/avm_11/out_unoptimized/Contract.approval.teal @@ -27,11 +27,11 @@ __puya_arc4_router___test_new_ops_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_new_ops intc_1 // 1 retsub @@ -52,7 +52,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/avm_11/out_unoptimized/Contract.destructured.ir b/test_cases/avm_11/out_unoptimized/Contract.destructured.ir index 29ff61235b..25455ff178 100644 --- a/test_cases/avm_11/out_unoptimized/Contract.destructured.ir +++ b/test_cases/avm_11/out_unoptimized/Contract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.avm_11.contract.Contract: block@2: // test_new_ops_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.avm_11.contract.Contract.test_new_ops() return 1u block@3: // switch_case_default_L9 @@ -32,7 +32,7 @@ contract test_cases.avm_11.contract.Contract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.avm_11.contract.Contract.__algopy_default_create() return 1u block@7: // switch_case_default_L9 diff --git a/test_cases/avm_11/puya.log b/test_cases/avm_11/puya.log index d4eac4176c..e8f60e7a51 100644 --- a/test_cases/avm_11/puya.log +++ b/test_cases/avm_11/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_11'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_11'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing avm_11/out/module.awst debug: Sealing block@0: // L12 @@ -755,6 +755,7 @@ info: Writing avm_11/out/avm_11_sig.teal info: Writing avm_11/out/avm_11_sig.bin info: Writing avm_11/out/avm_11_sig.puya.map info: Writing avm_11/out/Contract.arc32.json +info: Writing avm_11/out/Contract.arc56.json info: Writing avm_11/out/Contract.approval.teal info: Writing avm_11/out/Contract.clear.teal info: Writing avm_11/out/Contract.approval.bin diff --git a/test_cases/avm_types_in_abi/out/TestContract.approval.mir b/test_cases/avm_types_in_abi/out/TestContract.approval.mir index f94798cc64..f00aea2a3d 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.approval.mir +++ b/test_cases/avm_types_in_abi/out/TestContract.approval.mir @@ -34,10 +34,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(allow_actions=["NoOp"], create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -159,9 +159,9 @@ __puya_arc4_router___tuple_of_arc4_route@3: // @arc4.abimethod txn OnCompletion tmp%18#0 ! tmp%19#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%20#0 - assert // is not creating + assert // can only call when not creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%22#0 diff --git a/test_cases/avm_types_in_abi/out/TestContract.approval.teal b/test_cases/avm_types_in_abi/out/TestContract.approval.teal index 496032664c..be3274343a 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.approval.teal +++ b/test_cases/avm_types_in_abi/out/TestContract.approval.teal @@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(allow_actions=["NoOp"], create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -136,9 +136,9 @@ __puya_arc4_router___tuple_of_arc4_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/test_cases/avm_types_in_abi/out/TestContract.arc32.json b/test_cases/avm_types_in_abi/out/TestContract.arc32.json index 4c1402368d..a47bf57821 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.arc32.json +++ b/test_cases/avm_types_in_abi/out/TestContract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZGlnIDEKICAgIGV4dHJhY3QgMSA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBleHRyYWN0IDExIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgNQogICAgYnwKICAgIGRpZyA0CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA0ZAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDc3IC8vIDc3CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAxIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHR1cGxlX29mX2FyYzQKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXZtX3R5cGVzX2luX2FiaS5jb250cmFjdC5UZXN0Q29udHJhY3QuY3JlYXRlKGJvb2xfcGFyYW06IHVpbnQ2NCwgdWludDY0X3BhcmFtOiB1aW50NjQsIGJ5dGVzX3BhcmFtOiBieXRlcywgYmlndWludF9wYXJhbTogYnl0ZXMsIHN0cmluZ19wYXJhbTogYnl0ZXMsIHR1cGxlX3BhcmFtLjA6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMTogdWludDY0LCB0dXBsZV9wYXJhbS4yOiBieXRlcywgdHVwbGVfcGFyYW0uMzogYnl0ZXMsIHR1cGxlX3BhcmFtLjQ6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKY3JlYXRlOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1LTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBib29sX3BhcmFtOiBib29sLAogICAgLy8gICAgIHVpbnQ2NF9wYXJhbTogVUludDY0LAogICAgLy8gICAgIGJ5dGVzX3BhcmFtOiBCeXRlcywKICAgIC8vICAgICBiaWd1aW50X3BhcmFtOiBCaWdVSW50LAogICAgLy8gICAgIHN0cmluZ19wYXJhbTogU3RyaW5nLAogICAgLy8gICAgIHR1cGxlX3BhcmFtOiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddLAogICAgLy8gKSAtPiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddOgogICAgcHJvdG8gMTAgNQogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSB0dXBsZV9wYXJhbQogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC01CiAgICA9PQogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTQKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC03CiAgICBmcmFtZV9kaWcgLTIKICAgIGI9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTgKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC02CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LnR1cGxlX29mX2FyYzQoYXJncy4wOiBieXRlcywgYXJncy4xOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgp0dXBsZV9vZl9hcmM0OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOS0yMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdHVwbGVfb2ZfYXJjNCgKICAgIC8vICAgICBzZWxmLCBhcmdzOiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdCiAgICAvLyApIC0+IHR1cGxlW2FyYzQuVUludDgsIGFyYzQuQWRkcmVzc106CiAgICBwcm90byAyIDIKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBhcmdzWzBdLmJ5dGVzLmxlbmd0aCA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhcmdzWzFdLmJ5dGVzLmxlbmd0aCA9PSAzMgogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjUKICAgIC8vIHJldHVybiBhcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgcHVzaGludCA3NSAvLyA3NQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIGV4dHJhY3QgMTEgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA1CiAgICBifAogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDRkCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgNzcgLy8gNzcKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190dXBsZV9vZl9hcmM0X3JvdXRlQDM6CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0dXBsZV9vZl9hcmM0CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNyZWF0ZShib29sX3BhcmFtOiB1aW50NjQsIHVpbnQ2NF9wYXJhbTogdWludDY0LCBieXRlc19wYXJhbTogYnl0ZXMsIGJpZ3VpbnRfcGFyYW06IGJ5dGVzLCBzdHJpbmdfcGFyYW06IGJ5dGVzLCB0dXBsZV9wYXJhbS4wOiB1aW50NjQsIHR1cGxlX3BhcmFtLjE6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMjogYnl0ZXMsIHR1cGxlX3BhcmFtLjM6IGJ5dGVzLCB0dXBsZV9wYXJhbS40OiBieXRlcykgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmNyZWF0ZToKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NS0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYm9vbF9wYXJhbTogYm9vbCwKICAgIC8vICAgICB1aW50NjRfcGFyYW06IFVJbnQ2NCwKICAgIC8vICAgICBieXRlc19wYXJhbTogQnl0ZXMsCiAgICAvLyAgICAgYmlndWludF9wYXJhbTogQmlnVUludCwKICAgIC8vICAgICBzdHJpbmdfcGFyYW06IFN0cmluZywKICAgIC8vICAgICB0dXBsZV9wYXJhbTogdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXSwKICAgIC8vICkgLT4gdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXToKICAgIHByb3RvIDEwIDUKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gdHVwbGVfcGFyYW0KICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtOAogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgICYmCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTcKICAgIGZyYW1lX2RpZyAtNgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC50dXBsZV9vZl9hcmM0KGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdHVwbGVfb2ZfYXJjNDoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTktMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHR1cGxlX29mX2FyYzQoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbYXJjNC5VSW50OCwgYXJjNC5BZGRyZXNzXQogICAgLy8gKSAtPiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdOgogICAgcHJvdG8gMiAyCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYXJnc1swXS5ieXRlcy5sZW5ndGggPT0gMQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXJnc1sxXS5ieXRlcy5sZW5ndGggPT0gMzIKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/avm_types_in_abi/out/TestContract.arc56.json b/test_cases/avm_types_in_abi/out/TestContract.arc56.json new file mode 100644 index 0000000000..b092b842e0 --- /dev/null +++ b/test_cases/avm_types_in_abi/out/TestContract.arc56.json @@ -0,0 +1,153 @@ +{ + "name": "TestContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "bool", + "name": "bool_param" + }, + { + "type": "uint64", + "name": "uint64_param" + }, + { + "type": "byte[]", + "name": "bytes_param" + }, + { + "type": "uint512", + "name": "biguint_param" + }, + { + "type": "string", + "name": "string_param" + }, + { + "type": "(bool,uint64,byte[],uint512,string)", + "name": "tuple_param" + } + ], + "returns": { + "type": "(bool,uint64,byte[],uint512,string)" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "tuple_of_arc4", + "args": [ + { + "type": "(uint8,address)", + "name": "args" + } + ], + "returns": { + "type": "(uint8,address)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 53, + 221 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 57 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 224 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 165 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgcHVzaGludCA3NSAvLyA3NQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIGV4dHJhY3QgMTEgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA1CiAgICBifAogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDRkCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgNzcgLy8gNzcKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190dXBsZV9vZl9hcmM0X3JvdXRlQDM6CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0dXBsZV9vZl9hcmM0CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNyZWF0ZShib29sX3BhcmFtOiB1aW50NjQsIHVpbnQ2NF9wYXJhbTogdWludDY0LCBieXRlc19wYXJhbTogYnl0ZXMsIGJpZ3VpbnRfcGFyYW06IGJ5dGVzLCBzdHJpbmdfcGFyYW06IGJ5dGVzLCB0dXBsZV9wYXJhbS4wOiB1aW50NjQsIHR1cGxlX3BhcmFtLjE6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMjogYnl0ZXMsIHR1cGxlX3BhcmFtLjM6IGJ5dGVzLCB0dXBsZV9wYXJhbS40OiBieXRlcykgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmNyZWF0ZToKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NS0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYm9vbF9wYXJhbTogYm9vbCwKICAgIC8vICAgICB1aW50NjRfcGFyYW06IFVJbnQ2NCwKICAgIC8vICAgICBieXRlc19wYXJhbTogQnl0ZXMsCiAgICAvLyAgICAgYmlndWludF9wYXJhbTogQmlnVUludCwKICAgIC8vICAgICBzdHJpbmdfcGFyYW06IFN0cmluZywKICAgIC8vICAgICB0dXBsZV9wYXJhbTogdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXSwKICAgIC8vICkgLT4gdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXToKICAgIHByb3RvIDEwIDUKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gdHVwbGVfcGFyYW0KICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtOAogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgICYmCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTcKICAgIGZyYW1lX2RpZyAtNgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC50dXBsZV9vZl9hcmM0KGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdHVwbGVfb2ZfYXJjNDoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTktMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHR1cGxlX29mX2FyYzQoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbYXJjNC5VSW50OCwgYXJjNC5BZGRyZXNzXQogICAgLy8gKSAtPiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdOgogICAgcHJvdG8gMiAyCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYXJnc1swXS5ieXRlcy5sZW5ndGggPT0gMQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXJnc1sxXS5ieXRlcy5sZW5ndGggPT0gMzIKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAFAJgIBAAQVH3x1iAABQ4oAATEbQQDbggIE+3FmUgR+pkB4NhoAjgIAAgCqIokxGRREMRgURDYaASJTNhoCFzYaA1cCADYaBDYaBVcCADYaBkkiUygiTwJUIlNLAVcBCBdLAoEJWUsDgUtZSwRPAksCUlcCAEsEVwtASwUVTwZPBE8CUlcCAIgAaigiTwZUTwQWSwQVFlcGAk8FUEsEFSQORCSvTwWrSwQVFlcGAk8FUE8ETwRQgAIATVBLAxWBTQhMTwNQTBZXBgJQTwJQTFApTFCwI4kxGRREMRhENhoBSVcAAUxXASCIADVQKUxQsCOJIomKCgWL9ov7Eov3i/wSEIv4i/0SEIv5i/6oEIv6i/8SEESL9ov3i/iL+Yv6iYoCAov+FSMSRIv/FYEgEkSL/ov/iQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/avm_types_in_abi/out/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out/TestContract.destructured.ir index 6289519aa9..f6d1897305 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.destructured.ir +++ b/test_cases/avm_types_in_abi/out/TestContract.destructured.ir @@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.ir index 3595e70b0e..cae87c5a83 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.ssa.ir +++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -84,10 +84,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (== tmp%18#0 NoOp) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (!= tmp%20#0 0u) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = (extract3 tmp%22#0 0u 1u) // on error: Index access is out of bounds let item1%1#0: bytes = (extract3 tmp%22#0 1u 32u) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir index 6e1652e576..77dd90ca52 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir +++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir @@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -76,9 +76,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir index 6289519aa9..f6d1897305 100644 --- a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir +++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir @@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal b/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal index ed3b263478..e5003bf0fd 100644 --- a/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal +++ b/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal @@ -21,10 +21,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating txna ApplicationArgs 1 intc_0 // 0 getbit @@ -126,9 +126,9 @@ __puya_arc4_router___create_route@2: __puya_arc4_router___tuple_of_arc4_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 1 // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir index 6289519aa9..f6d1897305 100644 --- a/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir +++ b/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir @@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal index 4dd078b437..1b5fa8b09a 100644 --- a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal +++ b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -175,11 +175,11 @@ __puya_arc4_router___tuple_of_arc4_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // avm_types_in_abi/contract.py:4 // class TestContract(arc4.ARC4Contract): txna ApplicationArgs 1 diff --git a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir index 560d2aa01b..bb672be43b 100644 --- a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir +++ b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@2: // create_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bool = (getbit tmp%7#0 0u) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -80,10 +80,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract: block@3: // tuple_of_arc4_route_L19 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (== tmp%18#0 NoOp) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (!= tmp%20#0 0u) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%22#0: bytes = (txna ApplicationArgs 1) let item0%1#0: bytes = (extract3 tmp%22#0 0u 1u) // on error: Index access is out of bounds let item1%1#0: bytes = (extract3 tmp%22#0 1u 32u) // on error: Index access is out of bounds diff --git a/test_cases/avm_types_in_abi/puya.log b/test_cases/avm_types_in_abi/puya.log index d90e36326b..d8b71dbb5c 100644 --- a/test_cases/avm_types_in_abi/puya.log +++ b/test_cases/avm_types_in_abi/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_types_in_abi'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_types_in_abi'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing avm_types_in_abi/out/module.awst debug: Sealing block@0: // L12 @@ -849,6 +849,7 @@ debug: Inserted tuple_of_arc4_block@0.ops[18]: 'l-store-copy tmp%3#0 0' debug: Replaced tuple_of_arc4_block@0.ops[20]: 'v-load tmp%3#0' with 'l-load tmp%3#0' debug: Found 2 edge set/s for test_cases.avm_types_in_abi.contract.TestContract.__puya_arc4_router__ info: Writing avm_types_in_abi/out/TestContract.arc32.json +info: Writing avm_types_in_abi/out/TestContract.arc56.json info: Writing avm_types_in_abi/out/TestContract.approval.teal info: Writing avm_types_in_abi/out/TestContract.clear.teal info: Writing avm_types_in_abi/out/TestContract.approval.bin diff --git a/test_cases/biguint_binary_ops/puya.log b/test_cases/biguint_binary_ops/puya.log index f9568df33d..78b89be454 100644 --- a/test_cases/biguint_binary_ops/puya.log +++ b/test_cases/biguint_binary_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['biguint_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['biguint_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing biguint_binary_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/boolean_binary_ops/puya.log b/test_cases/boolean_binary_ops/puya.log index 22093463ee..85dd023a55 100644 --- a/test_cases/boolean_binary_ops/puya.log +++ b/test_cases/boolean_binary_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['boolean_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['boolean_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv boolean_binary_ops/contract.py:97:12 warning: expression is always True boolean_binary_ops/contract.py:98:12 warning: expression is always True diff --git a/test_cases/bug_load_store_load_store/puya.log b/test_cases/bug_load_store_load_store/puya.log index ccebe83f9b..f6d25dba6c 100644 --- a/test_cases/bug_load_store_load_store/puya.log +++ b/test_cases/bug_load_store_load_store/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bug_load_store_load_store'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bug_load_store_load_store'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing bug_load_store_load_store/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/bytes_ops/puya.log b/test_cases/bytes_ops/puya.log index 6806fc1482..78133fb974 100644 --- a/test_cases/bytes_ops/puya.log +++ b/test_cases/bytes_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bytes_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bytes_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing bytes_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/callsub/puya.log b/test_cases/callsub/puya.log index b1de9342bb..b1e0fc66e4 100644 --- a/test_cases/callsub/puya.log +++ b/test_cases/callsub/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['callsub'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['callsub'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing callsub/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/chained_assignment/puya.log b/test_cases/chained_assignment/puya.log index 7e7032760a..ac1cfc8f03 100644 --- a/test_cases/chained_assignment/puya.log +++ b/test_cases/chained_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['chained_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['chained_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing chained_assignment/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/compile/out/Hello.approval.mir b/test_cases/compile/out/Hello.approval.mir index 7dd0ac573a..f21087581f 100644 --- a/test_cases/compile/out/Hello.approval.mir +++ b/test_cases/compile/out/Hello.approval.mir @@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 tmp%7#0 @@ -79,9 +79,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion tmp%9#0 int DeleteApplication tmp%9#0,DeleteApplication == tmp%10#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%11#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -90,9 +90,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion tmp%13#0 ! tmp%14#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 tmp%17#0 @@ -127,7 +127,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID tmp%21#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/Hello.approval.teal b/test_cases/compile/out/Hello.approval.teal index fac8cbce94..db302223b6 100644 --- a/test_cases/compile/out/Hello.approval.teal +++ b/test_cases/compile/out/Hello.approval.teal @@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 @@ -63,9 +63,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -74,9 +74,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 @@ -110,7 +110,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/Hello.arc32.json b/test_cases/compile/out/Hello.arc32.json index ad12a1ba46..1001ce9425 100644 --- a/test_cases/compile/out/Hello.arc32.json +++ b/test_cases/compile/out/Hello.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uY3JlYXRlKGdyZWV0aW5nOiBieXRlcykgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2LTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZiwgZ3JlZXRpbmc6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU4CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gZ3JlZXRpbmcKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTQKICAgIC8vIGNsYXNzIEhlbGxvKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLmNyZWF0ZShncmVldGluZzogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIGdyZWV0aW5nOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1OAogICAgLy8gc2VsZi5ncmVldGluZyA9IGdyZWV0aW5nCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/compile/out/Hello.arc56.json b/test_cases/compile/out/Hello.arc56.json new file mode 100644 index 0000000000..6b753576ba --- /dev/null +++ b/test_cases/compile/out/Hello.arc56.json @@ -0,0 +1,165 @@ +{ + "name": "Hello", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "string", + "name": "greeting" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 98 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 77, + 107 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 81 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 101, + 110, + 151 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 168 + ], + "errorMessage": "check self.greeting exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTQKICAgIC8vIGNsYXNzIEhlbGxvKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLmNyZWF0ZShncmVldGluZzogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIGdyZWV0aW5nOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1OAogICAgLy8gc2VsZi5ncmVldGluZyA9IGdyZWV0aW5nCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQAmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAF+CAwQg3zpUBCQ3jTwE0KKCADYaAI4DAAIAFQAgI4kxGRREMRgURDYaAVcCAIgAPyKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAqSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBACiL/2eJigEBIyhlRIABIFCL/1CJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/compile/out/Hello.destructured.ir b/test_cases/compile/out/Hello.destructured.ir index 5f55bf1037..9860a08388 100644 --- a/test_cases/compile/out/Hello.destructured.ir +++ b/test_cases/compile/out/Hello.destructured.ir @@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello: block@2: // create_route_L56 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) test_cases.compile.apps.Hello.create(tmp%8#0) @@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello: block@3: // delete_route_L25 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 DeleteApplication) - (assert tmp%10#0) // OnCompletion is DeleteApplication + (assert tmp%10#0) // OnCompletion is not DeleteApplication let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0) @@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello: switch tmp%20#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void: diff --git a/test_cases/compile/out/Hello.ssa.ir b/test_cases/compile/out/Hello.ssa.ir index bad043f9b0..18d057532c 100644 --- a/test_cases/compile/out/Hello.ssa.ir +++ b/test_cases/compile/out/Hello.ssa.ir @@ -27,10 +27,10 @@ contract test_cases.compile.apps.Hello: block@2: // create_route_L56 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) test_cases.compile.apps.Hello.create(tmp%8#0) @@ -38,19 +38,19 @@ contract test_cases.compile.apps.Hello: block@3: // delete_route_L25 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 DeleteApplication) - (assert tmp%10#0) // OnCompletion is DeleteApplication + (assert tmp%10#0) // OnCompletion is not DeleteApplication let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0) @@ -71,7 +71,7 @@ contract test_cases.compile.apps.Hello: block@8: // update_L29 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L54 diff --git a/test_cases/compile/out/Hello.ssa.opt_pass_1.ir b/test_cases/compile/out/Hello.ssa.opt_pass_1.ir index 5f55bf1037..9860a08388 100644 --- a/test_cases/compile/out/Hello.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/Hello.ssa.opt_pass_1.ir @@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello: block@2: // create_route_L56 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) test_cases.compile.apps.Hello.create(tmp%8#0) @@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello: block@3: // delete_route_L25 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 DeleteApplication) - (assert tmp%10#0) // OnCompletion is DeleteApplication + (assert tmp%10#0) // OnCompletion is not DeleteApplication let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0) @@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello: switch tmp%20#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void: diff --git a/test_cases/compile/out/HelloBase.approval.mir b/test_cases/compile/out/HelloBase.approval.mir index e7dc2847d9..c80089c837 100644 --- a/test_cases/compile/out/HelloBase.approval.mir +++ b/test_cases/compile/out/HelloBase.approval.mir @@ -59,9 +59,9 @@ __puya_arc4_router___delete_route@2: txn OnCompletion tmp%3#0 int DeleteApplication tmp%3#0,DeleteApplication == tmp%4#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -70,9 +70,9 @@ __puya_arc4_router___greet_route@3: // @arc4.abimethod() txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:20 // class HelloBase(ARC4Contract): txna ApplicationArgs 1 tmp%11#0 @@ -108,7 +108,7 @@ __puya_arc4_router___update@7: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: @@ -118,7 +118,7 @@ __puya_arc4_router___update@7: __puya_arc4_router_____algopy_default_create@8: txn ApplicationID tmp%17#0 ! tmp%18#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/compile/out/HelloBase.approval.teal b/test_cases/compile/out/HelloBase.approval.teal index 852236dabb..c4b95e259d 100644 --- a/test_cases/compile/out/HelloBase.approval.teal +++ b/test_cases/compile/out/HelloBase.approval.teal @@ -44,9 +44,9 @@ __puya_arc4_router___delete_route@2: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub @@ -55,9 +55,9 @@ __puya_arc4_router___greet_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:20 // class HelloBase(ARC4Contract): txna ApplicationArgs 1 @@ -92,7 +92,7 @@ __puya_arc4_router___update@7: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: @@ -102,7 +102,7 @@ __puya_arc4_router___update@7: __puya_arc4_router_____algopy_default_create@8: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/compile/out/HelloBase.arc32.json b/test_cases/compile/out/HelloBase.arc32.json index b02e06c7ca..d824be7591 100644 --- a/test_cases/compile/out/HelloBase.arc32.json +++ b/test_cases/compile/out/HelloBase.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIwCiAgICAvLyBjbGFzcyBIZWxsb0Jhc2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdyZWV0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgaW50Y18wIC8vIDAKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDgKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDg6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHVzaGludCA0IC8vIDQKICAgIGludGNfMCAvLyAwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA4CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAODoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/compile/out/HelloBase.arc56.json b/test_cases/compile/out/HelloBase.arc56.json new file mode 100644 index 0000000000..8b413d2d56 --- /dev/null +++ b/test_cases/compile/out/HelloBase.arc56.json @@ -0,0 +1,145 @@ +{ + "name": "HelloBase", + "structs": {}, + "methods": [ + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "UpdateApplication" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 72 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 81 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 134 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 75, + 84, + 128 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 143 + ], + "errorMessage": "check self.greeting exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHVzaGludCA0IC8vIDQKICAgIGludGNfMCAvLyAwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA4CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAODoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAAEmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAEWCAgQkN408BNCiggA2GgCOAgACAA0iiTEZgQUSRDEYRCOJMRkURDEYRDYaAVcCAIgAK0kVFlcGAkxQgAQVH3x1TFCwI4mBBCIxGY4CAAIAByKJMRhEI4kxGBREI4mKAQEiKGVEgAEgUIv/UIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloBase.destructured.ir b/test_cases/compile/out/HelloBase.destructured.ir index c6ab9544b2..43b6feff2d 100644 --- a/test_cases/compile/out/HelloBase.destructured.ir +++ b/test_cases/compile/out/HelloBase.destructured.ir @@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase: block@2: // delete_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 DeleteApplication) - (assert tmp%4#0) // OnCompletion is DeleteApplication + (assert tmp%4#0) // OnCompletion is not DeleteApplication let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating return 1u block@3: // greet_route_L33 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: bytes = (txna ApplicationArgs 1) let tmp%12#0: bytes = ((extract 2 0) tmp%11#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0) @@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase: switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u} block@7: // update_L29 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating return 1u block@8: // __algopy_default_create_L1 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // is creating + (assert tmp%18#0) // can only call when creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/HelloBase.ssa.ir b/test_cases/compile/out/HelloBase.ssa.ir index 7659e2ca5a..1fb683af6a 100644 --- a/test_cases/compile/out/HelloBase.ssa.ir +++ b/test_cases/compile/out/HelloBase.ssa.ir @@ -27,19 +27,19 @@ contract test_cases.compile.apps.HelloBase: block@2: // delete_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 DeleteApplication) - (assert tmp%4#0) // OnCompletion is DeleteApplication + (assert tmp%4#0) // OnCompletion is not DeleteApplication let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@3: // greet_route_L33 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%11#0: bytes = (txna ApplicationArgs 1) let tmp%12#0: bytes = ((extract 2 0) tmp%11#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0) @@ -60,13 +60,13 @@ contract test_cases.compile.apps.HelloBase: block@7: // update_L29 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@8: // __algopy_default_create_L1 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (== tmp%17#0 0u) - (assert tmp%18#0) // is creating + (assert tmp%18#0) // can only call when creating test_cases.compile.apps.HelloBase.__algopy_default_create() return 1u block@9: // switch_case_default_L20 diff --git a/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir index c6ab9544b2..43b6feff2d 100644 --- a/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir @@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase: block@2: // delete_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 DeleteApplication) - (assert tmp%4#0) // OnCompletion is DeleteApplication + (assert tmp%4#0) // OnCompletion is not DeleteApplication let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating return 1u block@3: // greet_route_L33 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: bytes = (txna ApplicationArgs 1) let tmp%12#0: bytes = ((extract 2 0) tmp%11#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0) @@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase: switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u} block@7: // update_L29 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating return 1u block@8: // __algopy_default_create_L1 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // is creating + (assert tmp%18#0) // can only call when creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/HelloFactory.approval.mir b/test_cases/compile/out/HelloFactory.approval.mir index 310bccd271..41be50ec3c 100644 --- a/test_cases/compile/out/HelloFactory.approval.mir +++ b/test_cases/compile/out/HelloFactory.approval.mir @@ -45,9 +45,9 @@ __puya_arc4_router___test_logicsig_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub test_logicsig tmp%7#0 byte 0x151f7c75 tmp%7#0,0x151f7c75 l-load tmp%7#0 1 0x151f7c75,tmp%7#0 @@ -61,9 +61,9 @@ __puya_arc4_router___test_compile_contract_route@3: // @arc4.abimethod() txn OnCompletion tmp%9#0 ! tmp%10#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%11#0 - assert // is not creating + assert // can only call when not creating callsub test_compile_contract int 1 1 retsub 1 @@ -73,9 +73,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4: // @arc4.abimethod() txn OnCompletion tmp%13#0 ! tmp%14#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_tmpl int 1 1 retsub 1 @@ -85,9 +85,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5: // @arc4.abimethod() txn OnCompletion tmp%17#0 ! tmp%18#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%19#0 - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_prfx int 1 1 retsub 1 @@ -97,9 +97,9 @@ __puya_arc4_router___test_compile_contract_large_route@6: // @arc4.abimethod() txn OnCompletion tmp%21#0 ! tmp%22#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%23#0 - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_large int 1 1 retsub 1 @@ -109,9 +109,9 @@ __puya_arc4_router___test_arc4_create_route@7: // @arc4.abimethod() txn OnCompletion tmp%25#0 ! tmp%26#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%27#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_create int 1 1 retsub 1 @@ -121,9 +121,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8: // @arc4.abimethod() txn OnCompletion tmp%29#0 ! tmp%30#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%31#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_tmpl int 1 1 retsub 1 @@ -133,9 +133,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9: // @arc4.abimethod() txn OnCompletion tmp%33#0 ! tmp%34#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%35#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_prfx int 1 1 retsub 1 @@ -145,9 +145,9 @@ __puya_arc4_router___test_arc4_create_large_route@10: // @arc4.abimethod() txn OnCompletion tmp%37#0 ! tmp%38#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%39#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_large int 1 1 retsub 1 @@ -157,9 +157,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11: // @arc4.abimethod() txn OnCompletion tmp%41#0 ! tmp%42#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%43#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_modified_compiled int 1 1 retsub 1 @@ -169,9 +169,9 @@ __puya_arc4_router___test_arc4_update_route@12: // @arc4.abimethod() txn OnCompletion tmp%45#0 ! tmp%46#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%47#0 - assert // is not creating + assert // can only call when not creating callsub test_arc4_update int 1 1 retsub 1 @@ -181,9 +181,9 @@ __puya_arc4_router___test_other_constants_route@13: // @arc4.abimethod() txn OnCompletion tmp%49#0 ! tmp%50#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%51#0 - assert // is not creating + assert // can only call when not creating callsub test_other_constants int 1 1 retsub 1 @@ -193,9 +193,9 @@ __puya_arc4_router___test_abi_call_create_params_route@14: // @arc4.abimethod() txn OnCompletion tmp%53#0 ! tmp%54#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%55#0 - assert // is not creating + assert // can only call when not creating callsub test_abi_call_create_params int 1 1 retsub 1 @@ -210,7 +210,7 @@ __puya_arc4_router___bare_routing@17: __puya_arc4_router_____algopy_default_create@18: txn ApplicationID tmp%58#0 ! tmp%59#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/compile/out/HelloFactory.approval.teal b/test_cases/compile/out/HelloFactory.approval.teal index c6b12da303..8fae71bae6 100644 --- a/test_cases/compile/out/HelloFactory.approval.teal +++ b/test_cases/compile/out/HelloFactory.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_logicsig_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_logicsig bytec_0 // 0x151f7c75 swap @@ -41,9 +41,9 @@ __puya_arc4_router___test_compile_contract_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract intc_2 // 1 retsub @@ -53,9 +53,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_tmpl intc_2 // 1 retsub @@ -65,9 +65,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_prfx intc_2 // 1 retsub @@ -77,9 +77,9 @@ __puya_arc4_router___test_compile_contract_large_route@6: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_large intc_2 // 1 retsub @@ -89,9 +89,9 @@ __puya_arc4_router___test_arc4_create_route@7: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create intc_2 // 1 retsub @@ -101,9 +101,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_tmpl intc_2 // 1 retsub @@ -113,9 +113,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_prfx intc_2 // 1 retsub @@ -125,9 +125,9 @@ __puya_arc4_router___test_arc4_create_large_route@10: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_large intc_2 // 1 retsub @@ -137,9 +137,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_modified_compiled intc_2 // 1 retsub @@ -149,9 +149,9 @@ __puya_arc4_router___test_arc4_update_route@12: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_update intc_2 // 1 retsub @@ -161,9 +161,9 @@ __puya_arc4_router___test_other_constants_route@13: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_other_constants intc_2 // 1 retsub @@ -173,9 +173,9 @@ __puya_arc4_router___test_abi_call_create_params_route@14: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_abi_call_create_params intc_2 // 1 retsub @@ -187,7 +187,7 @@ __puya_arc4_router___bare_routing@17: bnz __puya_arc4_router___after_if_else@21 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_2 // 1 retsub diff --git a/test_cases/compile/out/HelloFactory.arc32.json b/test_cases/compile/out/HelloFactory.arc32.json index 93f68ee984..0f13d329c5 100644 --- a/test_cases/compile/out/HelloFactory.arc32.json +++ b/test_cases/compile/out/HelloFactory.arc32.json @@ -67,7 +67,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbG9naWNzaWcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3QKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlX3JvdXRlQDY6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcm91dGVANzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X2NyZWF0ZV90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3ByZnhfcm91dGVAOToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfcHJmeAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDEyOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X3VwZGF0ZQogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9sb2dpY3NpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANjoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcHJmeF9yb3V0ZUA5OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF91cGRhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FiaV9jYWxsX2NyZWF0ZV9wYXJhbXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/compile/out/HelloFactory.arc56.json b/test_cases/compile/out/HelloFactory.arc56.json new file mode 100644 index 0000000000..62f3ad9739 --- /dev/null +++ b/test_cases/compile/out/HelloFactory.arc56.json @@ -0,0 +1,345 @@ +{ + "name": "HelloFactory", + "structs": {}, + "methods": [ + { + "name": "test_logicsig", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_tmpl", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_prfx", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_large", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_tmpl", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_prfx", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_large", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_modified_compiled", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_update", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_other_constants", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_abi_call_create_params", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 5022, + 5115, + 5369, + 5457, + 5549, + 5643, + 5903, + 5995, + 6121, + 6219, + 6279, + 6657, + 6795 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 4753, + 4769, + 4781, + 4793, + 4805, + 4817, + 4829, + 4841, + 4853, + 4865, + 4877, + 4889, + 4901 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 6064, + 6072, + 6080, + 6087 + ], + "errorMessage": "application exists" + }, + { + "pc": [ + 4918 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 4756, + 4772, + 4784, + 4796, + 4808, + 4820, + 4832, + 4844, + 4856, + 4868, + 4880, + 4892, + 4904 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9sb2dpY3NpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANjoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcHJmeF9yb3V0ZUA5OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF91cGRhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FiaV9jYWxsX2NyZWF0ZV9wYXJhbXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAAYBBSYRBBUffHUECoEBQwQkN408BNCiggAHAAV3b3JsZLEBCiACAQAmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAF+CAwQg3zpUBCQ3jTwE0KKCADYaAI4DAAIAFQAgI4kxGRREMRgURDYaAVcCAIgAPyKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAqSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBACiL/2eJigEBIyhlRIABIFCL/1CJBExcYboEIN86VAcABXRoZXJlpAEKIAIBACYCCGdyZWV0aW5nBHRtcGwxGEAAA4gABIgACEOKAAAoKWeJigABMRtBAFaCAwRMXGG6BCQ3jTwE0KKCADYaAI4DAAIADAAXI4kxGRREMRgURCKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAiSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBASMoZUSAASBQi/9QiQcABWhlbGxvgCAKIAIBAIgAAUOKAAExG0EAOIICBPXk/U0EJDeNPDYaAI4CAAIAGCOJMRkURDEYRIgAJBaABBUffHVMULAiiTEZgQUSRDEYRCKJMRlAAAYxGBREIokjiYoAAYgAAhWJigABgIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJBPXk/U0FAANoZXkJaGV5IHRoZXJlCGhpIHRoZXJliAABQ4oAATEbQQEEgg0EYP+ilQQqF5lcBOunQuoEM1pkOAQClHyiBK4e6EAEe5Bz9QSFSmjKBB2gBKEEwZlavQR/TnX1BAGWWTcEf7+MyjYaAI4NAAIAEgAeACoANgBCAE4AWgBmAHIAfgCKAJYiiTEZFEQxGESIAKMoTFCwJIkxGRREMRhEiAC5JIkxGRREMRhEiAEOJIkxGRREMRhEiAFdJIkxGRREMRhEiAJOJIkxGRREMRhEiAKYJIkxGRREMRhEiALuJIkxGRREMRhEiANAJIkxGRREMRhEiAQ4JIkxGRREMRhEiAR7JIkxGRREMRhEiATuJIkxGRREMRhEiAWAJIkxGRREMRhEiAciJIkxGUAABjEYFEQkiSKJigABgCCm83JRpYyoN72lF6n3Bw7kuAo4j+RGFGtr1Ds77V1c5YmKAACxJLI1KbJCJwWyQCcHshonCrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgA0AC2hlbGxvIHdvcmxkEkSJigAAsSSyNSmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgAsACWhleSB3b3JsZBJEiYoAALEksjUpskKAogEKIAIBACYCCGdyZWV0aW5nAmhpMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImyQCcGshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEsSWyGSqyGkyyGCOyECKyAbOACgAIaGkgd29ybGQSRImKAACxgQKyOCmyQicLskAnDLJAI7IQIrIBs7Q9sUmyGCcNshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgAgAAAAAAAAQAKhEiYoAALEksjUpskInBbJAJweyGicKshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAsSWyGUyyGCqyGiOyECKyAbOAC2hlbGxvIHdvcmxkEkSJigAAsSSyNSmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRFcCALElshlMshgqshojshAisgGzgAt0bXBsMiB3b3JsZBJEiYoAALEksjUpskKApQEKIAIBACYCCGdyZWV0aW5nBXByZngyMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImyQCcGshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAsSWyGUyyGCqyGiOyECKyAbOAC3ByZngyIHdvcmxkEkSJigAAsYECsjgpskInC7JAJwyyQCOyECKyAbO0PbFJshgnDbIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXgYAgEkSxJbIZshgqshojshAisgGziYoAALGBA7I2JbI3gQSyNCOyNSmyQicFskAnB7IaJw6yGiOyECKyAbO0PUlyBESBAxJESXICRIEEEkRJcgVEJRJESXIDRCMSRLFJshgrshonCLIaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgAnDxJEsSWyGbIYKrIaI7IQIrIBs4mKAACxgQKyNoECsjeBArI0gQKyNSSyOCmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcQEkSxKbJCJwWyQIEEshlJshgjshAisgGzsUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcQEkSxJbIZshgqshojshAisgGziYoAALGBBLI1KbJCgJUCCiACAAEmCQNudW0IZ3JlZXRpbmcHYWRkcmVzcwZtZXRob2QEFR98dQR0bXBsAUIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAADEYQAADiAAEiAAVQ4oAACknBWcoJwZnKicHZysnCGeJigABMRtBAFuCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFQAgIokxGRREMRgURIgANBYnBExQsCOJMRmBBRJEMRhEI4kxGRREMRhENhoBVwIAiAAWSRUWVwYCTFAnBExQsCOJIomKAAEjiYoBASIoZUSAATCgFSMJIihlRIABMKBLASMITE4CUiIpZUSAASBQi/9QTFAiKmVEUCIrZURQibJAgATZKFp0shojshAisgGztD2xSbIYgARbDCN1shqACAAGSm9obm55shojshAisgGztD5JVwQATFcABCgSRFcCAIICLWhlbGxvIEpvaG5ueTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARA4zUyUBJEsSWyGbIYKrIaI7IQIrIBs4mKAACxJLI1KbJCJwWyQCcHshonDrIaI7IQIrIBs7Q9sUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcPEkSxJbIZshgqshojshAisgGziQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloFactory.destructured.ir b/test_cases/compile/out/HelloFactory.destructured.ir index 6202c8048f..f54ebe9083 100644 --- a/test_cases/compile/out/HelloFactory.destructured.ir +++ b/test_cases/compile/out/HelloFactory.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out/HelloFactory.ssa.ir b/test_cases/compile/out/HelloFactory.ssa.ir index 1c528baa31..96b6940b8d 100644 --- a/test_cases/compile/out/HelloFactory.ssa.ir +++ b/test_cases/compile/out/HelloFactory.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -27,109 +27,109 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (== tmp%25#0 NoOp) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (!= tmp%27#0 0u) - (assert tmp%28#0) // is not creating + (assert tmp%28#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (== tmp%29#0 NoOp) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) let tmp%32#0: bool = (!= tmp%31#0 0u) - (assert tmp%32#0) // is not creating + (assert tmp%32#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (== tmp%41#0 NoOp) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) let tmp%44#0: bool = (!= tmp%43#0 0u) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (== tmp%45#0 NoOp) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) let tmp%48#0: bool = (!= tmp%47#0 0u) - (assert tmp%48#0) // is not creating + (assert tmp%48#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (== tmp%49#0 NoOp) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) let tmp%52#0: bool = (!= tmp%51#0 0u) - (assert tmp%52#0) // is not creating + (assert tmp%52#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (== tmp%53#0 NoOp) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) let tmp%56#0: bool = (!= tmp%55#0 0u) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@15: // switch_case_default_L25 @@ -142,7 +142,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (== tmp%58#0 0u) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating test_cases.compile.factory.HelloFactory.__algopy_default_create() return 1u block@19: // switch_case_default_L25 diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir index fee0bc1400..c5b6838d95 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir index be258d52e5..40339fe9f3 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir index 3857f32607..951d8512d8 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir index 507599d75e..f0194d837b 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out/HelloOtherConstants.approval.mir b/test_cases/compile/out/HelloOtherConstants.approval.mir index 878ab31c90..24ef5b0a14 100644 --- a/test_cases/compile/out/HelloOtherConstants.approval.mir +++ b/test_cases/compile/out/HelloOtherConstants.approval.mir @@ -74,10 +74,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating callsub create to_encode%0#0 itob val_as_bytes%0#0 byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 @@ -93,9 +93,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion tmp%8#0 int DeleteApplication tmp%8#0,DeleteApplication == tmp%9#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -104,9 +104,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion tmp%12#0 ! tmp%13#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%14#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:81 // class HelloOtherConstants(ARC4Contract): txna ApplicationArgs 1 tmp%16#0 diff --git a/test_cases/compile/out/HelloOtherConstants.approval.teal b/test_cases/compile/out/HelloOtherConstants.approval.teal index a6fe576c88..c6ed80195b 100644 --- a/test_cases/compile/out/HelloOtherConstants.approval.teal +++ b/test_cases/compile/out/HelloOtherConstants.approval.teal @@ -58,10 +58,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create itob bytec 4 // 0x151f7c75 @@ -77,9 +77,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub @@ -88,9 +88,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:81 // class HelloOtherConstants(ARC4Contract): txna ApplicationArgs 1 diff --git a/test_cases/compile/out/HelloOtherConstants.arc32.json b/test_cases/compile/out/HelloOtherConstants.arc32.json index 1871eb2710..be860072a6 100644 --- a/test_cases/compile/out/HelloOtherConstants.arc32.json +++ b/test_cases/compile/out/HelloOtherConstants.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/compile/out/HelloOtherConstants.arc56.json b/test_cases/compile/out/HelloOtherConstants.arc56.json new file mode 100644 index 0000000000..3778260e34 --- /dev/null +++ b/test_cases/compile/out/HelloOtherConstants.arc56.json @@ -0,0 +1,208 @@ +{ + "name": "HelloOtherConstants", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + }, + "num": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bnVt" + }, + "address": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "YWRkcmVzcw==" + }, + "method": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0aG9k" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 179 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 158, + 188 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 162 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 182, + 191 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 269 + ], + "errorMessage": "check self.address exists" + }, + { + "pc": [ + 256 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 274 + ], + "errorMessage": "check self.method exists" + }, + { + "pc": [ + 229, + 240 + ], + "errorMessage": "check self.num exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAEmCQNudW0IZ3JlZXRpbmcHYWRkcmVzcwZtZXRob2QEFR98dQR0bXBsAUIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAADEYQAADiAAEiAAVQ4oAACknBWcoJwZnKicHZysnCGeJigABMRtBAFuCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFQAgIokxGRREMRgURIgANBYnBExQsCOJMRmBBRJEMRhEI4kxGRREMRhENhoBVwIAiAAWSRUWVwYCTFAnBExQsCOJIomKAAEjiYoBASIoZUSAATCgFSMJIihlRIABMKBLASMITE4CUiIpZUSAASBQi/9QTFAiKmVEUCIrZURQiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": { + "TMPL_GREETING": { + "type": "AVMString", + "value": "dG1wbA==" + }, + "TMPL_NUM": { + "type": "AVMBytes", + "value": "Qg==" + }, + "TMPL_ACCOUNT": { + "type": "AVMBytes", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + }, + "TMPL_METHOD": { + "type": "AVMBytes", + "value": "AAAAAA==" + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloOtherConstants.destructured.ir b/test_cases/compile/out/HelloOtherConstants.destructured.ir index 4265c3d047..660d3dcfbe 100644 --- a/test_cases/compile/out/HelloOtherConstants.destructured.ir +++ b/test_cases/compile/out/HelloOtherConstants.destructured.ir @@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants: block@2: // create_route_L89 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants: block@3: // delete_route_L93 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@4: // greet_route_L97 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: bytes = (txna ApplicationArgs 1) let tmp%17#0: bytes = ((extract 2 0) tmp%16#0) let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0) diff --git a/test_cases/compile/out/HelloOtherConstants.ssa.ir b/test_cases/compile/out/HelloOtherConstants.ssa.ir index e5c48eeb4e..d9f1652a6b 100644 --- a/test_cases/compile/out/HelloOtherConstants.ssa.ir +++ b/test_cases/compile/out/HelloOtherConstants.ssa.ir @@ -30,10 +30,10 @@ contract test_cases.compile.apps.HelloOtherConstants: block@2: // create_route_L89 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -42,19 +42,19 @@ contract test_cases.compile.apps.HelloOtherConstants: block@3: // delete_route_L93 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.apps.HelloOtherConstants.delete() return 1u block@4: // greet_route_L97 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (== tmp%12#0 NoOp) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (!= tmp%14#0 0u) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%16#0: bytes = (txna ApplicationArgs 1) let tmp%17#0: bytes = ((extract 2 0) tmp%16#0) let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0) diff --git a/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir index 4265c3d047..660d3dcfbe 100644 --- a/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir @@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants: block@2: // create_route_L89 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants: block@3: // delete_route_L93 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@4: // greet_route_L97 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: bytes = (txna ApplicationArgs 1) let tmp%17#0: bytes = ((extract 2 0) tmp%16#0) let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0) diff --git a/test_cases/compile/out/HelloPrfx.approval.mir b/test_cases/compile/out/HelloPrfx.approval.mir index 504caa2ab4..50328d1f2a 100644 --- a/test_cases/compile/out/HelloPrfx.approval.mir +++ b/test_cases/compile/out/HelloPrfx.approval.mir @@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 @@ -72,9 +72,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion tmp%7#0 int DeleteApplication tmp%7#0,DeleteApplication == tmp%8#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -83,9 +83,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:71 // class HelloPrfx(HelloBase): txna ApplicationArgs 1 tmp%15#0 @@ -120,7 +120,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID tmp%19#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/HelloPrfx.approval.teal b/test_cases/compile/out/HelloPrfx.approval.teal index c8d63ffddc..b7e64c5bb4 100644 --- a/test_cases/compile/out/HelloPrfx.approval.teal +++ b/test_cases/compile/out/HelloPrfx.approval.teal @@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub @@ -56,9 +56,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -67,9 +67,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:71 // class HelloPrfx(HelloBase): txna ApplicationArgs 1 @@ -103,7 +103,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/HelloPrfx.arc32.json b/test_cases/compile/out/HelloPrfx.arc32.json index 9c3778c10a..253d107d74 100644 --- a/test_cases/compile/out/HelloPrfx.arc32.json +++ b/test_cases/compile/out/HelloPrfx.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/compile/out/HelloPrfx.arc56.json b/test_cases/compile/out/HelloPrfx.arc56.json new file mode 100644 index 0000000000..219fc7340e --- /dev/null +++ b/test_cases/compile/out/HelloPrfx.arc56.json @@ -0,0 +1,165 @@ +{ + "name": "HelloPrfx", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 93 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 81, + 102 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 85 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 96, + 105, + 146 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 155 + ], + "errorMessage": "check self.greeting exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQAmAghncmVldGluZwRwcmZ4MRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": { + "PRFX_GREETING": { + "type": "AVMString", + "value": "cHJmeA==" + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloPrfx.destructured.ir b/test_cases/compile/out/HelloPrfx.destructured.ir index b5988a21d9..f8cac45570 100644 --- a/test_cases/compile/out/HelloPrfx.destructured.ir +++ b/test_cases/compile/out/HelloPrfx.destructured.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx: block@2: // create_route_L76 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/HelloPrfx.ssa.ir b/test_cases/compile/out/HelloPrfx.ssa.ir index 8b8582d29b..889fb34c0b 100644 --- a/test_cases/compile/out/HelloPrfx.ssa.ir +++ b/test_cases/compile/out/HelloPrfx.ssa.ir @@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloPrfx: block@2: // create_route_L76 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.compile.apps.HelloPrfx.create() return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloPrfx: block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L71 diff --git a/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir index b5988a21d9..f8cac45570 100644 --- a/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx: block@2: // create_route_L76 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/HelloTmpl.approval.mir b/test_cases/compile/out/HelloTmpl.approval.mir index 734d292304..9788ac6ea2 100644 --- a/test_cases/compile/out/HelloTmpl.approval.mir +++ b/test_cases/compile/out/HelloTmpl.approval.mir @@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 @@ -72,9 +72,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion tmp%7#0 int DeleteApplication tmp%7#0,DeleteApplication == tmp%8#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -83,9 +83,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:61 // class HelloTmpl(HelloBase): txna ApplicationArgs 1 tmp%15#0 @@ -120,7 +120,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID tmp%19#0 - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/HelloTmpl.approval.teal b/test_cases/compile/out/HelloTmpl.approval.teal index 08cdb5fb3c..84c0aae583 100644 --- a/test_cases/compile/out/HelloTmpl.approval.teal +++ b/test_cases/compile/out/HelloTmpl.approval.teal @@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub @@ -56,9 +56,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -67,9 +67,9 @@ __puya_arc4_router___greet_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:61 // class HelloTmpl(HelloBase): txna ApplicationArgs 1 @@ -103,7 +103,7 @@ __puya_arc4_router___update@8: // compile/apps.py:29 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out/HelloTmpl.arc32.json b/test_cases/compile/out/HelloTmpl.arc32.json index 20efd2d7f6..f9bf718ac4 100644 --- a/test_cases/compile/out/HelloTmpl.arc32.json +++ b/test_cases/compile/out/HelloTmpl.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/compile/out/HelloTmpl.arc56.json b/test_cases/compile/out/HelloTmpl.arc56.json new file mode 100644 index 0000000000..72a3f5052e --- /dev/null +++ b/test_cases/compile/out/HelloTmpl.arc56.json @@ -0,0 +1,165 @@ +{ + "name": "HelloTmpl", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 93 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 81, + 102 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 85 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 96, + 105, + 146 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 155 + ], + "errorMessage": "check self.greeting exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQAmAghncmVldGluZwR0bXBsMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": { + "TMPL_GREETING": { + "type": "AVMString", + "value": "dG1wbA==" + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloTmpl.destructured.ir b/test_cases/compile/out/HelloTmpl.destructured.ir index 73382d3b3c..76ebecb6b3 100644 --- a/test_cases/compile/out/HelloTmpl.destructured.ir +++ b/test_cases/compile/out/HelloTmpl.destructured.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl: block@2: // create_route_L66 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/HelloTmpl.ssa.ir b/test_cases/compile/out/HelloTmpl.ssa.ir index 882b085ace..103ecf55a5 100644 --- a/test_cases/compile/out/HelloTmpl.ssa.ir +++ b/test_cases/compile/out/HelloTmpl.ssa.ir @@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloTmpl: block@2: // create_route_L66 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.compile.apps.HelloTmpl.create() return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloTmpl: block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L61 diff --git a/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir index 73382d3b3c..76ebecb6b3 100644 --- a/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl: block@2: // create_route_L66 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out/LargeProgram.approval.mir b/test_cases/compile/out/LargeProgram.approval.mir index bfbfa19b4b..135fccd361 100644 --- a/test_cases/compile/out/LargeProgram.approval.mir +++ b/test_cases/compile/out/LargeProgram.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___get_big_bytes_length_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub get_big_bytes_length to_encode%0#0 itob val_as_bytes%0#0 byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 @@ -52,9 +52,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion tmp%8#0 int DeleteApplication tmp%8#0,DeleteApplication == tmp%9#0 - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -68,7 +68,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%13#0 ! tmp%14#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/compile/out/LargeProgram.approval.teal b/test_cases/compile/out/LargeProgram.approval.teal index a802f369b5..f63d239db7 100644 --- a/test_cases/compile/out/LargeProgram.approval.teal +++ b/test_cases/compile/out/LargeProgram.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___get_big_bytes_length_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_big_bytes_length itob pushbytes 0x151f7c75 @@ -42,9 +42,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -55,7 +55,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/compile/out/LargeProgram.arc32.json b/test_cases/compile/out/LargeProgram.arc32.json index eb519861d7..1cfa9cd164 100644 --- a/test_cases/compile/out/LargeProgram.arc32.json +++ b/test_cases/compile/out/LargeProgram.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlc19sZW5ndGgKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuTGFyZ2VQcm9ncmFtLmdldF9iaWdfYnl0ZXNfbGVuZ3RoKCkgLT4gdWludDY0OgpnZXRfYmlnX2J5dGVzX2xlbmd0aDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzX2xlbmd0aChzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MgogICAgLy8gcmV0dXJuIGdldF9iaWdfYnl0ZXMoKS5sZW5ndGgKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlcwogICAgbGVuCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5nZXRfYmlnX2J5dGVzKCkgLT4gYnl0ZXM6CmdldF9iaWdfYnl0ZXM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDktNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2JpZ19ieXRlcygpIC0+IEJ5dGVzOgogICAgcHJvdG8gMCAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTEKICAgIC8vIHJldHVybiBCeXRlcy5mcm9tX2hleCgiMDAiICogNDA5NikKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzX2xlbmd0aAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM4CiAgICAvLyBjbGFzcyBMYXJnZVByb2dyYW0oQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uZ2V0X2JpZ19ieXRlc19sZW5ndGgoKSAtPiB1aW50NjQ6CmdldF9iaWdfYnl0ZXNfbGVuZ3RoOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfYnl0ZXNfbGVuZ3RoKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQyCiAgICAvLyByZXR1cm4gZ2V0X2JpZ19ieXRlcygpLmxlbmd0aAogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzCiAgICBsZW4KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLmdldF9iaWdfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2JpZ19ieXRlczoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0OS01MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzKCkgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1MQogICAgLy8gcmV0dXJuIEJ5dGVzLmZyb21faGV4KCIwMCIgKiA0MDk2KQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/compile/out/LargeProgram.arc56.json b/test_cases/compile/out/LargeProgram.arc56.json new file mode 100644 index 0000000000..1848b468bf --- /dev/null +++ b/test_cases/compile/out/LargeProgram.arc56.json @@ -0,0 +1,125 @@ +{ + "name": "LargeProgram", + "structs": {}, + "methods": [ + { + "name": "get_big_bytes_length", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 67 + ], + "errorMessage": "OnCompletion is not DeleteApplication" + }, + { + "pc": [ + 43 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 81 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 46, + 70 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzX2xlbmd0aAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM4CiAgICAvLyBjbGFzcyBMYXJnZVByb2dyYW0oQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uZ2V0X2JpZ19ieXRlc19sZW5ndGgoKSAtPiB1aW50NjQ6CmdldF9iaWdfYnl0ZXNfbGVuZ3RoOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfYnl0ZXNfbGVuZ3RoKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQyCiAgICAvLyByZXR1cm4gZ2V0X2JpZ19ieXRlcygpLmxlbmd0aAogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzCiAgICBsZW4KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLmdldF9iaWdfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2JpZ19ieXRlczoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0OS01MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzKCkgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1MQogICAgLy8gcmV0dXJuIEJ5dGVzLmZyb21faGV4KCIwMCIgKiA0MDk2KQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBADiCAgT15P1NBCQ3jTw2GgCOAgACABgjiTEZFEQxGESIACQWgAQVH3x1TFCwIokxGYEFEkQxGEQiiTEZQAAGMRgURCKJI4mKAAGIAAIViYoAAYCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/compile/out/LargeProgram.destructured.ir b/test_cases/compile/out/LargeProgram.destructured.ir index 0cb21207b9..53ca46a088 100644 --- a/test_cases/compile/out/LargeProgram.destructured.ir +++ b/test_cases/compile/out/LargeProgram.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram: block@2: // get_big_bytes_length_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram: block@3: // delete_route_L44 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@6: // bare_routing_L38 let tmp%12#0: uint64 = (txn OnCompletion) @@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L38 return 0u diff --git a/test_cases/compile/out/LargeProgram.ssa.ir b/test_cases/compile/out/LargeProgram.ssa.ir index 1b474dae96..cd30333b79 100644 --- a/test_cases/compile/out/LargeProgram.ssa.ir +++ b/test_cases/compile/out/LargeProgram.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.compile.apps.LargeProgram: block@2: // get_big_bytes_length_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -28,10 +28,10 @@ contract test_cases.compile.apps.LargeProgram: block@3: // delete_route_L44 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.apps.LargeProgram.delete() return 1u block@4: // switch_case_default_L38 @@ -44,7 +44,7 @@ contract test_cases.compile.apps.LargeProgram: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (== tmp%13#0 0u) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating test_cases.compile.apps.LargeProgram.__algopy_default_create() return 1u block@8: // switch_case_default_L38 diff --git a/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir b/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir index 0cb21207b9..53ca46a088 100644 --- a/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram: block@2: // get_big_bytes_length_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram: block@3: // delete_route_L44 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@6: // bare_routing_L38 let tmp%12#0: uint64 = (txn OnCompletion) @@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L38 return 0u diff --git a/test_cases/compile/out_O2/Hello.approval.teal b/test_cases/compile/out_O2/Hello.approval.teal index 0e72b6a0f5..317bece2a3 100644 --- a/test_cases/compile/out_O2/Hello.approval.teal +++ b/test_cases/compile/out_O2/Hello.approval.teal @@ -35,10 +35,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating txna ApplicationArgs 1 extract 2 0 callsub create @@ -49,18 +49,18 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub __puya_arc4_router___greet_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub greet @@ -86,7 +86,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router___update@8: txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub diff --git a/test_cases/compile/out_O2/Hello.destructured.ir b/test_cases/compile/out_O2/Hello.destructured.ir index 5f55bf1037..9860a08388 100644 --- a/test_cases/compile/out_O2/Hello.destructured.ir +++ b/test_cases/compile/out_O2/Hello.destructured.ir @@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello: block@2: // create_route_L56 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) test_cases.compile.apps.Hello.create(tmp%8#0) @@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello: block@3: // delete_route_L25 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 DeleteApplication) - (assert tmp%10#0) // OnCompletion is DeleteApplication + (assert tmp%10#0) // OnCompletion is not DeleteApplication let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0) @@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello: switch tmp%20#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void: diff --git a/test_cases/compile/out_O2/HelloBase.approval.teal b/test_cases/compile/out_O2/HelloBase.approval.teal index 207f7f5424..983c0a8b57 100644 --- a/test_cases/compile/out_O2/HelloBase.approval.teal +++ b/test_cases/compile/out_O2/HelloBase.approval.teal @@ -36,18 +36,18 @@ __puya_arc4_router___delete_route@2: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub __puya_arc4_router___greet_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub greet @@ -74,14 +74,14 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router___update@7: txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub __puya_arc4_router_____algopy_default_create@8: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/compile/out_O2/HelloBase.destructured.ir b/test_cases/compile/out_O2/HelloBase.destructured.ir index c6ab9544b2..43b6feff2d 100644 --- a/test_cases/compile/out_O2/HelloBase.destructured.ir +++ b/test_cases/compile/out_O2/HelloBase.destructured.ir @@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase: block@2: // delete_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 DeleteApplication) - (assert tmp%4#0) // OnCompletion is DeleteApplication + (assert tmp%4#0) // OnCompletion is not DeleteApplication let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating return 1u block@3: // greet_route_L33 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: bytes = (txna ApplicationArgs 1) let tmp%12#0: bytes = ((extract 2 0) tmp%11#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0) @@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase: switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u} block@7: // update_L29 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating return 1u block@8: // __algopy_default_create_L1 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // is creating + (assert tmp%18#0) // can only call when creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out_O2/HelloFactory.approval.teal b/test_cases/compile/out_O2/HelloFactory.approval.teal index 05de31658f..b0ecfd9cb5 100644 --- a/test_cases/compile/out_O2/HelloFactory.approval.teal +++ b/test_cases/compile/out_O2/HelloFactory.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_logicsig_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_logicsig bytec_0 // 0x151f7c75 swap @@ -35,9 +35,9 @@ __puya_arc4_router___test_logicsig_route@2: __puya_arc4_router___test_compile_contract_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract intc_2 // 1 retsub @@ -45,9 +45,9 @@ __puya_arc4_router___test_compile_contract_route@3: __puya_arc4_router___test_compile_contract_tmpl_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_tmpl intc_2 // 1 retsub @@ -55,9 +55,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4: __puya_arc4_router___test_compile_contract_prfx_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_prfx intc_2 // 1 retsub @@ -65,9 +65,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5: __puya_arc4_router___test_compile_contract_large_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_large intc_2 // 1 retsub @@ -75,9 +75,9 @@ __puya_arc4_router___test_compile_contract_large_route@6: __puya_arc4_router___test_arc4_create_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create intc_2 // 1 retsub @@ -85,9 +85,9 @@ __puya_arc4_router___test_arc4_create_route@7: __puya_arc4_router___test_arc4_create_tmpl_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_tmpl intc_2 // 1 retsub @@ -95,9 +95,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8: __puya_arc4_router___test_arc4_create_prfx_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_prfx intc_2 // 1 retsub @@ -105,9 +105,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9: __puya_arc4_router___test_arc4_create_large_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_large intc_2 // 1 retsub @@ -115,9 +115,9 @@ __puya_arc4_router___test_arc4_create_large_route@10: __puya_arc4_router___test_arc4_create_modified_compiled_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_modified_compiled intc_2 // 1 retsub @@ -125,9 +125,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11: __puya_arc4_router___test_arc4_update_route@12: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_arc4_update intc_2 // 1 retsub @@ -135,9 +135,9 @@ __puya_arc4_router___test_arc4_update_route@12: __puya_arc4_router___test_other_constants_route@13: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_other_constants intc_2 // 1 retsub @@ -145,9 +145,9 @@ __puya_arc4_router___test_other_constants_route@13: __puya_arc4_router___test_abi_call_create_params_route@14: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_abi_call_create_params intc_2 // 1 retsub @@ -157,7 +157,7 @@ __puya_arc4_router___bare_routing@17: bnz __puya_arc4_router___after_if_else@21 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_2 // 1 retsub diff --git a/test_cases/compile/out_O2/HelloFactory.destructured.ir b/test_cases/compile/out_O2/HelloFactory.destructured.ir index 6202c8048f..f54ebe9083 100644 --- a/test_cases/compile/out_O2/HelloFactory.destructured.ir +++ b/test_cases/compile/out_O2/HelloFactory.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (! tmp%29#0) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (! tmp%41#0) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) - (assert tmp%43#0) // is not creating + (assert tmp%43#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (! tmp%45#0) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (! tmp%53#0) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) - (assert tmp%55#0) // is not creating + (assert tmp%55#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@17: // bare_routing_L25 @@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (! tmp%58#0) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating return 1u block@21: // after_if_else_L25 return 0u diff --git a/test_cases/compile/out_O2/HelloOtherConstants.approval.teal b/test_cases/compile/out_O2/HelloOtherConstants.approval.teal index 4823a3fd91..52c8932ab7 100644 --- a/test_cases/compile/out_O2/HelloOtherConstants.approval.teal +++ b/test_cases/compile/out_O2/HelloOtherConstants.approval.teal @@ -44,10 +44,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create itob bytec 4 // 0x151f7c75 @@ -61,18 +61,18 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_1 // 1 retsub __puya_arc4_router___greet_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub greet diff --git a/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir b/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir index 4265c3d047..660d3dcfbe 100644 --- a/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir +++ b/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir @@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants: block@2: // create_route_L89 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants: block@3: // delete_route_L93 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@4: // greet_route_L97 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: bytes = (txna ApplicationArgs 1) let tmp%17#0: bytes = ((extract 2 0) tmp%16#0) let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0) diff --git a/test_cases/compile/out_O2/HelloPrfx.approval.teal b/test_cases/compile/out_O2/HelloPrfx.approval.teal index 202a4a8c4e..c7394c76c1 100644 --- a/test_cases/compile/out_O2/HelloPrfx.approval.teal +++ b/test_cases/compile/out_O2/HelloPrfx.approval.teal @@ -35,10 +35,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub @@ -46,18 +46,18 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub __puya_arc4_router___greet_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub greet @@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router___update@8: txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub diff --git a/test_cases/compile/out_O2/HelloPrfx.destructured.ir b/test_cases/compile/out_O2/HelloPrfx.destructured.ir index b5988a21d9..f8cac45570 100644 --- a/test_cases/compile/out_O2/HelloPrfx.destructured.ir +++ b/test_cases/compile/out_O2/HelloPrfx.destructured.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx: block@2: // create_route_L76 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out_O2/HelloTmpl.approval.teal b/test_cases/compile/out_O2/HelloTmpl.approval.teal index e260bfb32e..3443505d46 100644 --- a/test_cases/compile/out_O2/HelloTmpl.approval.teal +++ b/test_cases/compile/out_O2/HelloTmpl.approval.teal @@ -35,10 +35,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub @@ -46,18 +46,18 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub __puya_arc4_router___greet_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub greet @@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router___update@8: txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub diff --git a/test_cases/compile/out_O2/HelloTmpl.destructured.ir b/test_cases/compile/out_O2/HelloTmpl.destructured.ir index 73382d3b3c..76ebecb6b3 100644 --- a/test_cases/compile/out_O2/HelloTmpl.destructured.ir +++ b/test_cases/compile/out_O2/HelloTmpl.destructured.ir @@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl: block@2: // create_route_L66 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl: switch tmp%18#0 {4u => block@8, * => return 0u} block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating return 1u subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes: diff --git a/test_cases/compile/out_O2/LargeProgram.approval.teal b/test_cases/compile/out_O2/LargeProgram.approval.teal index 32c84f42a1..6a4dd877b1 100644 --- a/test_cases/compile/out_O2/LargeProgram.approval.teal +++ b/test_cases/compile/out_O2/LargeProgram.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___get_big_bytes_length_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_big_bytes_length itob pushbytes 0x151f7c75 @@ -36,9 +36,9 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -47,7 +47,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/compile/out_O2/LargeProgram.destructured.ir b/test_cases/compile/out_O2/LargeProgram.destructured.ir index 0cb21207b9..53ca46a088 100644 --- a/test_cases/compile/out_O2/LargeProgram.destructured.ir +++ b/test_cases/compile/out_O2/LargeProgram.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram: block@2: // get_big_bytes_length_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram: block@3: // delete_route_L44 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating return 1u block@6: // bare_routing_L38 let tmp%12#0: uint64 = (txn OnCompletion) @@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L38 return 0u diff --git a/test_cases/compile/out_unoptimized/Hello.approval.teal b/test_cases/compile/out_unoptimized/Hello.approval.teal index 5e8eb1925f..8d90f102dd 100644 --- a/test_cases/compile/out_unoptimized/Hello.approval.teal +++ b/test_cases/compile/out_unoptimized/Hello.approval.teal @@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 @@ -69,11 +69,11 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -84,11 +84,11 @@ __puya_arc4_router___greet_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:54 // class Hello(HelloBase): txna ApplicationArgs 1 @@ -127,7 +127,7 @@ __puya_arc4_router___update@8: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out_unoptimized/Hello.destructured.ir b/test_cases/compile/out_unoptimized/Hello.destructured.ir index bad043f9b0..18d057532c 100644 --- a/test_cases/compile/out_unoptimized/Hello.destructured.ir +++ b/test_cases/compile/out_unoptimized/Hello.destructured.ir @@ -27,10 +27,10 @@ contract test_cases.compile.apps.Hello: block@2: // create_route_L56 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) test_cases.compile.apps.Hello.create(tmp%8#0) @@ -38,19 +38,19 @@ contract test_cases.compile.apps.Hello: block@3: // delete_route_L25 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 DeleteApplication) - (assert tmp%10#0) // OnCompletion is DeleteApplication + (assert tmp%10#0) // OnCompletion is not DeleteApplication let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0) @@ -71,7 +71,7 @@ contract test_cases.compile.apps.Hello: block@8: // update_L29 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L54 diff --git a/test_cases/compile/out_unoptimized/HelloBase.approval.teal b/test_cases/compile/out_unoptimized/HelloBase.approval.teal index 7330a4e035..9495fb95be 100644 --- a/test_cases/compile/out_unoptimized/HelloBase.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloBase.approval.teal @@ -47,11 +47,11 @@ __puya_arc4_router___delete_route@2: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -62,11 +62,11 @@ __puya_arc4_router___greet_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:20 // class HelloBase(ARC4Contract): txna ApplicationArgs 1 @@ -106,7 +106,7 @@ __puya_arc4_router___update@7: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: @@ -118,7 +118,7 @@ __puya_arc4_router_____algopy_default_create@8: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/compile/out_unoptimized/HelloBase.destructured.ir b/test_cases/compile/out_unoptimized/HelloBase.destructured.ir index 7659e2ca5a..1fb683af6a 100644 --- a/test_cases/compile/out_unoptimized/HelloBase.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloBase.destructured.ir @@ -27,19 +27,19 @@ contract test_cases.compile.apps.HelloBase: block@2: // delete_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 DeleteApplication) - (assert tmp%4#0) // OnCompletion is DeleteApplication + (assert tmp%4#0) // OnCompletion is not DeleteApplication let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@3: // greet_route_L33 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%11#0: bytes = (txna ApplicationArgs 1) let tmp%12#0: bytes = ((extract 2 0) tmp%11#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0) @@ -60,13 +60,13 @@ contract test_cases.compile.apps.HelloBase: block@7: // update_L29 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@8: // __algopy_default_create_L1 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (== tmp%17#0 0u) - (assert tmp%18#0) // is creating + (assert tmp%18#0) // can only call when creating test_cases.compile.apps.HelloBase.__algopy_default_create() return 1u block@9: // switch_case_default_L20 diff --git a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal index 8aefcf6e52..9ac55281a9 100644 --- a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal @@ -40,11 +40,11 @@ __puya_arc4_router___test_logicsig_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_logicsig bytec_1 // 0x151f7c75 swap @@ -59,11 +59,11 @@ __puya_arc4_router___test_compile_contract_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_compile_contract intc_2 // 1 retsub @@ -74,11 +74,11 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_tmpl intc_2 // 1 retsub @@ -89,11 +89,11 @@ __puya_arc4_router___test_compile_contract_prfx_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_prfx intc_2 // 1 retsub @@ -104,11 +104,11 @@ __puya_arc4_router___test_compile_contract_large_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_compile_contract_large intc_2 // 1 retsub @@ -119,11 +119,11 @@ __puya_arc4_router___test_arc4_create_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_create intc_2 // 1 retsub @@ -134,11 +134,11 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_tmpl intc_2 // 1 retsub @@ -149,11 +149,11 @@ __puya_arc4_router___test_arc4_create_prfx_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_prfx intc_2 // 1 retsub @@ -164,11 +164,11 @@ __puya_arc4_router___test_arc4_create_large_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_large intc_2 // 1 retsub @@ -179,11 +179,11 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_create_modified_compiled intc_2 // 1 retsub @@ -194,11 +194,11 @@ __puya_arc4_router___test_arc4_update_route@12: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_arc4_update intc_2 // 1 retsub @@ -209,11 +209,11 @@ __puya_arc4_router___test_other_constants_route@13: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_other_constants intc_2 // 1 retsub @@ -224,11 +224,11 @@ __puya_arc4_router___test_abi_call_create_params_route@14: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_abi_call_create_params intc_2 // 1 retsub @@ -249,7 +249,7 @@ __puya_arc4_router_____algopy_default_create@18: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_2 // 1 retsub diff --git a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir index 466b50c9d6..15ded10310 100644 --- a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.compile.factory.HelloFactory: block@2: // test_logicsig_route_L27 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig() let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0) (log tmp%8#0) @@ -27,109 +27,109 @@ contract test_cases.compile.factory.HelloFactory: block@3: // test_compile_contract_route_L31 let tmp%9#0: uint64 = (txn OnCompletion) let tmp%10#0: bool = (== tmp%9#0 NoOp) - (assert tmp%10#0) // OnCompletion is NoOp + (assert tmp%10#0) // OnCompletion is not NoOp let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (!= tmp%11#0 0u) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract() return 1u block@4: // test_compile_contract_tmpl_route_L62 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl() return 1u block@5: // test_compile_contract_prfx_route_L97 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_prfx() return 1u block@6: // test_compile_contract_large_route_L130 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_compile_contract_large() return 1u block@7: // test_arc4_create_route_L161 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (== tmp%25#0 NoOp) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (!= tmp%27#0 0u) - (assert tmp%28#0) // is not creating + (assert tmp%28#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create() return 1u block@8: // test_arc4_create_tmpl_route_L178 let tmp%29#0: uint64 = (txn OnCompletion) let tmp%30#0: bool = (== tmp%29#0 NoOp) - (assert tmp%30#0) // OnCompletion is NoOp + (assert tmp%30#0) // OnCompletion is not NoOp let tmp%31#0: uint64 = (txn ApplicationID) let tmp%32#0: bool = (!= tmp%31#0 0u) - (assert tmp%32#0) // is not creating + (assert tmp%32#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl() return 1u block@9: // test_arc4_create_prfx_route_L199 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_prfx() return 1u block@10: // test_arc4_create_large_route_L222 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_large() return 1u block@11: // test_arc4_create_modified_compiled_route_L237 let tmp%41#0: uint64 = (txn OnCompletion) let tmp%42#0: bool = (== tmp%41#0 NoOp) - (assert tmp%42#0) // OnCompletion is NoOp + (assert tmp%42#0) // OnCompletion is not NoOp let tmp%43#0: uint64 = (txn ApplicationID) let tmp%44#0: bool = (!= tmp%43#0 0u) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled() return 1u block@12: // test_arc4_update_route_L264 let tmp%45#0: uint64 = (txn OnCompletion) let tmp%46#0: bool = (== tmp%45#0 NoOp) - (assert tmp%46#0) // OnCompletion is NoOp + (assert tmp%46#0) // OnCompletion is not NoOp let tmp%47#0: uint64 = (txn ApplicationID) let tmp%48#0: bool = (!= tmp%47#0 0u) - (assert tmp%48#0) // is not creating + (assert tmp%48#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_arc4_update() return 1u block@13: // test_other_constants_route_L298 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (== tmp%49#0 NoOp) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) let tmp%52#0: bool = (!= tmp%51#0 0u) - (assert tmp%52#0) // is not creating + (assert tmp%52#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u block@14: // test_abi_call_create_params_route_L324 let tmp%53#0: uint64 = (txn OnCompletion) let tmp%54#0: bool = (== tmp%53#0 NoOp) - (assert tmp%54#0) // OnCompletion is NoOp + (assert tmp%54#0) // OnCompletion is not NoOp let tmp%55#0: uint64 = (txn ApplicationID) let tmp%56#0: bool = (!= tmp%55#0 0u) - (assert tmp%56#0) // is not creating + (assert tmp%56#0) // can only call when not creating test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u block@15: // switch_case_default_L25 @@ -142,7 +142,7 @@ contract test_cases.compile.factory.HelloFactory: block@18: // __algopy_default_create_L1 let tmp%58#0: uint64 = (txn ApplicationID) let tmp%59#0: bool = (== tmp%58#0 0u) - (assert tmp%59#0) // is creating + (assert tmp%59#0) // can only call when creating test_cases.compile.factory.HelloFactory.__algopy_default_create() return 1u block@19: // switch_case_default_L25 diff --git a/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal b/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal index 194aa330b9..d982f5e747 100644 --- a/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal @@ -63,11 +63,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create itob bytec 4 // 0x151f7c75 @@ -83,11 +83,11 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -98,11 +98,11 @@ __puya_arc4_router___greet_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:81 // class HelloOtherConstants(ARC4Contract): txna ApplicationArgs 1 diff --git a/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir b/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir index e5c48eeb4e..d9f1652a6b 100644 --- a/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir @@ -30,10 +30,10 @@ contract test_cases.compile.apps.HelloOtherConstants: block@2: // create_route_L89 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -42,19 +42,19 @@ contract test_cases.compile.apps.HelloOtherConstants: block@3: // delete_route_L93 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.apps.HelloOtherConstants.delete() return 1u block@4: // greet_route_L97 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (== tmp%12#0 NoOp) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (!= tmp%14#0 0u) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%16#0: bytes = (txna ApplicationArgs 1) let tmp%17#0: bytes = ((extract 2 0) tmp%16#0) let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0) diff --git a/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal b/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal index f37d53e352..553c8e3487 100644 --- a/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal @@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub @@ -63,11 +63,11 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -78,11 +78,11 @@ __puya_arc4_router___greet_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:71 // class HelloPrfx(HelloBase): txna ApplicationArgs 1 @@ -121,7 +121,7 @@ __puya_arc4_router___update@8: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir b/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir index 8b8582d29b..889fb34c0b 100644 --- a/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir @@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloPrfx: block@2: // create_route_L76 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.compile.apps.HelloPrfx.create() return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloPrfx: block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L71 diff --git a/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal b/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal index 8da7e7cb7f..ac1220e468 100644 --- a/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal @@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub @@ -63,11 +63,11 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -78,11 +78,11 @@ __puya_arc4_router___greet_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:61 // class HelloTmpl(HelloBase): txna ApplicationArgs 1 @@ -121,7 +121,7 @@ __puya_arc4_router___update@8: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // compile/apps.py:29-30 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def update(self) -> None: diff --git a/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir b/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir index 882b085ace..103ecf55a5 100644 --- a/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir @@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloTmpl: block@2: // create_route_L66 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.compile.apps.HelloTmpl.create() return 1u block@3: // delete_route_L25 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 DeleteApplication) - (assert tmp%8#0) // OnCompletion is DeleteApplication + (assert tmp%8#0) // OnCompletion is not DeleteApplication let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.compile.apps.HelloBase.delete() return 1u block@4: // greet_route_L33 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = ((extract 2 0) tmp%15#0) let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0) @@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloTmpl: block@8: // update_L29 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating test_cases.compile.apps.HelloBase.update() return 1u block@9: // switch_case_default_L61 diff --git a/test_cases/compile/out_unoptimized/LargeProgram.approval.teal b/test_cases/compile/out_unoptimized/LargeProgram.approval.teal index 1806224012..9b76e4a152 100644 --- a/test_cases/compile/out_unoptimized/LargeProgram.approval.teal +++ b/test_cases/compile/out_unoptimized/LargeProgram.approval.teal @@ -28,11 +28,11 @@ __puya_arc4_router___get_big_bytes_length_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_big_bytes_length itob pushbytes 0x151f7c75 @@ -48,11 +48,11 @@ __puya_arc4_router___delete_route@3: txn OnCompletion pushint 5 // DeleteApplication == - assert // OnCompletion is DeleteApplication + assert // OnCompletion is not DeleteApplication txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub delete intc_1 // 1 retsub @@ -73,7 +73,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir b/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir index 1b474dae96..cd30333b79 100644 --- a/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir +++ b/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.compile.apps.LargeProgram: block@2: // get_big_bytes_length_route_L40 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -28,10 +28,10 @@ contract test_cases.compile.apps.LargeProgram: block@3: // delete_route_L44 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 DeleteApplication) - (assert tmp%9#0) // OnCompletion is DeleteApplication + (assert tmp%9#0) // OnCompletion is not DeleteApplication let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.compile.apps.LargeProgram.delete() return 1u block@4: // switch_case_default_L38 @@ -44,7 +44,7 @@ contract test_cases.compile.apps.LargeProgram: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (== tmp%13#0 0u) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating test_cases.compile.apps.LargeProgram.__algopy_default_create() return 1u block@8: // switch_case_default_L38 diff --git a/test_cases/compile/puya.log b/test_cases/compile/puya.log index e180214ee7..4d87bdeb43 100644 --- a/test_cases/compile/puya.log +++ b/test_cases/compile/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'TMPL_GREETING': b'tmpl', 'PRFX_GREETING': b'prfx', 'TMPL_NUM': b'B', 'TMPL_ACCOUNT': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'TMPL_METHOD': b'/x00/x00/x00/x00'}, template_vars_prefix='', locals_coalescing_strategy=, paths=['compile'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'TMPL_GREETING': b'tmpl', 'PRFX_GREETING': b'prfx', 'TMPL_NUM': b'B', 'TMPL_ACCOUNT': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'TMPL_METHOD': b'/x00/x00/x00/x00'}, template_vars_prefix='', locals_coalescing_strategy=, paths=['compile'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing compile/out/module.awst debug: Sealing block@0: // L12 @@ -7508,6 +7508,7 @@ info: Writing compile/out/always_approve_sig.teal info: Writing compile/out/always_approve_sig.bin info: Writing compile/out/always_approve_sig.puya.map info: Writing compile/out/HelloBase.arc32.json +info: Writing compile/out/HelloBase.arc56.json info: Writing compile/out/HelloBase.approval.teal info: Writing compile/out/HelloBase.clear.teal info: Writing compile/out/HelloBase.approval.bin @@ -7515,6 +7516,7 @@ info: Writing compile/out/HelloBase.clear.bin info: Writing compile/out/HelloBase.approval.puya.map info: Writing compile/out/HelloBase.clear.puya.map info: Writing compile/out/LargeProgram.arc32.json +info: Writing compile/out/LargeProgram.arc56.json info: Writing compile/out/LargeProgram.approval.teal info: Writing compile/out/LargeProgram.clear.teal info: Writing compile/out/LargeProgram.approval.bin @@ -7522,6 +7524,7 @@ info: Writing compile/out/LargeProgram.clear.bin info: Writing compile/out/LargeProgram.approval.puya.map info: Writing compile/out/LargeProgram.clear.puya.map info: Writing compile/out/Hello.arc32.json +info: Writing compile/out/Hello.arc56.json info: Writing compile/out/Hello.approval.teal info: Writing compile/out/Hello.clear.teal info: Writing compile/out/Hello.approval.bin @@ -7529,6 +7532,7 @@ info: Writing compile/out/Hello.clear.bin info: Writing compile/out/Hello.approval.puya.map info: Writing compile/out/Hello.clear.puya.map info: Writing compile/out/HelloTmpl.arc32.json +info: Writing compile/out/HelloTmpl.arc56.json info: Writing compile/out/HelloTmpl.approval.teal info: Writing compile/out/HelloTmpl.clear.teal info: Writing compile/out/HelloTmpl.approval.bin @@ -7536,6 +7540,7 @@ info: Writing compile/out/HelloTmpl.clear.bin info: Writing compile/out/HelloTmpl.approval.puya.map info: Writing compile/out/HelloTmpl.clear.puya.map info: Writing compile/out/HelloPrfx.arc32.json +info: Writing compile/out/HelloPrfx.arc56.json info: Writing compile/out/HelloPrfx.approval.teal info: Writing compile/out/HelloPrfx.clear.teal info: Writing compile/out/HelloPrfx.approval.bin @@ -7543,6 +7548,7 @@ info: Writing compile/out/HelloPrfx.clear.bin info: Writing compile/out/HelloPrfx.approval.puya.map info: Writing compile/out/HelloPrfx.clear.puya.map info: Writing compile/out/HelloOtherConstants.arc32.json +info: Writing compile/out/HelloOtherConstants.arc56.json info: Writing compile/out/HelloOtherConstants.approval.teal info: Writing compile/out/HelloOtherConstants.clear.teal info: Writing compile/out/HelloOtherConstants.approval.bin @@ -7550,6 +7556,7 @@ info: Writing compile/out/HelloOtherConstants.clear.bin info: Writing compile/out/HelloOtherConstants.approval.puya.map info: Writing compile/out/HelloOtherConstants.clear.puya.map info: Writing compile/out/HelloFactory.arc32.json +info: Writing compile/out/HelloFactory.arc56.json info: Writing compile/out/HelloFactory.approval.teal info: Writing compile/out/HelloFactory.clear.teal info: Writing compile/out/HelloFactory.approval.bin diff --git a/test_cases/conditional_execution/puya.log b/test_cases/conditional_execution/puya.log index 28e6c99fe7..0620d09b9b 100644 --- a/test_cases/conditional_execution/puya.log +++ b/test_cases/conditional_execution/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_execution'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_execution'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv conditional_execution/contract.py:11:9 warning: expression result is ignored conditional_execution/contract.py:17:9 warning: expression result is ignored diff --git a/test_cases/conditional_expressions/puya.log b/test_cases/conditional_expressions/puya.log index b6b37bbf45..e2034a50e9 100644 --- a/test_cases/conditional_expressions/puya.log +++ b/test_cases/conditional_expressions/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_expressions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_expressions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing conditional_expressions/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/constants/puya.log b/test_cases/constants/puya.log index a40af6c311..994cddcb2c 100644 --- a/test_cases/constants/puya.log +++ b/test_cases/constants/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['constants'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['constants'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv constants/non_utf8.py:1 warning: UH OH SPAGHETTI-O's, darn tootin' non-utf8(?!) encoded file encountered: constants/non_utf8.py encoded as iso-8859-7 info: writing constants/out/module.awst diff --git a/test_cases/contains/puya.log b/test_cases/contains/puya.log index b876b4ad9c..b3dc49a4b2 100644 --- a/test_cases/contains/puya.log +++ b/test_cases/contains/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['contains'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['contains'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing contains/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/control_op_simplification/puya.log b/test_cases/control_op_simplification/puya.log index a5163b8d28..6bad601747 100644 --- a/test_cases/control_op_simplification/puya.log +++ b/test_cases/control_op_simplification/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['control_op_simplification'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['control_op_simplification'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing control_op_simplification/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/debug/out/DebugContract.approval.mir b/test_cases/debug/out/DebugContract.approval.mir index d0cdab281e..ea6c2ec461 100644 --- a/test_cases/debug/out/DebugContract.approval.mir +++ b/test_cases/debug/out/DebugContract.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___test_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // debug/contract.py:4 // class DebugContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -68,7 +68,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%15#0 ! tmp%16#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/debug/out/DebugContract.approval.teal b/test_cases/debug/out/DebugContract.approval.teal index 6e64ad9866..4301b0cbde 100644 --- a/test_cases/debug/out/DebugContract.approval.teal +++ b/test_cases/debug/out/DebugContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // debug/contract.py:4 // class DebugContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -54,7 +54,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/debug/out/DebugContract.arc32.json b/test_cases/debug/out/DebugContract.arc32.json index b9e76a407a..3a7d8f7f58 100644 --- a/test_cases/debug/out/DebugContract.arc32.json +++ b/test_cases/debug/out/DebugContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3QKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZGVidWcvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgRGVidWdDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/debug/out/DebugContract.arc56.json b/test_cases/debug/out/DebugContract.arc56.json new file mode 100644 index 0000000000..9a23342132 --- /dev/null +++ b/test_cases/debug/out/DebugContract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "DebugContract", + "structs": {}, + "methods": [ + { + "name": "test", + "args": [ + { + "type": "uint64", + "name": "x" + }, + { + "type": "uint64", + "name": "y" + }, + { + "type": "uint64", + "name": "z" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 52 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 91 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 55 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZGVidWcvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgRGVidWdDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQAKASYCASAKMDEyMzQ1Njc4OYgAAUOKAAExG0EAMYAEU1dL/zYaAI4BAAIjiTEZFEQxGEQ2GgEXNhoCFzYaAxeIABkWgAQVH3x1TFCwIokxGUAABjEYFEQiiSOJigMBI0mAAEmL/SULi/2L/ghHAov/C0lOAgxBAAqLBIv+CIwEQgA7iwSLBgxBAAqLBIv/CIwEQgApiwWLBAxBAAqLBIEDC4wEQgAXiwVJiwQNTIwDQQAHiwWLBAiMA4sDjAWLBIsFCIsGDEEADosESYv+iAB8C4wEQgALiwVJi/+IAG4LjAWLBUmIAJOMAIsESU8CCEmMBkmIAISMAUsBDUyMAkEAB4sEiwYIjAKLAkmMBEmLBQxMjAJBAAeLBIsFCIwCiwJJjASLBYsGCEsBDUyMAkEAB4sEi/8LjAKLAkmIADwoUIsAUChQiwFQsIwAiYoCAYv+i/8IjP6L/4v+C4z/i/6L/whJjP6BAgtJjP6L/wiL/ov/C0oMTE4CTYmKAQGL/yQMQQALi/8iCCmL/08CUomL/yQKiP/ki/8kGEkiCClOAlJQiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": { + "A_MULT": { + "type": "AVMUint64", + "value": "AAAAAAAAAAE=" + } + } +} \ No newline at end of file diff --git a/test_cases/debug/out/DebugContract.destructured.ir b/test_cases/debug/out/DebugContract.destructured.ir index 800b9fa49d..602356ca50 100644 --- a/test_cases/debug/out/DebugContract.destructured.ir +++ b/test_cases/debug/out/DebugContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/debug/out/DebugContract.ssa.ir b/test_cases/debug/out/DebugContract.ssa.ir index 3d2fe4a7ba..26f16f2bc6 100644 --- a/test_cases/debug/out/DebugContract.ssa.ir +++ b/test_cases/debug/out/DebugContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -41,7 +41,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (== tmp%15#0 0u) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating test_cases.debug.contract.DebugContract.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir b/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir index 345c6768be..19627244cd 100644 --- a/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir +++ b/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir b/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir index e0ae55e317..055e31cf32 100644 --- a/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir +++ b/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/debug/out_O2/DebugContract.approval.teal b/test_cases/debug/out_O2/DebugContract.approval.teal index 4aaf780f92..835c35dc81 100644 --- a/test_cases/debug/out_O2/DebugContract.approval.teal +++ b/test_cases/debug/out_O2/DebugContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -44,7 +44,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/debug/out_O2/DebugContract.destructured.ir b/test_cases/debug/out_O2/DebugContract.destructured.ir index 800b9fa49d..602356ca50 100644 --- a/test_cases/debug/out_O2/DebugContract.destructured.ir +++ b/test_cases/debug/out_O2/DebugContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/debug/out_unoptimized/DebugContract.approval.teal b/test_cases/debug/out_unoptimized/DebugContract.approval.teal index 7ad1b52db5..1e837243a8 100644 --- a/test_cases/debug/out_unoptimized/DebugContract.approval.teal +++ b/test_cases/debug/out_unoptimized/DebugContract.approval.teal @@ -28,11 +28,11 @@ __puya_arc4_router___test_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // debug/contract.py:4 // class DebugContract(arc4.ARC4Contract): txna ApplicationArgs 1 @@ -71,7 +71,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/debug/out_unoptimized/DebugContract.destructured.ir b/test_cases/debug/out_unoptimized/DebugContract.destructured.ir index bb01709e19..c40e35cc6d 100644 --- a/test_cases/debug/out_unoptimized/DebugContract.destructured.ir +++ b/test_cases/debug/out_unoptimized/DebugContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.debug.contract.DebugContract: block@2: // test_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -41,7 +41,7 @@ contract test_cases.debug.contract.DebugContract: block@6: // __algopy_default_create_L1 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (== tmp%15#0 0u) - (assert tmp%16#0) // is creating + (assert tmp%16#0) // can only call when creating test_cases.debug.contract.DebugContract.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/debug/puya.log b/test_cases/debug/puya.log index 0507b1f982..e5ad141896 100644 --- a/test_cases/debug/puya.log +++ b/test_cases/debug/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'A_MULT': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['debug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'A_MULT': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['debug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing debug/out/module.awst debug: Sealing block@0: // L12 @@ -1160,6 +1160,7 @@ debug: Found 1 edge set/s for test_cases.debug.contract.itoa debug: test_cases.debug.contract.DebugContract.test f-stack entry: ['bee#0', 'cea#0', 'a#30', 'b#10'] debug: test_cases.debug.contract.DebugContract.test f-stack on first store: ['a#0', 'b#0', 'c#0'] info: Writing debug/out/DebugContract.arc32.json +info: Writing debug/out/DebugContract.arc56.json info: Writing debug/out/DebugContract.approval.teal info: Writing debug/out/DebugContract.clear.teal info: Writing debug/out/DebugContract.approval.bin diff --git a/test_cases/diamond_mro/out/Base1.approval.mir b/test_cases/diamond_mro/out/Base1.approval.mir index e71ef5fdf1..87f95f93ae 100644 --- a/test_cases/diamond_mro/out/Base1.approval.mir +++ b/test_cases/diamond_mro/out/Base1.approval.mir @@ -74,9 +74,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub method int 1 1 retsub 1 @@ -86,10 +86,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 ! tmp%10#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/diamond_mro/out/Base1.approval.teal b/test_cases/diamond_mro/out/Base1.approval.teal index cdf8ff4c41..6e8036115c 100644 --- a/test_cases/diamond_mro/out/Base1.approval.teal +++ b/test_cases/diamond_mro/out/Base1.approval.teal @@ -56,9 +56,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -68,10 +68,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out/Base1.arc32.json b/test_cases/diamond_mro/out/Base1.arc32.json index 3e4dd828e1..11c30c3c7b 100644 --- a/test_cases/diamond_mro/out/Base1.arc32.json +++ b/test_cases/diamond_mro/out/Base1.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo2CiAgICAvLyBjbGFzcyBCYXNlMShHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjEzCiAgICAvLyBsb2coImJhc2UxLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/diamond_mro/out/Base1.arc56.json b/test_cases/diamond_mro/out/Base1.arc56.json new file mode 100644 index 0000000000..be6aaebf20 --- /dev/null +++ b/test_cases/diamond_mro/out/Base1.arc56.json @@ -0,0 +1,117 @@ +{ + "name": "Base1", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 93, + 105 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 109 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 96 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gABIgAK0OKAACADmJhc2UxLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMS5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/Base1.destructured.ir b/test_cases/diamond_mro/out/Base1.destructured.ir index 9042c06be3..473e2532c6 100644 --- a/test_cases/diamond_mro/out/Base1.destructured.ir +++ b/test_cases/diamond_mro/out/Base1.destructured.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base1.Base1.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out/Base1.ssa.ir b/test_cases/diamond_mro/out/Base1.ssa.ir index fc8e3515e3..67eeb749c2 100644 --- a/test_cases/diamond_mro/out/Base1.ssa.ir +++ b/test_cases/diamond_mro/out/Base1.ssa.ir @@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base1.Base1: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.base1.Base1.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir index 9042c06be3..473e2532c6 100644 --- a/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir +++ b/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base1.Base1.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out/Base2.approval.mir b/test_cases/diamond_mro/out/Base2.approval.mir index 781d9edaa6..1e829cd818 100644 --- a/test_cases/diamond_mro/out/Base2.approval.mir +++ b/test_cases/diamond_mro/out/Base2.approval.mir @@ -74,9 +74,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub method int 1 1 retsub 1 @@ -86,10 +86,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 ! tmp%10#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/diamond_mro/out/Base2.approval.teal b/test_cases/diamond_mro/out/Base2.approval.teal index 196242ff45..2f89e50aec 100644 --- a/test_cases/diamond_mro/out/Base2.approval.teal +++ b/test_cases/diamond_mro/out/Base2.approval.teal @@ -56,9 +56,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -68,10 +68,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out/Base2.arc32.json b/test_cases/diamond_mro/out/Base2.arc32.json index 512d1d6433..a05838b738 100644 --- a/test_cases/diamond_mro/out/Base2.arc32.json +++ b/test_cases/diamond_mro/out/Base2.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo2CiAgICAvLyBjbGFzcyBCYXNlMihHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjEzCiAgICAvLyBsb2coImJhc2UyLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/diamond_mro/out/Base2.arc56.json b/test_cases/diamond_mro/out/Base2.arc56.json new file mode 100644 index 0000000000..4769f922b2 --- /dev/null +++ b/test_cases/diamond_mro/out/Base2.arc56.json @@ -0,0 +1,117 @@ +{ + "name": "Base2", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 93, + 105 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 109 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 96 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gABIgAK0OKAACADmJhc2UyLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMi5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/Base2.destructured.ir b/test_cases/diamond_mro/out/Base2.destructured.ir index acf34b3d6f..9ceb153949 100644 --- a/test_cases/diamond_mro/out/Base2.destructured.ir +++ b/test_cases/diamond_mro/out/Base2.destructured.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base2.Base2.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out/Base2.ssa.ir b/test_cases/diamond_mro/out/Base2.ssa.ir index 452537667c..65c9bc78e7 100644 --- a/test_cases/diamond_mro/out/Base2.ssa.ir +++ b/test_cases/diamond_mro/out/Base2.ssa.ir @@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base2.Base2: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.base2.Base2.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir index acf34b3d6f..9ceb153949 100644 --- a/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir +++ b/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base2.Base2.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out/Derived.approval.mir b/test_cases/diamond_mro/out/Derived.approval.mir index 624c35182a..7734b5bb64 100644 --- a/test_cases/diamond_mro/out/Derived.approval.mir +++ b/test_cases/diamond_mro/out/Derived.approval.mir @@ -108,9 +108,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub method int 1 1 retsub 1 @@ -120,10 +120,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 ! tmp%10#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/diamond_mro/out/Derived.approval.teal b/test_cases/diamond_mro/out/Derived.approval.teal index 98b12e5c88..aab6bf569b 100644 --- a/test_cases/diamond_mro/out/Derived.approval.teal +++ b/test_cases/diamond_mro/out/Derived.approval.teal @@ -86,9 +86,9 @@ __puya_arc4_router___method_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -98,10 +98,10 @@ __puya_arc4_router___create_route@3: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out/Derived.arc32.json b/test_cases/diamond_mro/out/Derived.arc32.json index 187fd54c23..3e06a976de 100644 --- a/test_cases/diamond_mro/out/Derived.arc32.json +++ b/test_cases/diamond_mro/out/Derived.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEyLTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNAogICAgLy8gbG9nKCJkZXJpdmVkLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImRlcml2ZWQubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjE1CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo3CiAgICAvLyBjbGFzcyBEZXJpdmVkKEJhc2UxLCBCYXNlMik6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5kZXJpdmVkLkRlcml2ZWQubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTQKICAgIC8vIGxvZygiZGVyaXZlZC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNQogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTMKICAgIC8vIGxvZygiYmFzZTEubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTEubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTMKICAgIC8vIGxvZygiYmFzZTIubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTIubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/diamond_mro/out/Derived.arc56.json b/test_cases/diamond_mro/out/Derived.arc56.json new file mode 100644 index 0000000000..37e4451bf7 --- /dev/null +++ b/test_cases/diamond_mro/out/Derived.arc56.json @@ -0,0 +1,117 @@ +{ + "name": "Derived", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 143, + 155 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 159 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 146 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo3CiAgICAvLyBjbGFzcyBEZXJpdmVkKEJhc2UxLCBCYXNlMik6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5kZXJpdmVkLkRlcml2ZWQubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTQKICAgIC8vIGxvZygiZGVyaXZlZC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNQogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTMKICAgIC8vIGxvZygiYmFzZTEubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTEubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTMKICAgIC8vIGxvZygiYmFzZTIubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTIubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gABIgAXUOKAACAEGRlcml2ZWQuX19pbml0X1+wiAABiYoAAIAOYmFzZTEuX19pbml0X1+wiAABiYoAAIAOYmFzZTIuX19pbml0X1+wiAABiYoAAIALZ3AuX19pbml0X1+wiYoAATEbQQAtggIETwRdhARMXGG6NhoAjgIAAgAOIokxGRREMRhEiAAOI4kxGRREMRgURCOJIomKAACADmRlcml2ZWQubWV0aG9ksIgAAYmKAACADGJhc2UxLm1ldGhvZLCIAAGJigAAgAxiYXNlMi5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/Derived.destructured.ir b/test_cases/diamond_mro/out/Derived.destructured.ir index 1efa515380..5912dd70ba 100644 --- a/test_cases/diamond_mro/out/Derived.destructured.ir +++ b/test_cases/diamond_mro/out/Derived.destructured.ir @@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived: block@2: // method_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.derived.Derived.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L7 return 0u diff --git a/test_cases/diamond_mro/out/Derived.ssa.ir b/test_cases/diamond_mro/out/Derived.ssa.ir index 8340184170..e22d99d880 100644 --- a/test_cases/diamond_mro/out/Derived.ssa.ir +++ b/test_cases/diamond_mro/out/Derived.ssa.ir @@ -45,19 +45,19 @@ contract test_cases.diamond_mro.derived.Derived: block@2: // method_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.derived.Derived.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L7 diff --git a/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir index 1efa515380..5912dd70ba 100644 --- a/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir +++ b/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir @@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived: block@2: // method_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.derived.Derived.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L7 return 0u diff --git a/test_cases/diamond_mro/out/GP.approval.mir b/test_cases/diamond_mro/out/GP.approval.mir index d081f9d3fa..eafc2ff03e 100644 --- a/test_cases/diamond_mro/out/GP.approval.mir +++ b/test_cases/diamond_mro/out/GP.approval.mir @@ -57,10 +57,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 @@ -69,9 +69,9 @@ __puya_arc4_router___method_route@3: // @arc4.abimethod txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub method int 1 1 retsub 1 diff --git a/test_cases/diamond_mro/out/GP.approval.teal b/test_cases/diamond_mro/out/GP.approval.teal index 7565ed4864..b9cb21c656 100644 --- a/test_cases/diamond_mro/out/GP.approval.teal +++ b/test_cases/diamond_mro/out/GP.approval.teal @@ -41,10 +41,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub @@ -53,9 +53,9 @@ __puya_arc4_router___method_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out/GP.arc32.json b/test_cases/diamond_mro/out/GP.arc32.json index b952054122..609ded0382 100644 --- a/test_cases/diamond_mro/out/GP.arc32.json +++ b/test_cases/diamond_mro/out/GP.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6Cm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjYKICAgIC8vIGNsYXNzIEdQKEFSQzRDb250cmFjdCwgYWJjLkFCQyk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/diamond_mro/out/GP.arc56.json b/test_cases/diamond_mro/out/GP.arc56.json new file mode 100644 index 0000000000..0068486f7e --- /dev/null +++ b/test_cases/diamond_mro/out/GP.arc56.json @@ -0,0 +1,117 @@ +{ + "name": "GP", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 69, + 79 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 73 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 82 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjYKICAgIC8vIGNsYXNzIEdQKEFSQzRDb250cmFjdCwgYWJjLkFCQyk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gABIgAE0OKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBExcYboETwRdhDYaAI4CAAIADCKJMRkURDEYFEQjiTEZFEQxGESIAAQjiSKJigAAgAlncC5tZXRob2SwiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/GP.destructured.ir b/test_cases/diamond_mro/out/GP.destructured.ir index 4a1a224d07..fc9379597d 100644 --- a/test_cases/diamond_mro/out/GP.destructured.ir +++ b/test_cases/diamond_mro/out/GP.destructured.ir @@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP: block@2: // create_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // method_route_L15 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.diamond_mro.gp.GP.method() return 1u block@7: // after_if_else_L6 diff --git a/test_cases/diamond_mro/out/GP.ssa.ir b/test_cases/diamond_mro/out/GP.ssa.ir index c2169fe6ce..44b803fbf5 100644 --- a/test_cases/diamond_mro/out/GP.ssa.ir +++ b/test_cases/diamond_mro/out/GP.ssa.ir @@ -27,19 +27,19 @@ contract test_cases.diamond_mro.gp.GP: block@2: // create_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@3: // method_route_L15 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.diamond_mro.gp.GP.method() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir index 4a1a224d07..fc9379597d 100644 --- a/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir +++ b/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir @@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP: block@2: // create_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // method_route_L15 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.diamond_mro.gp.GP.method() return 1u block@7: // after_if_else_L6 diff --git a/test_cases/diamond_mro/out_O2/Base1.approval.teal b/test_cases/diamond_mro/out_O2/Base1.approval.teal index 501a96fc20..2473d2b8ac 100644 --- a/test_cases/diamond_mro/out_O2/Base1.approval.teal +++ b/test_cases/diamond_mro/out_O2/Base1.approval.teal @@ -42,9 +42,9 @@ __puya_arc4_router__: __puya_arc4_router___method_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -52,10 +52,10 @@ __puya_arc4_router___method_route@2: __puya_arc4_router___create_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_O2/Base1.destructured.ir b/test_cases/diamond_mro/out_O2/Base1.destructured.ir index 9042c06be3..473e2532c6 100644 --- a/test_cases/diamond_mro/out_O2/Base1.destructured.ir +++ b/test_cases/diamond_mro/out_O2/Base1.destructured.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base1.Base1.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out_O2/Base2.approval.teal b/test_cases/diamond_mro/out_O2/Base2.approval.teal index 3ad3448656..d6dbd059e0 100644 --- a/test_cases/diamond_mro/out_O2/Base2.approval.teal +++ b/test_cases/diamond_mro/out_O2/Base2.approval.teal @@ -42,9 +42,9 @@ __puya_arc4_router__: __puya_arc4_router___method_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -52,10 +52,10 @@ __puya_arc4_router___method_route@2: __puya_arc4_router___create_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_O2/Base2.destructured.ir b/test_cases/diamond_mro/out_O2/Base2.destructured.ir index acf34b3d6f..9ceb153949 100644 --- a/test_cases/diamond_mro/out_O2/Base2.destructured.ir +++ b/test_cases/diamond_mro/out_O2/Base2.destructured.ir @@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.base2.Base2.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L6 return 0u diff --git a/test_cases/diamond_mro/out_O2/Derived.approval.teal b/test_cases/diamond_mro/out_O2/Derived.approval.teal index 2763d855ae..c5ae4d6a2e 100644 --- a/test_cases/diamond_mro/out_O2/Derived.approval.teal +++ b/test_cases/diamond_mro/out_O2/Derived.approval.teal @@ -60,9 +60,9 @@ __puya_arc4_router__: __puya_arc4_router___method_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -70,10 +70,10 @@ __puya_arc4_router___method_route@2: __puya_arc4_router___create_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_O2/Derived.destructured.ir b/test_cases/diamond_mro/out_O2/Derived.destructured.ir index 1efa515380..5912dd70ba 100644 --- a/test_cases/diamond_mro/out_O2/Derived.destructured.ir +++ b/test_cases/diamond_mro/out_O2/Derived.destructured.ir @@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived: block@2: // method_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.diamond_mro.derived.Derived.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@7: // after_if_else_L7 return 0u diff --git a/test_cases/diamond_mro/out_O2/GP.approval.teal b/test_cases/diamond_mro/out_O2/GP.approval.teal index 21fbd12dd5..bd90921d65 100644 --- a/test_cases/diamond_mro/out_O2/GP.approval.teal +++ b/test_cases/diamond_mro/out_O2/GP.approval.teal @@ -33,19 +33,19 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub __puya_arc4_router___method_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_O2/GP.destructured.ir b/test_cases/diamond_mro/out_O2/GP.destructured.ir index 4a1a224d07..fc9379597d 100644 --- a/test_cases/diamond_mro/out_O2/GP.destructured.ir +++ b/test_cases/diamond_mro/out_O2/GP.destructured.ir @@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP: block@2: // create_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // method_route_L15 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.diamond_mro.gp.GP.method() return 1u block@7: // after_if_else_L6 diff --git a/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal b/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal index 8e95be3294..3b35d4c598 100644 --- a/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal +++ b/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal @@ -60,11 +60,11 @@ __puya_arc4_router___method_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -75,11 +75,11 @@ __puya_arc4_router___create_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir index fc8e3515e3..67eeb749c2 100644 --- a/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir +++ b/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir @@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base1.Base1: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.base1.Base1.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal b/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal index df6f607c1f..8021aeb3b4 100644 --- a/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal +++ b/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal @@ -60,11 +60,11 @@ __puya_arc4_router___method_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -75,11 +75,11 @@ __puya_arc4_router___create_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir index 452537667c..65c9bc78e7 100644 --- a/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir +++ b/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir @@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base2.Base2: block@2: // method_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.base2.Base2.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal b/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal index 95fd09df4d..3abde1f3c3 100644 --- a/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal +++ b/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal @@ -90,11 +90,11 @@ __puya_arc4_router___method_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub @@ -105,11 +105,11 @@ __puya_arc4_router___create_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir index 8340184170..e22d99d880 100644 --- a/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir +++ b/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir @@ -45,19 +45,19 @@ contract test_cases.diamond_mro.derived.Derived: block@2: // method_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.diamond_mro.derived.Derived.method() return 1u block@3: // create_route_L11 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@4: // switch_case_default_L7 diff --git a/test_cases/diamond_mro/out_unoptimized/GP.approval.teal b/test_cases/diamond_mro/out_unoptimized/GP.approval.teal index 649323868f..cec5b99cb1 100644 --- a/test_cases/diamond_mro/out_unoptimized/GP.approval.teal +++ b/test_cases/diamond_mro/out_unoptimized/GP.approval.teal @@ -45,11 +45,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub @@ -60,11 +60,11 @@ __puya_arc4_router___method_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub method intc_1 // 1 retsub diff --git a/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir b/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir index c2169fe6ce..44b803fbf5 100644 --- a/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir +++ b/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir @@ -27,19 +27,19 @@ contract test_cases.diamond_mro.gp.GP: block@2: // create_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.diamond_mro.gp.GP.create() return 1u block@3: // method_route_L15 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.diamond_mro.gp.GP.method() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/diamond_mro/puya.log b/test_cases/diamond_mro/puya.log index 451f36eb76..9e0374d2ef 100644 --- a/test_cases/diamond_mro/puya.log +++ b/test_cases/diamond_mro/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['diamond_mro'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['diamond_mro'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing diamond_mro/out/module.awst debug: Sealing block@0: // L12 @@ -1673,6 +1673,7 @@ debug: Replaced __puya_arc4_router___create_route@3.ops[16]: 'v-load tmp%10#0' w debug: Found 1 edge set/s for test_cases.diamond_mro.derived.Derived.approval_program debug: Found 2 edge set/s for test_cases.diamond_mro.derived.Derived.__puya_arc4_router__ info: Writing diamond_mro/out/GP.arc32.json +info: Writing diamond_mro/out/GP.arc56.json info: Writing diamond_mro/out/GP.approval.teal info: Writing diamond_mro/out/GP.clear.teal info: Writing diamond_mro/out/GP.approval.bin @@ -1680,6 +1681,7 @@ info: Writing diamond_mro/out/GP.clear.bin info: Writing diamond_mro/out/GP.approval.puya.map info: Writing diamond_mro/out/GP.clear.puya.map info: Writing diamond_mro/out/Base2.arc32.json +info: Writing diamond_mro/out/Base2.arc56.json info: Writing diamond_mro/out/Base2.approval.teal info: Writing diamond_mro/out/Base2.clear.teal info: Writing diamond_mro/out/Base2.approval.bin @@ -1687,6 +1689,7 @@ info: Writing diamond_mro/out/Base2.clear.bin info: Writing diamond_mro/out/Base2.approval.puya.map info: Writing diamond_mro/out/Base2.clear.puya.map info: Writing diamond_mro/out/Base1.arc32.json +info: Writing diamond_mro/out/Base1.arc56.json info: Writing diamond_mro/out/Base1.approval.teal info: Writing diamond_mro/out/Base1.clear.teal info: Writing diamond_mro/out/Base1.approval.bin @@ -1694,6 +1697,7 @@ info: Writing diamond_mro/out/Base1.clear.bin info: Writing diamond_mro/out/Base1.approval.puya.map info: Writing diamond_mro/out/Base1.clear.puya.map info: Writing diamond_mro/out/Derived.arc32.json +info: Writing diamond_mro/out/Derived.arc56.json info: Writing diamond_mro/out/Derived.approval.teal info: Writing diamond_mro/out/Derived.clear.teal info: Writing diamond_mro/out/Derived.approval.bin diff --git a/test_cases/dup2_optimization_bug/puya.log b/test_cases/dup2_optimization_bug/puya.log index cd5f0d6773..7c4186da3d 100644 --- a/test_cases/dup2_optimization_bug/puya.log +++ b/test_cases/dup2_optimization_bug/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['dup2_optimization_bug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['dup2_optimization_bug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing dup2_optimization_bug/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/edverify/puya.log b/test_cases/edverify/puya.log index 0c6a5b3f88..10b47fc3ab 100644 --- a/test_cases/edverify/puya.log +++ b/test_cases/edverify/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['edverify'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['edverify'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing edverify/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/enumeration/puya.log b/test_cases/enumeration/puya.log index 6002a786ea..1a6a8ac6e6 100644 --- a/test_cases/enumeration/puya.log +++ b/test_cases/enumeration/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['enumeration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['enumeration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing enumeration/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/everything/out/MyContract.approval.mir b/test_cases/everything/out/MyContract.approval.mir index 95324ce211..9ac183e74d 100644 --- a/test_cases/everything/out/MyContract.approval.mir +++ b/test_cases/everything/out/MyContract.approval.mir @@ -37,10 +37,10 @@ __puya_arc4_router___create_route@2: // @abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating callsub create int 1 1 retsub 1 @@ -54,9 +54,9 @@ __puya_arc4_router___register_route@3: shl tmp%8#0 int 3 tmp%8#0,3 & tmp%9#0 - assert // OnCompletion is one of NoOp, OptIn + assert // OnCompletion is not one of NoOp, OptIn txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 tmp%12#0 @@ -71,9 +71,9 @@ __puya_arc4_router___say_hello_route@4: // @abimethod txn OnCompletion tmp%13#0 ! tmp%14#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating callsub say_hello tmp%17#0 byte 0x151f7c75 tmp%17#0,0x151f7c75 l-load tmp%17#0 1 0x151f7c75,tmp%17#0 @@ -87,9 +87,9 @@ __puya_arc4_router___calculate_route@5: // @abimethod txn OnCompletion tmp%19#0 ! tmp%20#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%21#0 - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 tmp%23#0 @@ -112,9 +112,9 @@ __puya_arc4_router___close_out_route@6: txn OnCompletion tmp%27#0 int CloseOut tmp%27#0,CloseOut == tmp%28#0 - assert // OnCompletion is CloseOut + assert // OnCompletion is not CloseOut txn ApplicationID tmp%29#0 - assert // is not creating + assert // can only call when not creating callsub close_out int 1 1 retsub 1 diff --git a/test_cases/everything/out/MyContract.approval.teal b/test_cases/everything/out/MyContract.approval.teal index a0319495eb..1e88676cde 100644 --- a/test_cases/everything/out/MyContract.approval.teal +++ b/test_cases/everything/out/MyContract.approval.teal @@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2: // @abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create intc_0 // 1 retsub @@ -41,9 +41,9 @@ __puya_arc4_router___register_route@3: shl pushint 3 // 3 & - assert // OnCompletion is one of NoOp, OptIn + assert // OnCompletion is not one of NoOp, OptIn txn ApplicationID - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 @@ -58,9 +58,9 @@ __puya_arc4_router___say_hello_route@4: // @abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub say_hello bytec_2 // 0x151f7c75 swap @@ -74,9 +74,9 @@ __puya_arc4_router___calculate_route@5: // @abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 @@ -97,9 +97,9 @@ __puya_arc4_router___close_out_route@6: txn OnCompletion pushint 2 // CloseOut == - assert // OnCompletion is CloseOut + assert // OnCompletion is not CloseOut txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub close_out intc_0 // 1 retsub diff --git a/test_cases/everything/out/MyContract.arc32.json b/test_cases/everything/out/MyContract.arc32.json index 2fcea66446..d91c867dd5 100644 --- a/test_cases/everything/out/MyContract.arc32.json +++ b/test_cases/everything/out/MyContract.arc32.json @@ -28,7 +28,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWdpc3Rlcl9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzIC8vIDMKICAgICYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgY2FsbHN1YiByZWdpc3RlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2F5X2hlbGxvX3JvdXRlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGN1bGF0ZQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xvc2Vfb3V0X3JvdXRlQDY6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCAyIC8vIENsb3NlT3V0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xvc2Vfb3V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDQKICAgIC8vIHNlbGYucmVtZW1iZXJfY3JlYXRvcigpCiAgICBjYWxsc3ViIHJlbWVtYmVyX2NyZWF0b3IKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDUKICAgIC8vIHNlbGYuY291bnRlciA9IFVJbnQ2NChaRVJPKQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX2NoZWNrX2Jhbl9saXN0KCkgLT4gdm9pZDoKX2NoZWNrX2Jhbl9saXN0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYmFuX2xpc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3OQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgIT0gZ2V0X2Jhbm5lZCgpLCAiWW91IGFyZSBiYW5uZWQsIGdvb2RieWUiCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldF9iYW5uZWQKICAgICE9CiAgICBhc3NlcnQgLy8gWW91IGFyZSBiYW5uZWQsIGdvb2RieWUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5nZXRfYmFubmVkKCkgLT4gYnl0ZXM6CmdldF9iYW5uZWQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9iYW5uZWQoKSAtPiBBY2NvdW50OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhZGRyID0gQWNjb3VudChCQU5ORUQpCiAgICBwdXNoYnl0ZXMgYmFzZTMyKFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUFEpIC8vIGFkZHIgVkNNSktXT1k1UDVQN1NLTVpGRk9DRVJPUEpDWk9USUpNTklZTlVDS0g3TFJPNDVKTUpQNlVZQklKQQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNgogICAgLy8gcmV0dXJuIGFkZHIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15QmFzZS5yZW1lbWJlcl9jcmVhdG9yKCkgLT4gdm9pZDoKcmVtZW1iZXJfY3JlYXRvcjoKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo3LTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcmVtZW1iZXJfY3JlYXRvcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6OQogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgcHVzaGJ5dGVzICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBpZiBub3Qgc2VuZGVyX25hbWVfZXhpc3RlZDoKICAgIGJueiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuY291bnRlciArPSBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpICAjIGhhcyBmdWxsIEZ1bmNEZWYKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5CiAgICArCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYubmFtZVswXSA9IG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5tdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpIC0+IHVpbnQ2NDoKbXVsdGlwbGljYXRpdmVfaWRlbnRpdHk6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTgtMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToyMAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnNheV9oZWxsbygpIC0+IGJ5dGVzOgpzYXlfaGVsbG86CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgc2F5X2hlbGxvKHNlbGYpIC0+IFN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTkKICAgIC8vIG5hbWUsIGV4aXN0cyA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MAogICAgLy8gaWYgbm90IGV4aXN0czoKICAgIGJueiBzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gU3RyaW5nKCJIb3dkeSBzdHJhbmdlciEiKQogICAgcHVzaGJ5dGVzIDB4MDAwZjQ4NmY3NzY0NzkyMDczNzQ3MjYxNmU2NzY1NzIyMQogICAgc3dhcAogICAgcmV0c3ViCgpzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MgogICAgLy8gcmV0dXJuICJIZWxsbywgIiArIG5hbWUgKyAiISIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4NDg2NTZjNmM2ZjJjMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgyMQogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuY2FsY3VsYXRlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQtNjUKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNF9VSW50NjQsIGI6IGFyYzRfVUludDY0KSAtPiBhcmM0X1VJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NgogICAgLy8gYyA9IHN1cGVyKCkuY2FsY3VsYXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyByZXR1cm4gYXJjNF9VSW50NjQoYy5uYXRpdmUgKiBiLm5hdGl2ZSkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKgogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjEzLTE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLm5hdGl2ZSArIGIubmF0aXZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNsb3NlX291dCgpIC0+IHZvaWQ6CmNsb3NlX291dDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICAvLyBkZWYgY2xvc2Vfb3V0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX3JlbW92ZV9zZW5kZXIoKSAtPiB2b2lkOgpfcmVtb3ZlX3NlbmRlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlbW92ZV9zZW5kZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5jb3VudGVyIC09IHBvc2l0aXZlX29uZSgpCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBwb3NpdGl2ZV9vbmUKICAgIC0KICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LnBvc2l0aXZlX29uZSgpIC0+IHVpbnQ2NDoKcG9zaXRpdmVfb25lOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4Ni04NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwb3NpdGl2ZV9vbmUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlZ2lzdGVyX3JvdXRlQDM6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBwdXNoaW50IDMgLy8gMwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NheV9oZWxsb19yb3V0ZUA0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1NgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgcHVzaGJ5dGVzIGJhc2UzMihWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlBRKSAvLyBhZGRyIFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUDZVWUJJSkEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBhZGRyCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeUJhc2UucmVtZW1iZXJfY3JlYXRvcigpIC0+IHZvaWQ6CnJlbWVtYmVyX2NyZWF0b3I6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6Ny04CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlbWVtYmVyX2NyZWF0b3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjkKICAgIC8vIHNlbGYuY3JlYXRvciA9IG9wLlR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5yZWdpc3RlcihuYW1lOiBieXRlcykgLT4gdm9pZDoKcmVnaXN0ZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3LTQ4CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgcmVnaXN0ZXIoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MAogICAgLy8gaWYgb3AuVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGJ6IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MQogICAgLy8gc2VuZGVyX25hbWUsIHNlbmRlcl9uYW1lX2V4aXN0ZWQgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MgogICAgLy8gaWYgbm90IHNlbmRlcl9uYW1lX2V4aXN0ZWQ6CiAgICBibnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmNvdW50ZXIgKz0gbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAgIyBoYXMgZnVsbCBGdW5jRGVmCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGlmIG5vdCBleGlzdHM6CiAgICBibnogc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIFN0cmluZygiSG93ZHkgc3RyYW5nZXIhIikKICAgIHB1c2hieXRlcyAweDAwMGY0ODZmNzc2NDc5MjA3Mzc0NzI2MTZlNjc2NTcyMjEKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MjEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMubmF0aXZlICogYi5uYXRpdmUpCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICoKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15TWlkZGxlQmFzZS5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxMy0xNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNC5VSW50NjQsIGI6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYS5uYXRpdmUgKyBiLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgYnl0ZWNibG9jayAiY291bnRlciIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NQogICAgLy8gcmV0dXJuIFRydWUKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fcmVtb3ZlX3NlbmRlcigpIC0+IHZvaWQ6Cl9yZW1vdmVfc2VuZGVyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MS04MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfcmVtb3ZlX3NlbmRlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLmNvdW50ZXIgLT0gcG9zaXRpdmVfb25lKCkKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1Ygo=" }, "state": { diff --git a/test_cases/everything/out/MyContract.arc56.json b/test_cases/everything/out/MyContract.arc56.json new file mode 100644 index 0000000000..1426a3fce2 --- /dev/null +++ b/test_cases/everything/out/MyContract.arc56.json @@ -0,0 +1,233 @@ +{ + "name": "MyContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "register", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp", + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "say_hello", + "args": [], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "calculate", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "close_out", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "CloseOut" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 1 + } + }, + "keys": { + "global": { + "creator": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y3JlYXRvcg==" + }, + "counter": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y291bnRlcg==" + } + }, + "local": { + "name": { + "keyType": "AVMString", + "valueType": "string", + "key": "bmFtZQ==" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 156 + ], + "errorMessage": "OnCompletion is not CloseOut" + }, + { + "pc": [ + 84, + 116, + 132 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 101 + ], + "errorMessage": "OnCompletion is not one of NoOp, OptIn" + }, + { + "pc": [ + 189 + ], + "errorMessage": "You are banned, goodbye" + }, + { + "pc": [ + 88 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 104, + 119, + 135, + 159 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 270, + 406 + ], + "errorMessage": "check self.counter exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [ + { + "pc": [ + 24 + ], + "errorMessage": "check self.counter exists" + } + ], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlZ2lzdGVyX3JvdXRlQDM6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBwdXNoaW50IDMgLy8gMwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NheV9oZWxsb19yb3V0ZUA0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1NgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgcHVzaGJ5dGVzIGJhc2UzMihWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlBRKSAvLyBhZGRyIFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUDZVWUJJSkEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBhZGRyCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeUJhc2UucmVtZW1iZXJfY3JlYXRvcigpIC0+IHZvaWQ6CnJlbWVtYmVyX2NyZWF0b3I6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6Ny04CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlbWVtYmVyX2NyZWF0b3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjkKICAgIC8vIHNlbGYuY3JlYXRvciA9IG9wLlR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5yZWdpc3RlcihuYW1lOiBieXRlcykgLT4gdm9pZDoKcmVnaXN0ZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3LTQ4CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgcmVnaXN0ZXIoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MAogICAgLy8gaWYgb3AuVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGJ6IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MQogICAgLy8gc2VuZGVyX25hbWUsIHNlbmRlcl9uYW1lX2V4aXN0ZWQgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MgogICAgLy8gaWYgbm90IHNlbmRlcl9uYW1lX2V4aXN0ZWQ6CiAgICBibnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmNvdW50ZXIgKz0gbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAgIyBoYXMgZnVsbCBGdW5jRGVmCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGlmIG5vdCBleGlzdHM6CiAgICBibnogc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIFN0cmluZygiSG93ZHkgc3RyYW5nZXIhIikKICAgIHB1c2hieXRlcyAweDAwMGY0ODZmNzc2NDc5MjA3Mzc0NzI2MTZlNjc2NTcyMjEKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MjEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMubmF0aXZlICogYi5uYXRpdmUpCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICoKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15TWlkZGxlQmFzZS5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxMy0xNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNC5VSW50NjQsIGI6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYS5uYXRpdmUgKyBiLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgYnl0ZWNibG9jayAiY291bnRlciIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NQogICAgLy8gcmV0dXJuIFRydWUKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fcmVtb3ZlX3NlbmRlcigpIC0+IHZvaWQ6Cl9yZW1vdmVfc2VuZGVyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MS04MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfcmVtb3ZlX3NlbmRlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLmNvdW50ZXIgLT0gcG9zaXRpdmVfb25lKCkKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1Ygo=" + }, + "byteCode": { + "approval": "CiACAQAmAwdjb3VudGVyBG5hbWUEFR98dYgAAUOKAAExG0EAgIIFBExcYboEvWCZ5QRdXITHBP0HJk4EFliqLzYaAI4FAAIADwAiADIASCOJMRkURDEYFESIAEsiiSIxGZCBAxpEMRhENhoBiACGIokxGRREMRhEiACmKkxQsCKJMRkURDEYRDYaATYaAogA2ypMULAiiTEZgQISRDEYRIgA5iKJI4mKAACIAAeIADUoI2eJigAAMQCIAAMTRImKAAGAIKiYlVnY6/r/yUzJSuESLnpFl00JY1GG0Eo/1xdzqWJfiYoAAIAHY3JlYXRvcjEAZ4mKAQCI/7kxGSISQQAUI0kpY0UBQAALIyhlRIgACggoTGcjKYv/ZomKAAEiiYoAAYj/jSNJKWNAABWAEQAPSG93ZHkgc3RyYW5nZXIhTImLAFcCAIAHSGVsbG8sIExQSRUWVwYCTFBXAgCAASFQSRUWVwYCTFBMiYoCAYv+i/+IAAcXi/8XCxaJigIBi/4Xi/8XCBaJigAAiAABiYoAACMoZUSIAAUJKExniYoAASKJ", + "clear": "CiYBB2NvdW50ZXKIAAOBAUOKAACBAChlRIgABQkoTGeJigABgQGJ" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/everything/out/MyContract.destructured.ir b/test_cases/everything/out/MyContract.destructured.ir index af8d6e417b..11c36cfe9a 100644 --- a/test_cases/everything/out/MyContract.destructured.ir +++ b/test_cases/everything/out/MyContract.destructured.ir @@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out/MyContract.ssa.ir b/test_cases/everything/out/MyContract.ssa.ir index 8c404d05f9..0f6e016c13 100644 --- a/test_cases/everything/out/MyContract.ssa.ir +++ b/test_cases/everything/out/MyContract.ssa.ir @@ -26,30 +26,30 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -57,10 +57,10 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -70,10 +70,10 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@7: // switch_case_default_L37 diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir index 797bc1da4f..dd76e871cb 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir @@ -20,28 +20,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -49,9 +49,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -61,9 +61,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir index 633b04deba..1d2eb504a6 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir @@ -18,28 +18,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -47,9 +47,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -59,9 +59,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir index 224148d76b..8acb28f39c 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir @@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir index 4278e4715a..355f97e7d4 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir @@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir index af8d6e417b..11c36cfe9a 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir @@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out_O2/MyContract.approval.teal b/test_cases/everything/out_O2/MyContract.approval.teal index 414ffc36e9..9288254fad 100644 --- a/test_cases/everything/out_O2/MyContract.approval.teal +++ b/test_cases/everything/out_O2/MyContract.approval.teal @@ -21,10 +21,10 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create intc_0 // 1 retsub @@ -35,9 +35,9 @@ __puya_arc4_router___register_route@3: shl pushint 3 // 3 & - assert // OnCompletion is one of NoOp, OptIn + assert // OnCompletion is not one of NoOp, OptIn txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub register intc_0 // 1 @@ -46,9 +46,9 @@ __puya_arc4_router___register_route@3: __puya_arc4_router___say_hello_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub say_hello bytec_2 // 0x151f7c75 swap @@ -60,9 +60,9 @@ __puya_arc4_router___say_hello_route@4: __puya_arc4_router___calculate_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 callsub calculate @@ -77,9 +77,9 @@ __puya_arc4_router___close_out_route@6: txn OnCompletion pushint 2 // CloseOut == - assert // OnCompletion is CloseOut + assert // OnCompletion is not CloseOut txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub close_out intc_0 // 1 retsub diff --git a/test_cases/everything/out_O2/MyContract.destructured.ir b/test_cases/everything/out_O2/MyContract.destructured.ir index af8d6e417b..11c36cfe9a 100644 --- a/test_cases/everything/out_O2/MyContract.destructured.ir +++ b/test_cases/everything/out_O2/MyContract.destructured.ir @@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@10: // after_if_else_L37 diff --git a/test_cases/everything/out_unoptimized/MyContract.approval.teal b/test_cases/everything/out_unoptimized/MyContract.approval.teal index 049f65ccb6..98e6331599 100644 --- a/test_cases/everything/out_unoptimized/MyContract.approval.teal +++ b/test_cases/everything/out_unoptimized/MyContract.approval.teal @@ -45,11 +45,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub @@ -63,11 +63,11 @@ __puya_arc4_router___register_route@3: shl pushint 3 // 3 & - assert // OnCompletion is one of NoOp, OptIn + assert // OnCompletion is not one of NoOp, OptIn txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 @@ -83,11 +83,11 @@ __puya_arc4_router___say_hello_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub say_hello bytec_2 // 0x151f7c75 swap @@ -102,11 +102,11 @@ __puya_arc4_router___calculate_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 1 @@ -127,11 +127,11 @@ __puya_arc4_router___close_out_route@6: txn OnCompletion pushint 2 // CloseOut == - assert // OnCompletion is CloseOut + assert // OnCompletion is not CloseOut txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub close_out intc_1 // 1 retsub diff --git a/test_cases/everything/out_unoptimized/MyContract.destructured.ir b/test_cases/everything/out_unoptimized/MyContract.destructured.ir index b567999e45..7375a1e33d 100644 --- a/test_cases/everything/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/everything/out_unoptimized/MyContract.destructured.ir @@ -26,30 +26,30 @@ contract test_cases.everything.contract.Everything: block@2: // create_route_L41 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.everything.contract.Everything.create() return 1u block@3: // register_route_L47 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: uint64 = (shl 1u tmp%7#0) let tmp%9#0: uint64 = (& tmp%8#0 3u) - (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn + (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.everything.contract.Everything.register(tmp%12#0) return 1u block@4: // say_hello_route_L56 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello() let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0) (log tmp%18#0) @@ -57,10 +57,10 @@ contract test_cases.everything.contract.Everything: block@5: // calculate_route_L64 let tmp%19#0: uint64 = (txn OnCompletion) let tmp%20#0: bool = (== tmp%19#0 NoOp) - (assert tmp%20#0) // OnCompletion is NoOp + (assert tmp%20#0) // OnCompletion is not NoOp let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (!= tmp%21#0 0u) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%23#0: bytes = (txna ApplicationArgs 1) let tmp%24#0: bytes = (txna ApplicationArgs 2) let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0) @@ -70,10 +70,10 @@ contract test_cases.everything.contract.Everything: block@6: // close_out_route_L69 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 CloseOut) - (assert tmp%28#0) // OnCompletion is CloseOut + (assert tmp%28#0) // OnCompletion is not CloseOut let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating test_cases.everything.contract.Everything.close_out() return 1u block@7: // switch_case_default_L37 diff --git a/test_cases/everything/puya.log b/test_cases/everything/puya.log index 71d5ec425f..6773a19a36 100644 --- a/test_cases/everything/puya.log +++ b/test_cases/everything/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['everything'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['everything'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing everything/out/module.awst debug: Sealing block@0: // L12 @@ -1911,6 +1911,7 @@ debug: Replaced _remove_sender_block@0.ops[17]: 'v-load new_state_value%0#0' wit debug: Inserted _remove_sender_block@0.ops[5]: 'l-store-copy maybe_value%0#0 1' debug: Replaced _remove_sender_block@0.ops[12]: 'v-load maybe_value%0#0' with 'l-load maybe_value%0#0' info: Writing everything/out/MyContract.arc32.json +info: Writing everything/out/MyContract.arc56.json info: Writing everything/out/MyContract.approval.teal info: Writing everything/out/MyContract.clear.teal info: Writing everything/out/MyContract.approval.bin diff --git a/test_cases/group_side_effects/out/AppCall.approval.mir b/test_cases/group_side_effects/out/AppCall.approval.mir index 6c61289e58..b6fe743adf 100644 --- a/test_cases/group_side_effects/out/AppCall.approval.mir +++ b/test_cases/group_side_effects/out/AppCall.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___some_value_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub some_value to_encode%0#0 itob val_as_bytes%0#0 byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 @@ -55,7 +55,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%9#0 ! tmp%10#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/group_side_effects/out/AppCall.approval.teal b/test_cases/group_side_effects/out/AppCall.approval.teal index 31d319e58d..d1851a081e 100644 --- a/test_cases/group_side_effects/out/AppCall.approval.teal +++ b/test_cases/group_side_effects/out/AppCall.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___some_value_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub some_value itob pushbytes 0x151f7c75 @@ -43,7 +43,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/group_side_effects/out/AppCall.arc32.json b/test_cases/group_side_effects/out/AppCall.arc32.json index 0cc60cc421..d5a4ba99c8 100644 --- a/test_cases/group_side_effects/out/AppCall.arc32.json +++ b/test_cases/group_side_effects/out/AppCall.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zb21lX3ZhbHVlX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NvbWVfdmFsdWVfcm91dGVAMjoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzb21lX3ZhbHVlCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjQKICAgIC8vIGNsYXNzIEFwcENhbGwoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlKCkgLT4gdWludDY0Ogpzb21lX3ZhbHVlOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzb21lX3ZhbHVlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjcKICAgIC8vIHJldHVybiBHbG9iYWwuZ3JvdXBfc2l6ZSAqIChUeG4uZ3JvdXBfaW5kZXggKyAxKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAqCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zb21lX3ZhbHVlX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NvbWVfdmFsdWVfcm91dGVAMjoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNvbWVfdmFsdWUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlKCkgLT4gdWludDY0Ogpzb21lX3ZhbHVlOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzb21lX3ZhbHVlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjcKICAgIC8vIHJldHVybiBHbG9iYWwuZ3JvdXBfc2l6ZSAqIChUeG4uZ3JvdXBfaW5kZXggKyAxKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAqCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/group_side_effects/out/AppCall.arc56.json b/test_cases/group_side_effects/out/AppCall.arc56.json new file mode 100644 index 0000000000..59a38e68cd --- /dev/null +++ b/test_cases/group_side_effects/out/AppCall.arc56.json @@ -0,0 +1,102 @@ +{ + "name": "AppCall", + "structs": {}, + "methods": [ + { + "name": "some_value", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 62 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zb21lX3ZhbHVlX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NvbWVfdmFsdWVfcm91dGVAMjoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNvbWVfdmFsdWUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlKCkgLT4gdWludDY0Ogpzb21lX3ZhbHVlOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzb21lX3ZhbHVlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjcKICAgIC8vIHJldHVybiBHbG9iYWwuZ3JvdXBfc2l6ZSAqIChUeG4uZ3JvdXBfaW5kZXggKyAxKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAqCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBACWABNNHnmU2GgCOAQACI4kxGRREMRhEiAAZFoAEFR98dUxQsCKJMRlAAAYxGBREIokjiYoAATIEMRYiCAuJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/group_side_effects/out/AppCall.destructured.ir b/test_cases/group_side_effects/out/AppCall.destructured.ir index 07c6c11f91..7306e16a40 100644 --- a/test_cases/group_side_effects/out/AppCall.destructured.ir +++ b/test_cases/group_side_effects/out/AppCall.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.other.AppCall: block@2: // some_value_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.group_side_effects.other.AppCall.some_value() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -29,7 +29,7 @@ contract test_cases.group_side_effects.other.AppCall: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out/AppCall.ssa.ir b/test_cases/group_side_effects/out/AppCall.ssa.ir index 0d0540c992..db632cc428 100644 --- a/test_cases/group_side_effects/out/AppCall.ssa.ir +++ b/test_cases/group_side_effects/out/AppCall.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.group_side_effects.other.AppCall: block@2: // some_value_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.group_side_effects.other.AppCall.some_value() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -35,7 +35,7 @@ contract test_cases.group_side_effects.other.AppCall: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.group_side_effects.other.AppCall.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/group_side_effects/out/AppCall.ssa.opt_pass_1.ir b/test_cases/group_side_effects/out/AppCall.ssa.opt_pass_1.ir index 07c6c11f91..7306e16a40 100644 --- a/test_cases/group_side_effects/out/AppCall.ssa.opt_pass_1.ir +++ b/test_cases/group_side_effects/out/AppCall.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.other.AppCall: block@2: // some_value_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.group_side_effects.other.AppCall.some_value() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -29,7 +29,7 @@ contract test_cases.group_side_effects.other.AppCall: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.approval.mir b/test_cases/group_side_effects/out/AppExpectingEffects.approval.mir index 2b93e4255f..3153d3ae4d 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.approval.mir +++ b/test_cases/group_side_effects/out/AppExpectingEffects.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___create_group_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex tmp%7#0 @@ -79,9 +79,9 @@ __puya_arc4_router___log_group_route@3: // @arc4.abimethod txn OnCompletion tmp%10#0 ! tmp%11#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%12#0 - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex tmp%14#0 @@ -109,7 +109,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%16#0 ! tmp%17#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.approval.teal b/test_cases/group_side_effects/out/AppExpectingEffects.approval.teal index 904d5fddfc..a8a2e4433e 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.approval.teal +++ b/test_cases/group_side_effects/out/AppExpectingEffects.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___create_group_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex @@ -66,9 +66,9 @@ __puya_arc4_router___log_group_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex @@ -92,7 +92,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.arc32.json b/test_cases/group_side_effects/out/AppExpectingEffects.arc32.json index 17b3e1ff59..b47b550e60 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.arc32.json +++ b/test_cases/group_side_effects/out/AppExpectingEffects.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfZ3JvdXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2dyb3VwX3JvdXRlQDI6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNyZWF0ZV9ncm91cAogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGxvZ19ncm91cAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZ3JvdXBfc2lkZV9lZmZlY3RzLmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMuY3JlYXRlX2dyb3VwKGFzc2V0X2NyZWF0ZTogdWludDY0LCBhcHBfY3JlYXRlOiB1aW50NjQpIC0+IHVpbnQ2NCwgdWludDY0OgpjcmVhdGVfZ3JvdXA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NS0xMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY3JlYXRlX2dyb3VwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfY3JlYXRlOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYXBwX2NyZWF0ZTogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gdHVwbGVbVUludDY0LCBVSW50NjRdOgogICAgcHJvdG8gMiAyCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTEKICAgIC8vIGFzc2VydCBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZCwgImV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTMKICAgIC8vIG9wLmdhaWQoYXNzZXRfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZAogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTItMTQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgY3JlYXRlZAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjE2LTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjAKICAgIC8vIHJldHVybiBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZCwgYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXAoYXBwX2NhbGw6IHVpbnQ2NCkgLT4gdm9pZDoKbG9nX2dyb3VwOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjIyLTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBsb2dfZ3JvdXAoc2VsZiwgYXBwX2NhbGw6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI0LTI2CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICAic29tZV92YWx1ZSgpdWludDY0IgogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgbWV0aG9kIGNhbGxlZCIKICAgIHB1c2hieXRlcyAweGQzNDc5ZTY1IC8vIG1ldGhvZCAic29tZV92YWx1ZSgpdWludDY0IgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyNwogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLm51bV9sb2dzID09IDEsICJleHBlY3RlZCBsb2dzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1Mb2dzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBsb2dzCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MzAKICAgIC8vID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGdsb2JhbCBHcm91cFNpemUKICAgICoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOC0zMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhcmM0LlVJbnQ2NC5mcm9tX2xvZyhhcHBfY2FsbC5sYXN0X2xvZykKICAgIC8vICAgICA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICAvLyApCiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfZ3JvdXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2dyb3VwX3JvdXRlQDI6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY3JlYXRlX2dyb3VwCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncm91cF9yb3V0ZUAzOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFwcEV4cGVjdGluZ0VmZmVjdHMoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBsb2dfZ3JvdXAKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFwcEV4cGVjdGluZ0VmZmVjdHMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5jcmVhdGVfZ3JvdXAoYXNzZXRfY3JlYXRlOiB1aW50NjQsIGFwcF9jcmVhdGU6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo1LTEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjcmVhdGVfZ3JvdXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhc3NldF9jcmVhdGU6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhcHBfY3JlYXRlOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAyIDIKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMwogICAgLy8gb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQsICJleHBlY3RlZCBhcHAgY3JlYXRlZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTcKICAgIC8vIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTYtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMAogICAgLy8gcmV0dXJuIGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmxvZ19ncm91cChhcHBfY2FsbDogdWludDY0KSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGxvZ19ncm91cChzZWxmLCBhcHBfY2FsbDogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjQtMjYKICAgIC8vIGFzc2VydCBhcHBfY2FsbC5hcHBfYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkIgogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbWV0aG9kIGNhbGxlZAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOQogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTozMAogICAgLy8gPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyBhcmM0LlVJbnQ2NC5mcm9tX2xvZyhhcHBfY2FsbC5sYXN0X2xvZykKICAgIC8vID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIGl0b2IKICAgIGI9PQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI4LTMxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgLy8gICAgID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIC8vICkKICAgIGFzc2VydAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json b/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json new file mode 100644 index 0000000000..1a51faf73d --- /dev/null +++ b/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json @@ -0,0 +1,189 @@ +{ + "name": "AppExpectingEffects", + "structs": {}, + "methods": [ + { + "name": "create_group", + "args": [ + { + "type": "acfg", + "name": "asset_create" + }, + { + "type": "appl", + "name": "app_create" + } + ], + "returns": { + "type": "(uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_group", + "args": [ + { + "type": "appl", + "name": "app_call" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 197 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 51, + 94 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 121 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 54, + 97 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 149 + ], + "errorMessage": "expected app created" + }, + { + "pc": [ + 134 + ], + "errorMessage": "expected asset created" + }, + { + "pc": [ + 158 + ], + "errorMessage": "expected correct app id" + }, + { + "pc": [ + 143 + ], + "errorMessage": "expected correct asset id" + }, + { + "pc": [ + 175 + ], + "errorMessage": "expected correct method called" + }, + { + "pc": [ + 182 + ], + "errorMessage": "expected logs" + }, + { + "pc": [ + 66 + ], + "errorMessage": "transaction type is acfg" + }, + { + "pc": [ + 76, + 107 + ], + "errorMessage": "transaction type is appl" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfZ3JvdXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2dyb3VwX3JvdXRlQDI6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY3JlYXRlX2dyb3VwCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncm91cF9yb3V0ZUAzOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFwcEV4cGVjdGluZ0VmZmVjdHMoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBsb2dfZ3JvdXAKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFwcEV4cGVjdGluZ0VmZmVjdHMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5jcmVhdGVfZ3JvdXAoYXNzZXRfY3JlYXRlOiB1aW50NjQsIGFwcF9jcmVhdGU6IHVpbnQ2NCkgLT4gdWludDY0LCB1aW50NjQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTo1LTEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjcmVhdGVfZ3JvdXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhc3NldF9jcmVhdGU6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhcHBfY3JlYXRlOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiB0dXBsZVtVSW50NjQsIFVJbnQ2NF06CiAgICBwcm90byAyIDIKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMwogICAgLy8gb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQsICJleHBlY3RlZCBhcHAgY3JlYXRlZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTcKICAgIC8vIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTYtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMAogICAgLy8gcmV0dXJuIGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmxvZ19ncm91cChhcHBfY2FsbDogdWludDY0KSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGxvZ19ncm91cChzZWxmLCBhcHBfY2FsbDogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjQtMjYKICAgIC8vIGFzc2VydCBhcHBfY2FsbC5hcHBfYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkIgogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbWV0aG9kIGNhbGxlZAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOQogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weTozMAogICAgLy8gPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyBhcmM0LlVJbnQ2NC5mcm9tX2xvZyhhcHBfY2FsbC5sYXN0X2xvZykKICAgIC8vID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIGl0b2IKICAgIGI9PQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI4LTMxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgLy8gICAgID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIC8vICkKICAgIGFzc2VydAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAQAGJgEEFR98dYgAAUOKAAExG0EAWIICBG06BDkEYqDvYjYaAI4CAAIALSOJMRkURDEYRDEWgQIJSTgQgQMSRDEWIglJOBAkEkSIAC5MFkwWUChMULAiiTEZFEQxGEQxFiIJSTgQJBJEiAAxIokxGUAABjEYFEQiiSOJigICi/44PElEi/44Fj1LARJEi/84PUlEi/84Fj1LARJEiYoBAIv/I8IagATTR55lEkSL/zg7IhJEi/84PklXBABMVwAEKBJEi/84FiIIMgQLFqhEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.destructured.ir b/test_cases/group_side_effects/out/AppExpectingEffects.destructured.ir index 999919b420..885c849fab 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.destructured.ir +++ b/test_cases/group_side_effects/out/AppExpectingEffects.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -38,9 +38,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -54,7 +54,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.ir b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.ir index f7fc1afdcf..1aaa941268 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.ir +++ b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -43,10 +43,10 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -64,7 +64,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.group_side_effects.contract.AppExpectingEffects.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_1.ir b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_1.ir index 5784abb1ad..03ee99fbb2 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_1.ir +++ b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -39,9 +39,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -55,7 +55,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_2.ir b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_2.ir index 999919b420..885c849fab 100644 --- a/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_2.ir +++ b/test_cases/group_side_effects/out/AppExpectingEffects.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -38,9 +38,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -54,7 +54,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out_O2/AppCall.approval.teal b/test_cases/group_side_effects/out_O2/AppCall.approval.teal index 911d0b0bca..08afe21c03 100644 --- a/test_cases/group_side_effects/out_O2/AppCall.approval.teal +++ b/test_cases/group_side_effects/out_O2/AppCall.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___some_value_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub some_value itob pushbytes 0x151f7c75 @@ -37,7 +37,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/group_side_effects/out_O2/AppCall.destructured.ir b/test_cases/group_side_effects/out_O2/AppCall.destructured.ir index 07c6c11f91..7306e16a40 100644 --- a/test_cases/group_side_effects/out_O2/AppCall.destructured.ir +++ b/test_cases/group_side_effects/out_O2/AppCall.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.other.AppCall: block@2: // some_value_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.group_side_effects.other.AppCall.some_value() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -29,7 +29,7 @@ contract test_cases.group_side_effects.other.AppCall: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out_O2/AppExpectingEffects.approval.teal b/test_cases/group_side_effects/out_O2/AppExpectingEffects.approval.teal index 9372c63fc4..21e1b99fba 100644 --- a/test_cases/group_side_effects/out_O2/AppExpectingEffects.approval.teal +++ b/test_cases/group_side_effects/out_O2/AppExpectingEffects.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___create_group_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex pushint 2 // 2 - @@ -56,9 +56,9 @@ __puya_arc4_router___create_group_route@2: __puya_arc4_router___log_group_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -76,7 +76,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/group_side_effects/out_O2/AppExpectingEffects.destructured.ir b/test_cases/group_side_effects/out_O2/AppExpectingEffects.destructured.ir index 999919b420..885c849fab 100644 --- a/test_cases/group_side_effects/out_O2/AppExpectingEffects.destructured.ir +++ b/test_cases/group_side_effects/out_O2/AppExpectingEffects.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -38,9 +38,9 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (! tmp%10#0) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) - (assert tmp%12#0) // is not creating + (assert tmp%12#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -54,7 +54,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/group_side_effects/out_unoptimized/AppCall.approval.teal b/test_cases/group_side_effects/out_unoptimized/AppCall.approval.teal index d58bbc13a8..8ed1e8685e 100644 --- a/test_cases/group_side_effects/out_unoptimized/AppCall.approval.teal +++ b/test_cases/group_side_effects/out_unoptimized/AppCall.approval.teal @@ -27,11 +27,11 @@ __puya_arc4_router___some_value_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub some_value itob pushbytes 0x151f7c75 @@ -57,7 +57,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/group_side_effects/out_unoptimized/AppCall.destructured.ir b/test_cases/group_side_effects/out_unoptimized/AppCall.destructured.ir index 0d0540c992..db632cc428 100644 --- a/test_cases/group_side_effects/out_unoptimized/AppCall.destructured.ir +++ b/test_cases/group_side_effects/out_unoptimized/AppCall.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.group_side_effects.other.AppCall: block@2: // some_value_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.group_side_effects.other.AppCall.some_value() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -35,7 +35,7 @@ contract test_cases.group_side_effects.other.AppCall: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.group_side_effects.other.AppCall.__algopy_default_create() return 1u block@7: // switch_case_default_L4 diff --git a/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.approval.teal b/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.approval.teal index b410601cb1..f16998a5bb 100644 --- a/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.approval.teal +++ b/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___create_group_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex @@ -78,11 +78,11 @@ __puya_arc4_router___log_group_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // group_side_effects/contract.py:4 // class AppExpectingEffects(ARC4Contract): txn GroupIndex @@ -115,7 +115,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.destructured.ir b/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.destructured.ir index 62dc4696cb..3bc4b29fc8 100644 --- a/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.destructured.ir +++ b/test_cases/group_side_effects/out_unoptimized/AppExpectingEffects.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@2: // create_group_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%7#0 2u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -41,10 +41,10 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@3: // log_group_route_L22 let tmp%10#0: uint64 = (txn OnCompletion) let tmp%11#0: bool = (== tmp%10#0 NoOp) - (assert tmp%11#0) // OnCompletion is NoOp + (assert tmp%11#0) // OnCompletion is not NoOp let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (!= tmp%12#0 0u) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%14#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%14#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -62,7 +62,7 @@ contract test_cases.group_side_effects.contract.AppExpectingEffects: block@7: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.group_side_effects.contract.AppExpectingEffects.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/group_side_effects/puya.log b/test_cases/group_side_effects/puya.log index d5d045aa38..e6bd082947 100644 --- a/test_cases/group_side_effects/puya.log +++ b/test_cases/group_side_effects/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['group_side_effects'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['group_side_effects'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing group_side_effects/out/module.awst debug: Sealing block@0: // L12 @@ -1018,6 +1018,7 @@ debug: Inserted log_group_block@0.ops[30]: 'l-store-copy tmp%4#0 1' debug: Replaced log_group_block@0.ops[64]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 3 edge set/s for test_cases.group_side_effects.contract.AppExpectingEffects.__puya_arc4_router__ info: Writing group_side_effects/out/AppCall.arc32.json +info: Writing group_side_effects/out/AppCall.arc56.json info: Writing group_side_effects/out/AppCall.approval.teal info: Writing group_side_effects/out/AppCall.clear.teal info: Writing group_side_effects/out/AppCall.approval.bin @@ -1025,6 +1026,7 @@ info: Writing group_side_effects/out/AppCall.clear.bin info: Writing group_side_effects/out/AppCall.approval.puya.map info: Writing group_side_effects/out/AppCall.clear.puya.map info: Writing group_side_effects/out/AppExpectingEffects.arc32.json +info: Writing group_side_effects/out/AppExpectingEffects.arc56.json info: Writing group_side_effects/out/AppExpectingEffects.approval.teal info: Writing group_side_effects/out/AppExpectingEffects.clear.teal info: Writing group_side_effects/out/AppExpectingEffects.approval.bin diff --git a/test_cases/inheritance/puya.log b/test_cases/inheritance/puya.log index 256ce34449..386d4086b0 100644 --- a/test_cases/inheritance/puya.log +++ b/test_cases/inheritance/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inheritance'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inheritance'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inheritance/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.approval.mir b/test_cases/inner_transactions/out/ArrayAccessContract.approval.mir index 3ef137edab..3fcd25e602 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.approval.mir +++ b/test_cases/inner_transactions/out/ArrayAccessContract.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___test_branching_array_call_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // inner_transactions/array_access.py:20 // class ArrayAccessContract(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -55,7 +55,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%9#0 ! tmp%10#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.approval.teal b/test_cases/inner_transactions/out/ArrayAccessContract.approval.teal index ab2bff9f57..f82144cde6 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.approval.teal +++ b/test_cases/inner_transactions/out/ArrayAccessContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_branching_array_call_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // inner_transactions/array_access.py:20 // class ArrayAccessContract(ARC4Contract): txna ApplicationArgs 1 @@ -44,7 +44,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.arc32.json b/test_cases/inner_transactions/out/ArrayAccessContract.arc32.json index 8f8520b352..3422567f91 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.arc32.json +++ b/test_cases/inner_transactions/out/ArrayAccessContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrIDB4MDk4MTAxIDB4MzEgMHgzMiAweDMzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ODlhODIyMGEgLy8gbWV0aG9kICJ0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKGJvb2wpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYXJyYXlfYWNjZXNzLkFycmF5QWNjZXNzQ29udHJhY3QudGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbChtYXliZTogYnl0ZXMpIC0+IHZvaWQ6CnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGw6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxLTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKHNlbGYsIG1heWJlOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjMKICAgIC8vIGlmIG1heWJlOgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgIT0KICAgIGR1cAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxIiksIEJ5dGVzKGIiMiIpKSwKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI0CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsX2FmdGVyX2lmX2Vsc2VANQoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAtMzUKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGFwcF9hcmdzPShCeXRlcyhiIjMiKSwgQnl0ZXMoYiI0IiksIEJ5dGVzKGIiNSIpKSwKICAgIC8vICAgICBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM0CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMzCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICBieXRlY18zIC8vIDB4MzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDM1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMgogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMwLTM1CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICAvLyAgICAgbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNgogICAgLy8gaWYgbWF5YmU6CiAgICBmcmFtZV9kaWcgMAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlANwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNwogICAgLy8gYXNzZXJ0IGNyZWF0ZV9hcHBfdHhuLmFwcF9hcmdzKDApID09IGIiMSIsICJjb3JyZWN0IGFyZ3MgdXNlZCAxIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM4CiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMSkgPT0gYiIyIiwgImNvcnJlY3QgYXJncyB1c2VkIDIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDIKICAgIGIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDgKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfZWxzZV9ib2R5QDc6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQwCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMCkgPT0gYiIzIiwgImNvcnJlY3QgYXJncyB1c2VkIDEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMyAvLyAweDMzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6NDEKICAgIC8vIGFzc2VydCBjcmVhdGVfYXBwX3R4bi5hcHBfYXJncygxKSA9PSBiIjQiLCAiY29ycmVjdCBhcmdzIHVzZWQgMiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQyCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMikgPT0gYiI1IiwgImNvcnJlY3QgYXJncyB1c2VkIDMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MzUKICAgID09CiAgICBhc3NlcnQgLy8gY29ycmVjdCBhcmdzIHVzZWQgMwoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDg6CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrIDB4MDk4MTAxIDB4MzEgMHgzMiAweDMzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ODlhODIyMGEgLy8gbWV0aG9kICJ0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKGJvb2wpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjAKICAgIC8vIGNsYXNzIEFycmF5QWNjZXNzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjAKICAgIC8vIGNsYXNzIEFycmF5QWNjZXNzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYXJyYXlfYWNjZXNzLkFycmF5QWNjZXNzQ29udHJhY3QudGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbChtYXliZTogYnl0ZXMpIC0+IHZvaWQ6CnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGw6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxLTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKHNlbGYsIG1heWJlOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjMKICAgIC8vIGlmIG1heWJlOgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgIT0KICAgIGR1cAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxIiksIEJ5dGVzKGIiMiIpKSwKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI0CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsX2FmdGVyX2lmX2Vsc2VANQoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAtMzUKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGFwcF9hcmdzPShCeXRlcyhiIjMiKSwgQnl0ZXMoYiI0IiksIEJ5dGVzKGIiNSIpKSwKICAgIC8vICAgICBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM0CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMzCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICBieXRlY18zIC8vIDB4MzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDM1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMgogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMwLTM1CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICAvLyAgICAgbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNgogICAgLy8gaWYgbWF5YmU6CiAgICBmcmFtZV9kaWcgMAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlANwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNwogICAgLy8gYXNzZXJ0IGNyZWF0ZV9hcHBfdHhuLmFwcF9hcmdzKDApID09IGIiMSIsICJjb3JyZWN0IGFyZ3MgdXNlZCAxIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM4CiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMSkgPT0gYiIyIiwgImNvcnJlY3QgYXJncyB1c2VkIDIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDIKICAgIGIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDgKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfZWxzZV9ib2R5QDc6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQwCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMCkgPT0gYiIzIiwgImNvcnJlY3QgYXJncyB1c2VkIDEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMyAvLyAweDMzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6NDEKICAgIC8vIGFzc2VydCBjcmVhdGVfYXBwX3R4bi5hcHBfYXJncygxKSA9PSBiIjQiLCAiY29ycmVjdCBhcmdzIHVzZWQgMiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQyCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMikgPT0gYiI1IiwgImNvcnJlY3QgYXJncyB1c2VkIDMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MzUKICAgID09CiAgICBhc3NlcnQgLy8gY29ycmVjdCBhcmdzIHVzZWQgMwoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDg6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json b/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json new file mode 100644 index 0000000000..bb8bf3ced6 --- /dev/null +++ b/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json @@ -0,0 +1,127 @@ +{ + "name": "ArrayAccessContract", + "structs": {}, + "methods": [ + { + "name": "test_branching_array_call", + "args": [ + { + "type": "bool", + "name": "maybe" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 48 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 68 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 51 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 169, + 184 + ], + "errorMessage": "correct args used 1" + }, + { + "pc": [ + 175, + 192 + ], + "errorMessage": "correct args used 2" + }, + { + "pc": [ + 200 + ], + "errorMessage": "correct args used 3" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrIDB4MDk4MTAxIDB4MzEgMHgzMiAweDMzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ODlhODIyMGEgLy8gbWV0aG9kICJ0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKGJvb2wpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjAKICAgIC8vIGNsYXNzIEFycmF5QWNjZXNzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjAKICAgIC8vIGNsYXNzIEFycmF5QWNjZXNzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYXJyYXlfYWNjZXNzLkFycmF5QWNjZXNzQ29udHJhY3QudGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbChtYXliZTogYnl0ZXMpIC0+IHZvaWQ6CnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGw6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxLTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKHNlbGYsIG1heWJlOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjMKICAgIC8vIGlmIG1heWJlOgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgIT0KICAgIGR1cAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxIiksIEJ5dGVzKGIiMiIpKSwKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI0CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsX2FmdGVyX2lmX2Vsc2VANQoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAtMzUKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGFwcF9hcmdzPShCeXRlcyhiIjMiKSwgQnl0ZXMoYiI0IiksIEJ5dGVzKGIiNSIpKSwKICAgIC8vICAgICBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM0CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMzCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICBieXRlY18zIC8vIDB4MzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDM1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMgogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMwLTM1CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICAvLyAgICAgbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNgogICAgLy8gaWYgbWF5YmU6CiAgICBmcmFtZV9kaWcgMAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlANwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNwogICAgLy8gYXNzZXJ0IGNyZWF0ZV9hcHBfdHhuLmFwcF9hcmdzKDApID09IGIiMSIsICJjb3JyZWN0IGFyZ3MgdXNlZCAxIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM4CiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMSkgPT0gYiIyIiwgImNvcnJlY3QgYXJncyB1c2VkIDIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDIKICAgIGIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDgKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfZWxzZV9ib2R5QDc6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQwCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMCkgPT0gYiIzIiwgImNvcnJlY3QgYXJncyB1c2VkIDEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMyAvLyAweDMzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6NDEKICAgIC8vIGFzc2VydCBjcmVhdGVfYXBwX3R4bi5hcHBfYXJncygxKSA9PSBiIjQiLCAiY29ycmVjdCBhcmdzIHVzZWQgMiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQyCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMikgPT0gYiI1IiwgImNvcnJlY3QgYXJncyB1c2VkIDMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MzUKICAgID09CiAgICBhc3NlcnQgLy8gY29ycmVjdCBhcmdzIHVzZWQgMwoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDg6CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEGJgQDCYEBATEBMgEziAABQ4oAATEbQQAegASJqCIKNhoAjgEAAiKJMRkURDEYRDYaAYgADyOJMRlAAAYxGBREI4kiiYoBAIv/gAEAE0lBABexKbIaKrIaKLJCKLJAJLIQIrIBs0IAMrGAE2RpZmZlcmVudCBwYXJhbSBzZXSyBSuyGoABNLIagAE1shooskIoskAkshAisgGziwBBAA+1GgApEkS1GgEqEkRCABa1GgArEkS1GgGAATQSRLUaAoABNRJEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.destructured.ir b/test_cases/inner_transactions/out/ArrayAccessContract.destructured.ir index ed27434020..a5f16f984d 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.destructured.ir +++ b/test_cases/inner_transactions/out/ArrayAccessContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -27,7 +27,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L20 return 0u diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.ir b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.ir index 122b3843ff..9cfae64800 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.ir +++ b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -33,7 +33,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.inner_transactions.array_access.ArrayAccessContract.__algopy_default_create() return 1u block@7: // switch_case_default_L20 diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_1.ir index dd2b92fd30..611cd14c29 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -27,7 +27,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L20 return 0u diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_2.ir index ed27434020..a5f16f984d 100644 --- a/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/ArrayAccessContract.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -27,7 +27,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L20 return 0u diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.approval.mir b/test_cases/inner_transactions/out/CreateAndTransferContract.approval.mir index 1d617e0e7b..8959c292eb 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.approval.mir +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___create_and_transfer_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub create_and_transfer int 1 1 retsub 1 @@ -50,7 +50,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%8#0 ! tmp%9#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.approval.teal b/test_cases/inner_transactions/out/CreateAndTransferContract.approval.teal index f124333094..782046babe 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.approval.teal +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___create_and_transfer_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub create_and_transfer intc_1 // 1 retsub @@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.arc32.json b/test_cases/inner_transactions/out/CreateAndTransferContract.arc32.json index 26ab9c28ab..ca061b4bac 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.arc32.json +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmFzc2V0X3RyYW5zZmVyLkNyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4NDhlOWVkN2MgLy8gbWV0aG9kICJjcmVhdGVfYW5kX3RyYW5zZmVyKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2FuZF90cmFuc2Zlcl9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfYW5kX3RyYW5zZmVyX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZV9hbmRfdHJhbnNmZXIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNyZWF0ZV9hbmRfdHJhbnNmZXIoKSAtPiB2b2lkOgpjcmVhdGVfYW5kX3RyYW5zZmVyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGNyZWF0ZV9hbmRfdHJhbnNmZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE1LTIzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEwMDAsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0idGVzdCIsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJUU1QiLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGNsYXdiYWNrPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMAogICAgLy8gbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMQogICAgLy8gY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE5CiAgICAvLyBkZWNpbWFscz0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBwdXNoYnl0ZXMgIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE3CiAgICAvLyBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIHB1c2hieXRlcyAidGVzdCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTYKICAgIC8vIHRvdGFsPTEwMDAsCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUtMjMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MTAwMCwKICAgIC8vICAgICBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIC8vICAgICB1bml0X25hbWU9IlRTVCIsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBtYW5hZ2VyPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToxNS0yNAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xMDAwLAogICAgLy8gICAgIGFzc2V0X25hbWU9InRlc3QiLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVFNUIiwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIG1hbmFnZXI9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MjkKICAgIC8vIGFzc2V0X3NlbmRlcj1uZXdfYXNzZXQuY3JlYXRvciwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weTozMAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MzEKICAgIC8vIGFzc2V0X2Ftb3VudD0xMDAwLAogICAgaW50Y18yIC8vIDEwMDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTI4CiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmFzc2V0X3RyYW5zZmVyLkNyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4NDhlOWVkN2MgLy8gbWV0aG9kICJjcmVhdGVfYW5kX3RyYW5zZmVyKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2FuZF90cmFuc2Zlcl9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfYW5kX3RyYW5zZmVyX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlX2FuZF90cmFuc2ZlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNyZWF0ZV9hbmRfdHJhbnNmZXIoKSAtPiB2b2lkOgpjcmVhdGVfYW5kX3RyYW5zZmVyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGNyZWF0ZV9hbmRfdHJhbnNmZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE1LTIzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEwMDAsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0idGVzdCIsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJUU1QiLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGNsYXdiYWNrPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMAogICAgLy8gbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMQogICAgLy8gY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE5CiAgICAvLyBkZWNpbWFscz0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBwdXNoYnl0ZXMgIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE3CiAgICAvLyBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIHB1c2hieXRlcyAidGVzdCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTYKICAgIC8vIHRvdGFsPTEwMDAsCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUtMjMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MTAwMCwKICAgIC8vICAgICBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIC8vICAgICB1bml0X25hbWU9IlRTVCIsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBtYW5hZ2VyPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToxNS0yNAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xMDAwLAogICAgLy8gICAgIGFzc2V0X25hbWU9InRlc3QiLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVFNUIiwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIG1hbmFnZXI9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MjkKICAgIC8vIGFzc2V0X3NlbmRlcj1uZXdfYXNzZXQuY3JlYXRvciwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weTozMAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MzEKICAgIC8vIGFzc2V0X2Ftb3VudD0xMDAwLAogICAgaW50Y18yIC8vIDEwMDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTI4CiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json b/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json new file mode 100644 index 0000000000..793cef198e --- /dev/null +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json @@ -0,0 +1,108 @@ +{ + "name": "CreateAndTransferContract", + "structs": {}, + "methods": [ + { + "name": "create_and_transfer", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 37 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 105 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 54 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 40 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmFzc2V0X3RyYW5zZmVyLkNyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4NDhlOWVkN2MgLy8gbWV0aG9kICJjcmVhdGVfYW5kX3RyYW5zZmVyKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2FuZF90cmFuc2Zlcl9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfYW5kX3RyYW5zZmVyX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlX2FuZF90cmFuc2ZlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNyZWF0ZV9hbmRfdHJhbnNmZXIoKSAtPiB2b2lkOgpjcmVhdGVfYW5kX3RyYW5zZmVyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGNyZWF0ZV9hbmRfdHJhbnNmZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE1LTIzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEwMDAsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0idGVzdCIsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJUU1QiLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGNsYXdiYWNrPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMAogICAgLy8gbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMQogICAgLy8gY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE5CiAgICAvLyBkZWNpbWFscz0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBwdXNoYnl0ZXMgIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE3CiAgICAvLyBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIHB1c2hieXRlcyAidGVzdCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTYKICAgIC8vIHRvdGFsPTEwMDAsCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUtMjMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MTAwMCwKICAgIC8vICAgICBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIC8vICAgICB1bml0X25hbWU9IlRTVCIsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBtYW5hZ2VyPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToxNS0yNAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xMDAwLAogICAgLy8gICAgIGFzc2V0X25hbWU9InRlc3QiLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVFNUIiwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIG1hbmFnZXI9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MjkKICAgIC8vIGFzc2V0X3NlbmRlcj1uZXdfYXNzZXQuY3JlYXRvciwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weTozMAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MzEKICAgIC8vIGFzc2V0X2Ftb3VudD0xMDAwLAogICAgaW50Y18yIC8vIDEwMDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTI4CiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAHoB4gAAUOKAAExG0EAG4AESOntfDYaAI4BAAIiiTEZFEQxGESIAA8jiTEZQAAGMRgURCOJIomKAACxMgpJsiyyKSKyI4ADVFNUsiWABHRlc3SyJiSyIoEDshAisgGztDyxSXELRDIKTwKyESSyErIUshOBBLIQIrIBs4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.destructured.ir b/test_cases/inner_transactions/out/CreateAndTransferContract.destructured.ir index 32591ce58c..106311ac03 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.destructured.ir +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@2: // create_and_transfer_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.create_and_transfer() return 1u block@5: // bare_routing_L10 @@ -26,7 +26,7 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L10 return 0u diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.ir b/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.ir index 22ea1bd8ca..1f8eed592f 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.ir +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@2: // create_and_transfer_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.create_and_transfer() return 1u block@3: // switch_case_default_L10 @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.__algopy_default_create() return 1u block@7: // switch_case_default_L10 diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.opt_pass_1.ir index 32591ce58c..106311ac03 100644 --- a/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@2: // create_and_transfer_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.create_and_transfer() return 1u block@5: // bare_routing_L10 @@ -26,7 +26,7 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L10 return 0u diff --git a/test_cases/inner_transactions/out/FieldTupleContract.approval.mir b/test_cases/inner_transactions/out/FieldTupleContract.approval.mir index 0d1c782126..44d9831e39 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.approval.mir +++ b/test_cases/inner_transactions/out/FieldTupleContract.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___test_assign_tuple_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple int 1 1 retsub 1 @@ -46,9 +46,9 @@ __puya_arc4_router___test_assign_tuple_mixed_route@3: // @arc4.abimethod txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple_mixed int 1 1 retsub 1 @@ -63,7 +63,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%12#0 ! tmp%13#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/inner_transactions/out/FieldTupleContract.approval.teal b/test_cases/inner_transactions/out/FieldTupleContract.approval.teal index 68a7dee93d..d23e0bd938 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.approval.teal +++ b/test_cases/inner_transactions/out/FieldTupleContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_assign_tuple_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple intc_3 // 1 retsub @@ -37,9 +37,9 @@ __puya_arc4_router___test_assign_tuple_mixed_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple_mixed intc_3 // 1 retsub @@ -51,7 +51,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_3 // 1 retsub diff --git a/test_cases/inner_transactions/out/FieldTupleContract.arc32.json b/test_cases/inner_transactions/out/FieldTupleContract.arc32.json index a382f01985..b90a92b86c 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.arc32.json +++ b/test_cases/inner_transactions/out/FieldTupleContract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgNSA2IDEKICAgIGJ5dGVjYmxvY2sgMHgwOTgxMDEgMHgzMTYxIDB4MzI2MSAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0IDB4Njg2NTZjNmM2ZiAweDc3NmY3MjZjNjQgMHgzMzYxIDB4MzQ2MSAweDM1NjEgMHgzMzYyIDB4MzQ2MiAweDM1NjIgMHgzMTYyIDB4MzI2MiAweDMxNjMgMHgzMjYzIDB4MzM2MyAweDM0NjMgMHgzNTYzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDFjYTJjMDdlIDB4ZWM2Y2QwYTggLy8gbWV0aG9kICJ0ZXN0X2Fzc2lnbl90dXBsZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXNzaWduX3R1cGxlCiAgICBpbnRjXzMgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9taXhlZF9yb3V0ZUAzOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZAogICAgaW50Y18zIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18zIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI0CiAgICAvLyBjbGFzcyBGaWVsZFR1cGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC50ZXN0X2Fzc2lnbl90dXBsZSgpIC0+IHZvaWQ6CnRlc3RfYXNzaWduX3R1cGxlOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYXNzaWduX3R1cGxlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM4CiAgICAvLyBVSW50NjQoNDIpLAogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzkKICAgIC8vIFRydWUsCiAgICBpbnRjXzMgLy8gMQogICAgaXRvYgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzMKICAgIC8vIEJ5dGVzKGIiMWEiKSwKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzQKICAgIC8vIEJ5dGVzKGIiMmEiKSwKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzUKICAgIC8vIGIiaGVsbG8iLAogICAgYnl0ZWMgNCAvLyAweDY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNgogICAgLy8gIndvcmxkIiwKICAgIGJ5dGVjIDUgLy8gIndvcmxkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM3CiAgICAvLyBTdHJpbmcoIiEiKSwKICAgIHB1c2hieXRlcyAiISIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzAKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI5CiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NwogICAgLy8gbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgYnl0ZWNfMyAvLyAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ2CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzYSIpLCBCeXRlcyhiIjRhIiksIEJ5dGVzKGIiNWEiKSksCiAgICBieXRlYyA2IC8vIDB4MzM2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDcgLy8gMHgzNDYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDM1NjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjUyCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMCkgPT0gYiIxYSIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlY18xIC8vIDB4MzE2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTMKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygxKSA9PSBiIjJhIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1NAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDIpID09IGIiaGVsbG8iCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnl0ZWMgNCAvLyAweDY4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU1CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMykgPT0gYiJ3b3JsZCIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAzCiAgICBieXRlYyA1IC8vIDB4Nzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTYKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncyg0KSA9PSBiIiEiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgNAogICAgcHVzaGJ5dGVzIDB4MjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU3CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoNSkgPT0gb3AuaXRvYig0MikKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1OAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDYpID09IG9wLml0b2IoMSkKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA2CiAgICBpbnRjXzMgLy8gMQogICAgaXRvYgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTkKICAgIC8vIGFzc2VydCB0eG5fMi5hcHBfYXJncygwKSA9PSBiIjNhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjIDYgLy8gMHgzMzYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2MAogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDEpID09IGIiNGEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgNyAvLyAweDM0NjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjYxCiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMikgPT0gYiI1YSIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyA4IC8vIDB4MzU2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDcKICAgIC8vIG5vdGU9YiJkaWZmZXJlbnQgcGFyYW0gc2V0IiwKICAgIGJ5dGVjXzMgLy8gMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2NAogICAgLy8gY3JlYXRlX3R4bnNbMV0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjNiIiksIEJ5dGVzKGIiNGIiKSwgQnl0ZXMoYiI1YiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgzMzYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTAgLy8gMHgzNDYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgzNTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDUKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ0CiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MwogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY2CiAgICAvLyB0eG5fMSwgdHhuXzIgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzFdLCBjcmVhdGVfdHhuc1swXSkKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjMKICAgIC8vIGNyZWF0ZV90eG5zWzBdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIxYiIpLCBCeXRlcyhiIjJiIikpKQogICAgYnl0ZWMgMTIgLy8gMHgzMTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgzMjYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY2CiAgICAvLyB0eG5fMSwgdHhuXzIgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzFdLCBjcmVhdGVfdHhuc1swXSkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2OAogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDApID09IGIiMWIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgMTIgLy8gMHgzMTYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2OQogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDEpID09IGIiMmIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTMgLy8gMHgzMjYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3MAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDApID09IGIiM2IiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgOSAvLyAweDMzNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcxCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMSkgPT0gYiI0YiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxMCAvLyAweDM0NjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcyCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMikgPT0gYiI1YiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyAxMSAvLyAweDM1NjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc3CiAgICAvLyB0eG5fdHVwbGUgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzBdLCBjcmVhdGVfdHhuc1sxXSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc0CiAgICAvLyBjcmVhdGVfdHhuc1swXS5zZXQoYXBwX2FyZ3M9KEJ5dGVzKGIiMWMiKSwgQnl0ZXMoYiIyYyIpKSkKICAgIGJ5dGVjIDE0IC8vIDB4MzE2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE1IC8vIDB4MzI2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NwogICAgLy8gdHhuX3R1cGxlID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ3CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBieXRlY18zIC8vIDB4NjQ2OTY2NjY2NTcyNjU2ZTc0MjA3MDYxNzI2MTZkMjA3MzY1NzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzUKICAgIC8vIGNyZWF0ZV90eG5zWzFdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIzYyIpLCBCeXRlcyhiIjRjIiksIEJ5dGVzKGIiNWMiKSkpCiAgICBieXRlYyAxNiAvLyAweDMzNjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxNyAvLyAweDM0NjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxOCAvLyAweDM1NjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzcKICAgIC8vIHR4bl90dXBsZSA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc5CiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzBdLmFwcF9hcmdzKDApID09IGIiMWMiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgMTQgLy8gMHgzMTYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MAogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVswXS5hcHBfYXJncygxKSA9PSBiIjJjIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjIDE1IC8vIDB4MzI2MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODEKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMV0uYXBwX2FyZ3MoMCkgPT0gYiIzYyIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxNiAvLyAweDMzNjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgyCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzFdLmFwcF9hcmdzKDEpID09IGIiNGMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTcgLy8gMHgzNDYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MwogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVsxXS5hcHBfYXJncygyKSA9PSBiIjVjIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDE4IC8vIDB4MzU2MwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuZmllbGRfdHVwbGVfYXNzaWdubWVudC5GaWVsZFR1cGxlQ29udHJhY3QudGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKSAtPiB2b2lkOgp0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojg1LTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5NgogICAgLy8gcmVzdWx0X3dpdGhfdHhuID0gdHVwbGVfd2l0aF90eG5fZmllbGRzWzBdLnN1Ym1pdCgpLCB0dXBsZV93aXRoX3R4bl9maWVsZHNbMV0KICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkyCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxYSIpLCBCeXRlcyhiIjJhIikpLAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18yIC8vIDB4MzI2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5MAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4OAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5NgogICAgLy8gcmVzdWx0X3dpdGhfdHhuID0gdHVwbGVfd2l0aF90eG5fZmllbGRzWzBdLnN1Ym1pdCgpLCB0dXBsZV93aXRoX3R4bl9maWVsZHNbMV0KICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5OAogICAgLy8gYXNzZXJ0IHJlc3VsdF93aXRoX3R4blswXS5hcHBfYXJncygwKSA9PSBiIjFhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5OQogICAgLy8gYXNzZXJ0IHJlc3VsdF93aXRoX3R4blswXS5hcHBfYXJncygxKSA9PSBiIjJhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgNSA2IDEKICAgIGJ5dGVjYmxvY2sgMHgwOTgxMDEgMHgzMTYxIDB4MzI2MSAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0IDB4Njg2NTZjNmM2ZiAweDc3NmY3MjZjNjQgMHgzMzYxIDB4MzQ2MSAweDM1NjEgMHgzMzYyIDB4MzQ2MiAweDM1NjIgMHgzMTYyIDB4MzI2MiAweDMxNjMgMHgzMjYzIDB4MzM2MyAweDM0NjMgMHgzNTYzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDFjYTJjMDdlIDB4ZWM2Y2QwYTggLy8gbWV0aG9kICJ0ZXN0X2Fzc2lnbl90dXBsZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hc3NpZ25fdHVwbGUKICAgIGludGNfMyAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDM6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQKICAgIGludGNfMyAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjQKICAgIC8vIGNsYXNzIEZpZWxkVHVwbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzMgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjQKICAgIC8vIGNsYXNzIEZpZWxkVHVwbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQuRmllbGRUdXBsZUNvbnRyYWN0LnRlc3RfYXNzaWduX3R1cGxlKCkgLT4gdm9pZDoKdGVzdF9hc3NpZ25fdHVwbGU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9hc3NpZ25fdHVwbGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzgKICAgIC8vIFVJbnQ2NCg0MiksCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozOQogICAgLy8gVHJ1ZSwKICAgIGludGNfMyAvLyAxCiAgICBpdG9iCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMwogICAgLy8gQnl0ZXMoYiIxYSIpLAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNAogICAgLy8gQnl0ZXMoYiIyYSIpLAogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNQogICAgLy8gYiJoZWxsbyIsCiAgICBieXRlYyA0IC8vIDB4Njg2NTZjNmM2ZgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM2CiAgICAvLyAid29ybGQiLAogICAgYnl0ZWMgNSAvLyAid29ybGQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzcKICAgIC8vIFN0cmluZygiISIpLAogICAgcHVzaGJ5dGVzICIhIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ3CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBieXRlY18zIC8vIDB4NjQ2OTY2NjY2NTcyNjU2ZTc0MjA3MDYxNzI2MTZkMjA3MzY1NzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDYKICAgIC8vIGFwcF9hcmdzPShCeXRlcyhiIjNhIiksIEJ5dGVzKGIiNGEiKSwgQnl0ZXMoYiI1YSIpKSwKICAgIGJ5dGVjIDYgLy8gMHgzMzYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNyAvLyAweDM0NjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MzU2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDMKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTIKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygwKSA9PSBiIjFhIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MwogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDEpID09IGIiMmEiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU0CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMikgPT0gYiJoZWxsbyIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyA0IC8vIDB4Njg2NTZjNmM2ZgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTUKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygzKSA9PSBiIndvcmxkIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ5dGVjIDUgLy8gMHg3NzZmNzI2YzY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1NgogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDQpID09IGIiISIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA0CiAgICBwdXNoYnl0ZXMgMHgyMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTcKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncyg1KSA9PSBvcC5pdG9iKDQyKQogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU4CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoNikgPT0gb3AuaXRvYigxKQogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDYKICAgIGludGNfMyAvLyAxCiAgICBpdG9iCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1OQogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDApID09IGIiM2EiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgNiAvLyAweDMzNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjYwCiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMSkgPT0gYiI0YSIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyA3IC8vIDB4MzQ2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjEKICAgIC8vIGFzc2VydCB0eG5fMi5hcHBfYXJncygyKSA9PSBiIjVhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDggLy8gMHgzNTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2NgogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1sxXSwgY3JlYXRlX3R4bnNbMF0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NwogICAgLy8gbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgYnl0ZWNfMyAvLyAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY0CiAgICAvLyBjcmVhdGVfdHhuc1sxXS5zZXQoYXBwX2FyZ3M9KEJ5dGVzKGIiM2IiKSwgQnl0ZXMoYiI0YiIpLCBCeXRlcyhiIjViIikpKQogICAgYnl0ZWMgOSAvLyAweDMzNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDM0NjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDM1NjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2MwogICAgLy8gY3JlYXRlX3R4bnNbMF0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjFiIiksIEJ5dGVzKGIiMmIiKSkpCiAgICBieXRlYyAxMiAvLyAweDMxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMyAvLyAweDMyNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzAKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI5CiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY4CiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMCkgPT0gYiIxYiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxMiAvLyAweDMxNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY5CiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMSkgPT0gYiIyYiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxMyAvLyAweDMyNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcwCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMCkgPT0gYiIzYiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyA5IC8vIDB4MzM2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzEKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygxKSA9PSBiIjRiIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjIDEwIC8vIDB4MzQ2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzIKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygyKSA9PSBiIjViIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDExIC8vIDB4MzU2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzcKICAgIC8vIHR4bl90dXBsZSA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzQKICAgIC8vIGNyZWF0ZV90eG5zWzBdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIxYyIpLCBCeXRlcyhiIjJjIikpKQogICAgYnl0ZWMgMTQgLy8gMHgzMTYzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTUgLy8gMHgzMjYzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc3CiAgICAvLyB0eG5fdHVwbGUgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzBdLCBjcmVhdGVfdHhuc1sxXSkKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDcKICAgIC8vIG5vdGU9YiJkaWZmZXJlbnQgcGFyYW0gc2V0IiwKICAgIGJ5dGVjXzMgLy8gMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NQogICAgLy8gY3JlYXRlX3R4bnNbMV0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjNjIiksIEJ5dGVzKGIiNGMiKSwgQnl0ZXMoYiI1YyIpKSkKICAgIGJ5dGVjIDE2IC8vIDB4MzM2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE3IC8vIDB4MzQ2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE4IC8vIDB4MzU2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDMKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NwogICAgLy8gdHhuX3R1cGxlID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzkKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMF0uYXBwX2FyZ3MoMCkgPT0gYiIxYyIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxNCAvLyAweDMxNjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzBdLmFwcF9hcmdzKDEpID09IGIiMmMiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTUgLy8gMHgzMjYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MQogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVsxXS5hcHBfYXJncygwKSA9PSBiIjNjIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjIDE2IC8vIDB4MzM2MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODIKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMV0uYXBwX2FyZ3MoMSkgPT0gYiI0YyIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxNyAvLyAweDM0NjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgzCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzFdLmFwcF9hcmdzKDIpID09IGIiNWMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnl0ZWMgMTggLy8gMHgzNTYzCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC50ZXN0X2Fzc2lnbl90dXBsZV9taXhlZCgpIC0+IHZvaWQ6CnRlc3RfYXNzaWduX3R1cGxlX21peGVkOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODUtODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYXNzaWduX3R1cGxlX21peGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk2CiAgICAvLyByZXN1bHRfd2l0aF90eG4gPSB0dXBsZV93aXRoX3R4bl9maWVsZHNbMF0uc3VibWl0KCksIHR1cGxlX3dpdGhfdHhuX2ZpZWxkc1sxXQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6OTIKICAgIC8vIGFwcF9hcmdzPShCeXRlcyhiIjFhIiksIEJ5dGVzKGIiMmEiKSksCiAgICBieXRlY18xIC8vIDB4MzE2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6OTEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4OQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojg4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk2CiAgICAvLyByZXN1bHRfd2l0aF90eG4gPSB0dXBsZV93aXRoX3R4bl9maWVsZHNbMF0uc3VibWl0KCksIHR1cGxlX3dpdGhfdHhuX2ZpZWxkc1sxXQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk4CiAgICAvLyBhc3NlcnQgcmVzdWx0X3dpdGhfdHhuWzBdLmFwcF9hcmdzKDApID09IGIiMWEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk5CiAgICAvLyBhc3NlcnQgcmVzdWx0X3dpdGhfdHhuWzBdLmFwcF9hcmdzKDEpID09IGIiMmEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/inner_transactions/out/FieldTupleContract.arc56.json b/test_cases/inner_transactions/out/FieldTupleContract.arc56.json new file mode 100644 index 0000000000..fe224e6cfa --- /dev/null +++ b/test_cases/inner_transactions/out/FieldTupleContract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "FieldTupleContract", + "structs": {}, + "methods": [ + { + "name": "test_assign_tuple", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_assign_tuple_mixed", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 128, + 140 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 157 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 131, + 143 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgNSA2IDEKICAgIGJ5dGVjYmxvY2sgMHgwOTgxMDEgMHgzMTYxIDB4MzI2MSAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0IDB4Njg2NTZjNmM2ZiAweDc3NmY3MjZjNjQgMHgzMzYxIDB4MzQ2MSAweDM1NjEgMHgzMzYyIDB4MzQ2MiAweDM1NjIgMHgzMTYyIDB4MzI2MiAweDMxNjMgMHgzMjYzIDB4MzM2MyAweDM0NjMgMHgzNTYzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDFjYTJjMDdlIDB4ZWM2Y2QwYTggLy8gbWV0aG9kICJ0ZXN0X2Fzc2lnbl90dXBsZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hc3NpZ25fdHVwbGUKICAgIGludGNfMyAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDM6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQKICAgIGludGNfMyAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjQKICAgIC8vIGNsYXNzIEZpZWxkVHVwbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzMgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjQKICAgIC8vIGNsYXNzIEZpZWxkVHVwbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQuRmllbGRUdXBsZUNvbnRyYWN0LnRlc3RfYXNzaWduX3R1cGxlKCkgLT4gdm9pZDoKdGVzdF9hc3NpZ25fdHVwbGU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9hc3NpZ25fdHVwbGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzgKICAgIC8vIFVJbnQ2NCg0MiksCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozOQogICAgLy8gVHJ1ZSwKICAgIGludGNfMyAvLyAxCiAgICBpdG9iCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMwogICAgLy8gQnl0ZXMoYiIxYSIpLAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNAogICAgLy8gQnl0ZXMoYiIyYSIpLAogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNQogICAgLy8gYiJoZWxsbyIsCiAgICBieXRlYyA0IC8vIDB4Njg2NTZjNmM2ZgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM2CiAgICAvLyAid29ybGQiLAogICAgYnl0ZWMgNSAvLyAid29ybGQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzcKICAgIC8vIFN0cmluZygiISIpLAogICAgcHVzaGJ5dGVzICIhIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ3CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBieXRlY18zIC8vIDB4NjQ2OTY2NjY2NTcyNjU2ZTc0MjA3MDYxNzI2MTZkMjA3MzY1NzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDYKICAgIC8vIGFwcF9hcmdzPShCeXRlcyhiIjNhIiksIEJ5dGVzKGIiNGEiKSwgQnl0ZXMoYiI1YSIpKSwKICAgIGJ5dGVjIDYgLy8gMHgzMzYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNyAvLyAweDM0NjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MzU2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDMKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MAogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTIKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygwKSA9PSBiIjFhIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1MwogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDEpID09IGIiMmEiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU0CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMikgPT0gYiJoZWxsbyIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyA0IC8vIDB4Njg2NTZjNmM2ZgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTUKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygzKSA9PSBiIndvcmxkIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ5dGVjIDUgLy8gMHg3NzZmNzI2YzY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1NgogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDQpID09IGIiISIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA0CiAgICBwdXNoYnl0ZXMgMHgyMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTcKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncyg1KSA9PSBvcC5pdG9iKDQyKQogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU4CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoNikgPT0gb3AuaXRvYigxKQogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDYKICAgIGludGNfMyAvLyAxCiAgICBpdG9iCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1OQogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDApID09IGIiM2EiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgNiAvLyAweDMzNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjYwCiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMSkgPT0gYiI0YSIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyA3IC8vIDB4MzQ2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjEKICAgIC8vIGFzc2VydCB0eG5fMi5hcHBfYXJncygyKSA9PSBiIjVhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDggLy8gMHgzNTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2NgogICAgLy8gdHhuXzEsIHR4bl8yID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1sxXSwgY3JlYXRlX3R4bnNbMF0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NwogICAgLy8gbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgYnl0ZWNfMyAvLyAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY0CiAgICAvLyBjcmVhdGVfdHhuc1sxXS5zZXQoYXBwX2FyZ3M9KEJ5dGVzKGIiM2IiKSwgQnl0ZXMoYiI0YiIpLCBCeXRlcyhiIjViIikpKQogICAgYnl0ZWMgOSAvLyAweDMzNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDM0NjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDM1NjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2MwogICAgLy8gY3JlYXRlX3R4bnNbMF0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjFiIiksIEJ5dGVzKGIiMmIiKSkpCiAgICBieXRlYyAxMiAvLyAweDMxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMyAvLyAweDMyNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzAKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI5CiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY4CiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMCkgPT0gYiIxYiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxMiAvLyAweDMxNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY5CiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMSkgPT0gYiIyYiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxMyAvLyAweDMyNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcwCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMCkgPT0gYiIzYiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyA5IC8vIDB4MzM2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzEKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygxKSA9PSBiIjRiIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjIDEwIC8vIDB4MzQ2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzIKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygyKSA9PSBiIjViIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDExIC8vIDB4MzU2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzcKICAgIC8vIHR4bl90dXBsZSA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzQKICAgIC8vIGNyZWF0ZV90eG5zWzBdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIxYyIpLCBCeXRlcyhiIjJjIikpKQogICAgYnl0ZWMgMTQgLy8gMHgzMTYzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTUgLy8gMHgzMjYzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc3CiAgICAvLyB0eG5fdHVwbGUgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzBdLCBjcmVhdGVfdHhuc1sxXSkKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDcKICAgIC8vIG5vdGU9YiJkaWZmZXJlbnQgcGFyYW0gc2V0IiwKICAgIGJ5dGVjXzMgLy8gMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NQogICAgLy8gY3JlYXRlX3R4bnNbMV0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjNjIiksIEJ5dGVzKGIiNGMiKSwgQnl0ZXMoYiI1YyIpKSkKICAgIGJ5dGVjIDE2IC8vIDB4MzM2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE3IC8vIDB4MzQ2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE4IC8vIDB4MzU2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDMKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NwogICAgLy8gdHhuX3R1cGxlID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzkKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMF0uYXBwX2FyZ3MoMCkgPT0gYiIxYyIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxNCAvLyAweDMxNjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgwCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzBdLmFwcF9hcmdzKDEpID09IGIiMmMiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTUgLy8gMHgzMjYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MQogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVsxXS5hcHBfYXJncygwKSA9PSBiIjNjIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjIDE2IC8vIDB4MzM2MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODIKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMV0uYXBwX2FyZ3MoMSkgPT0gYiI0YyIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxNyAvLyAweDM0NjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgzCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzFdLmFwcF9hcmdzKDIpID09IGIiNWMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnl0ZWMgMTggLy8gMHgzNTYzCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC50ZXN0X2Fzc2lnbl90dXBsZV9taXhlZCgpIC0+IHZvaWQ6CnRlc3RfYXNzaWduX3R1cGxlX21peGVkOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODUtODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYXNzaWduX3R1cGxlX21peGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk2CiAgICAvLyByZXN1bHRfd2l0aF90eG4gPSB0dXBsZV93aXRoX3R4bl9maWVsZHNbMF0uc3VibWl0KCksIHR1cGxlX3dpdGhfdHhuX2ZpZWxkc1sxXQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6OTIKICAgIC8vIGFwcF9hcmdzPShCeXRlcyhiIjFhIiksIEJ5dGVzKGIiMmEiKSksCiAgICBieXRlY18xIC8vIDB4MzE2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6OTEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4OQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojg4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk2CiAgICAvLyByZXN1bHRfd2l0aF90eG4gPSB0dXBsZV93aXRoX3R4bl9maWVsZHNbMF0uc3VibWl0KCksIHR1cGxlX3dpdGhfdHhuX2ZpZWxkc1sxXQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk4CiAgICAvLyBhc3NlcnQgcmVzdWx0X3dpdGhfdHhuWzBdLmFwcF9hcmdzKDApID09IGIiMWEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojk5CiAgICAvLyBhc3NlcnQgcmVzdWx0X3dpdGhfdHhuWzBdLmFwcF9hcmdzKDEpID09IGIiMmEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyNjEKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAAUGASYTAwmBAQIxYQIyYRNkaWZmZXJlbnQgcGFyYW0gc2V0BWhlbGxvBXdvcmxkAjNhAjRhAjVhAjNiAjRiAjViAjFiAjJiAjFjAjJjAjNjAjRjAjVjiAABQ4oAATEbQQAvggIEHKLAfgTsbNCoNhoAjgIAAgAOIokxGRREMRhEiAAbJYkxGRREMRhEiAFmJYkxGUAABjEYFEQliSKJigAAgSoWJRaxKbIaKrIaJwSyGicFshqAASGyGksBshqyGiOyGSiyQiiyQCSyECKyAbYrsgUnBrIaJweyGicIshojshkoskIoskAkshAisgGzuAAaACkSRLgAGgEqEkS4ABoCJwQSRLgAGgMnBRJEuAAaBIABIRJEuAAaBRJEuAAaBiUWEkS1GgAnBhJEtRoBJwcSRLUaAicIEkSxK7IFJwmyGicKshonC7IaI7IZKLJCKLJAJLIQIrIBticMshonDbIaI7IZKLJCKLJAJLIQIrIBs7UaACcMEkS1GgEnDRJEuAAaACcJEkS4ABoBJwoSRLgAGgInCxJEsScOshonD7IaI7IZKLJCKLJAJLIQIrIBtiuyBScQshonEbIaJxKyGiOyGSiyQiiyQCSyECKyAbO4ABoAJw4SRLgAGgEnDxJEtRoAJxASRLUaAScREkS1GgInEhJEiYoAALEpshoqshojshkoskIoskAkshAisgGztRoAKRJEtRoBKhJEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/FieldTupleContract.destructured.ir b/test_cases/inner_transactions/out/FieldTupleContract.destructured.ir index 082f827c84..61c5ccaabf 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.destructured.ir +++ b/test_cases/inner_transactions/out/FieldTupleContract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@6: // bare_routing_L24 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L24 return 0u diff --git a/test_cases/inner_transactions/out/FieldTupleContract.ssa.ir b/test_cases/inner_transactions/out/FieldTupleContract.ssa.ir index 79e1704b4a..7f0fc9238f 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.ssa.ir +++ b/test_cases/inner_transactions/out/FieldTupleContract.ssa.ir @@ -16,19 +16,19 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@4: // switch_case_default_L24 @@ -41,7 +41,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (== tmp%12#0 0u) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.__algopy_default_create() return 1u block@8: // switch_case_default_L24 diff --git a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_1.ir index 135744438a..658c8c13ca 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_1.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@6: // bare_routing_L24 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L24 return 0u diff --git a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_2.ir index 51db026700..4d8ac19462 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_2.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@6: // bare_routing_L24 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L24 return 0u diff --git a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_3.ir b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_3.ir index 082f827c84..61c5ccaabf 100644 --- a/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_3.ir +++ b/test_cases/inner_transactions/out/FieldTupleContract.ssa.opt_pass_3.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@6: // bare_routing_L24 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L24 return 0u diff --git a/test_cases/inner_transactions/out/Greeter.approval.mir b/test_cases/inner_transactions/out/Greeter.approval.mir index 7ac339ff5e..491f9a8a50 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.mir +++ b/test_cases/inner_transactions/out/Greeter.approval.mir @@ -58,9 +58,9 @@ __puya_arc4_router___bootstrap_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub bootstrap to_encode%0#0 itob val_as_bytes%0#0 byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 @@ -75,9 +75,9 @@ __puya_arc4_router___log_greetings_route@3: // @arc4.abimethod() txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating // inner_transactions/c2c.py:6 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%12#0 @@ -97,7 +97,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%14#0 ! tmp%15#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/inner_transactions/out/Greeter.approval.teal b/test_cases/inner_transactions/out/Greeter.approval.teal index 6adb538e1a..85cf32ec34 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.teal +++ b/test_cases/inner_transactions/out/Greeter.approval.teal @@ -43,9 +43,9 @@ __puya_arc4_router___bootstrap_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub bootstrap itob bytec_1 // 0x151f7c75 @@ -60,9 +60,9 @@ __puya_arc4_router___log_greetings_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // inner_transactions/c2c.py:6 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -79,7 +79,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out/Greeter.arc32.json b/test_cases/inner_transactions/out/Greeter.arc32.json index 785dceee79..c147743d57 100644 --- a/test_cases/inner_transactions/out/Greeter.arc32.json +++ b/test_cases/inner_transactions/out/Greeter.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrICJoZWxsb19hcHAiIDB4MTUxZjdjNzUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6OAogICAgLy8gc2VsZi5oZWxsb19hcHAgPSBBcHBsaWNhdGlvbigpCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg3ODZiNjI5MSAweDMzZmI1ZDQ4IC8vIG1ldGhvZCAiYm9vdHN0cmFwKCl1aW50NjQiLCBtZXRob2QgImxvZ19ncmVldGluZ3Moc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JlZXRpbmdzX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JlZXRpbmdzX3JvdXRlQDM6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBsb2dfZ3JlZXRpbmdzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5ib290c3RyYXAoKSAtPiB1aW50NjQ6CmJvb3RzdHJhcDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmhlbGxvX2FwcCwgImFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE2CiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgcHVzaGJ5dGVzIDB4MGE4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIHB1c2hieXRlcyAweDBhMjAwMTAxMzExYjQxMDAyNjgwMDQwMmJlY2UxMTM2MWEwMDhlMDEwMDAxMDAzMTE5MTQ0NDMxMTg0NDM2MWEwMTg4MDAxNTgwMDQxNTFmN2M3NTRjNTBiMDIyNDMzMTE5MTQ0NDMxMTgxNDQ0MjI0MzhhMDEwMThiZmY1NzAyMDA4MDA3NDg2NTZjNmM2ZjJjMjA0YzUwNDkxNTE2NTcwNjAwNGM1MDg5CiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE0CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMwogICAgLy8gc2VsZi5oZWxsb19hcHAgPSAoCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE0LTE5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1IRUxMT19XT1JMRF9DTEVBUiwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzLTIwCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIC8vICAgICBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hcHAKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjIxCiAgICAvLyByZXR1cm4gc2VsZi5oZWxsb19hcHAuaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGVsbG9fYXBwIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIubG9nX2dyZWV0aW5ncyhuYW1lOiBieXRlcykgLT4gdm9pZDoKbG9nX2dyZWV0aW5nczoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjMtMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgbG9nX2dyZWV0aW5ncyhzZWxmLCBuYW1lOiBhcmM0LlN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNS0yOAogICAgLy8gaGVsbG9fY2FsbCA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiaGVsbG8oc3RyaW5nKXN0cmluZyIpLCBuYW1lKSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYKICAgIC8vIGFwcF9pZD1zZWxmLmhlbGxvX2FwcCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGVsbG9fYXBwIGV4aXN0cwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI1CiAgICAvLyBoZWxsb19jYWxsID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI1LTI4CiAgICAvLyBoZWxsb19jYWxsID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyOQogICAgLy8gZ3JlZXRpbmcgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyhoZWxsb19jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTozMAogICAgLy8gbG9nKCJIZWxsb1dvcmxkIHJldHVybmVkOiAiLCBncmVldGluZy5uYXRpdmUpCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzICJIZWxsb1dvcmxkIHJldHVybmVkOiAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrICJoZWxsb19hcHAiIDB4MTUxZjdjNzUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6OAogICAgLy8gc2VsZi5oZWxsb19hcHAgPSBBcHBsaWNhdGlvbigpCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg3ODZiNjI5MSAweDMzZmI1ZDQ4IC8vIG1ldGhvZCAiYm9vdHN0cmFwKCl1aW50NjQiLCBtZXRob2QgImxvZ19ncmVldGluZ3Moc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JlZXRpbmdzX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncmVldGluZ3Nfcm91dGVAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbG9nX2dyZWV0aW5ncwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLmJvb3RzdHJhcCgpIC0+IHVpbnQ2NDoKYm9vdHN0cmFwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaGVsbG9fYXBwLCAiYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaGVsbG9fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhlbGxvX2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICBwdXNoYnl0ZXMgMHgwYTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgcHVzaGJ5dGVzIDB4MGEyMDAxMDEzMTFiNDEwMDI2ODAwNDAyYmVjZTExMzYxYTAwOGUwMTAwMDEwMDMxMTkxNDQ0MzExODQ0MzYxYTAxODgwMDE1ODAwNDE1MWY3Yzc1NGM1MGIwMjI0MzMxMTkxNDQ0MzExODE0NDQyMjQzOGEwMTAxOGJmZjU3MDIwMDgwMDc0ODY1NmM2YzZmMmMyMDRjNTA0OTE1MTY1NzA2MDA0YzUwODkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTMtMjAKICAgIC8vIHNlbGYuaGVsbG9fYXBwID0gKAogICAgLy8gICAgIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2FwcAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjEKICAgIC8vIHJldHVybiBzZWxmLmhlbGxvX2FwcC5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5sb2dfZ3JlZXRpbmdzKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfZ3JlZXRpbmdzOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBsb2dfZ3JlZXRpbmdzKHNlbGYsIG5hbWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI1LTI4CiAgICAvLyBoZWxsb19jYWxsID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNgogICAgLy8gYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiaGVsbG8oc3RyaW5nKXN0cmluZyIpLCBuYW1lKSwKICAgIHB1c2hieXRlcyAweDAyYmVjZTExIC8vIG1ldGhvZCAiaGVsbG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUtMjgKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI5CiAgICAvLyBncmVldGluZyA9IGFyYzQuU3RyaW5nLmZyb21fbG9nKGhlbGxvX2NhbGwubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMwCiAgICAvLyBsb2coIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIsIGdyZWV0aW5nLm5hdGl2ZSkKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/inner_transactions/out/Greeter.arc56.json b/test_cases/inner_transactions/out/Greeter.arc56.json new file mode 100644 index 0000000000..b79d2ef010 --- /dev/null +++ b/test_cases/inner_transactions/out/Greeter.arc56.json @@ -0,0 +1,151 @@ +{ + "name": "Greeter", + "structs": {}, + "methods": [ + { + "name": "bootstrap", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_greetings", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "hello_app": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGVsbG9fYXBw" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 281 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 76, + 93 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 126 + ], + "errorMessage": "already bootstrapped" + }, + { + "pc": [ + 113 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 79, + 96 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 124, + 238, + 247 + ], + "errorMessage": "check self.hello_app exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrICJoZWxsb19hcHAiIDB4MTUxZjdjNzUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6OAogICAgLy8gc2VsZi5oZWxsb19hcHAgPSBBcHBsaWNhdGlvbigpCiAgICBieXRlY18wIC8vICJoZWxsb19hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg3ODZiNjI5MSAweDMzZmI1ZDQ4IC8vIG1ldGhvZCAiYm9vdHN0cmFwKCl1aW50NjQiLCBtZXRob2QgImxvZ19ncmVldGluZ3Moc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JlZXRpbmdzX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncmVldGluZ3Nfcm91dGVAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbG9nX2dyZWV0aW5ncwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLmJvb3RzdHJhcCgpIC0+IHVpbnQ2NDoKYm9vdHN0cmFwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaGVsbG9fYXBwLCAiYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaGVsbG9fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhlbGxvX2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICBwdXNoYnl0ZXMgMHgwYTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgcHVzaGJ5dGVzIDB4MGEyMDAxMDEzMTFiNDEwMDI2ODAwNDAyYmVjZTExMzYxYTAwOGUwMTAwMDEwMDMxMTkxNDQ0MzExODQ0MzYxYTAxODgwMDE1ODAwNDE1MWY3Yzc1NGM1MGIwMjI0MzMxMTkxNDQ0MzExODE0NDQyMjQzOGEwMTAxOGJmZjU3MDIwMDgwMDc0ODY1NmM2YzZmMmMyMDRjNTA0OTE1MTY1NzA2MDA0YzUwODkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTMtMjAKICAgIC8vIHNlbGYuaGVsbG9fYXBwID0gKAogICAgLy8gICAgIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2FwcAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjEKICAgIC8vIHJldHVybiBzZWxmLmhlbGxvX2FwcC5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5sb2dfZ3JlZXRpbmdzKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfZ3JlZXRpbmdzOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBsb2dfZ3JlZXRpbmdzKHNlbGYsIG5hbWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI1LTI4CiAgICAvLyBoZWxsb19jYWxsID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNgogICAgLy8gYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiaGVsbG8oc3RyaW5nKXN0cmluZyIpLCBuYW1lKSwKICAgIHB1c2hieXRlcyAweDAyYmVjZTExIC8vIG1ldGhvZCAiaGVsbG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUtMjgKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI5CiAgICAvLyBncmVldGluZyA9IGFyYzQuU3RyaW5nLmZyb21fbG9nKGhlbGxvX2NhbGwubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMwCiAgICAvLyBsb2coIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIsIGdyZWV0aW5nLm5hdGl2ZSkKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEGJgIJaGVsbG9fYXBwBBUffHUxGEAAA4gABIgACEOKAAAoImeJigABMRtBADeCAgR4a2KRBDP7XUg2GgCOAgACABMiiTEZFEQxGESIACMWKUxQsCOJMRkURDEYRDYaAYgAiSOJMRlAAAYxGBREI4kiiYoAASIoZUQURLGAAwqBAbJCgFUKIAEBMRtBACaABAK+zhE2GgCOAQABADEZFEQxGEQ2GgGIABWABBUffHVMULAiQzEZFEQxGBREIkOKAQGL/1cCAIAHSGVsbG8sIExQSRUWVwYATFCJskAkshAisgGzKLQ9ZyIoZUSJigEAsSIoZUSABAK+zhGyGov/shqyGCSyECKyAbO0PklXBABMVwAEKRJEVwIAgBVIZWxsb1dvcmxkIHJldHVybmVkOiBMULCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/Greeter.destructured.ir b/test_cases/inner_transactions/out/Greeter.destructured.ir index be702668e2..d686e05347 100644 --- a/test_cases/inner_transactions/out/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out/Greeter.destructured.ir @@ -26,9 +26,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -37,9 +37,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating return 1u block@10: // after_if_else_L6 return 0u diff --git a/test_cases/inner_transactions/out/Greeter.ssa.ir b/test_cases/inner_transactions/out/Greeter.ssa.ir index 4a4e233891..d2fe8245df 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.ir @@ -27,10 +27,10 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -39,10 +39,10 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -56,7 +56,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (== tmp%14#0 0u) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating test_cases.inner_transactions.c2c.Greeter.__algopy_default_create() return 1u block@8: // switch_case_default_L6 diff --git a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir index d919e7a00a..2fb7a170a2 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir @@ -26,9 +26,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -37,9 +37,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating return 1u block@10: // after_if_else_L6 return 0u diff --git a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_2.ir index be702668e2..d686e05347 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_2.ir @@ -26,9 +26,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -37,9 +37,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating return 1u block@10: // after_if_else_L6 return 0u diff --git a/test_cases/inner_transactions/out_O2/ArrayAccessContract.approval.teal b/test_cases/inner_transactions/out_O2/ArrayAccessContract.approval.teal index f1c025d295..5ec3cf4404 100644 --- a/test_cases/inner_transactions/out_O2/ArrayAccessContract.approval.teal +++ b/test_cases/inner_transactions/out_O2/ArrayAccessContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_branching_array_call_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub test_branching_array_call intc_1 // 1 @@ -34,7 +34,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_O2/ArrayAccessContract.destructured.ir b/test_cases/inner_transactions/out_O2/ArrayAccessContract.destructured.ir index ed27434020..a5f16f984d 100644 --- a/test_cases/inner_transactions/out_O2/ArrayAccessContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/ArrayAccessContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -27,7 +27,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (! tmp%9#0) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating return 1u block@9: // after_if_else_L20 return 0u diff --git a/test_cases/inner_transactions/out_O2/CreateAndTransferContract.approval.teal b/test_cases/inner_transactions/out_O2/CreateAndTransferContract.approval.teal index 9e87c63d1d..3ce7eff580 100644 --- a/test_cases/inner_transactions/out_O2/CreateAndTransferContract.approval.teal +++ b/test_cases/inner_transactions/out_O2/CreateAndTransferContract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___create_and_transfer_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub create_and_transfer intc_1 // 1 retsub @@ -32,7 +32,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_O2/CreateAndTransferContract.destructured.ir b/test_cases/inner_transactions/out_O2/CreateAndTransferContract.destructured.ir index 32591ce58c..106311ac03 100644 --- a/test_cases/inner_transactions/out_O2/CreateAndTransferContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/CreateAndTransferContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@2: // create_and_transfer_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.create_and_transfer() return 1u block@5: // bare_routing_L10 @@ -26,7 +26,7 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating return 1u block@9: // after_if_else_L10 return 0u diff --git a/test_cases/inner_transactions/out_O2/FieldTupleContract.approval.teal b/test_cases/inner_transactions/out_O2/FieldTupleContract.approval.teal index a5c17e46c6..4e6fbe8dd5 100644 --- a/test_cases/inner_transactions/out_O2/FieldTupleContract.approval.teal +++ b/test_cases/inner_transactions/out_O2/FieldTupleContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_assign_tuple_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple intc_3 // 1 retsub @@ -31,9 +31,9 @@ __puya_arc4_router___test_assign_tuple_route@2: __puya_arc4_router___test_assign_tuple_mixed_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple_mixed intc_3 // 1 retsub @@ -43,7 +43,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_3 // 1 retsub diff --git a/test_cases/inner_transactions/out_O2/FieldTupleContract.destructured.ir b/test_cases/inner_transactions/out_O2/FieldTupleContract.destructured.ir index 082f827c84..61c5ccaabf 100644 --- a/test_cases/inner_transactions/out_O2/FieldTupleContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/FieldTupleContract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@6: // bare_routing_L24 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L24 return 0u diff --git a/test_cases/inner_transactions/out_O2/Greeter.approval.teal b/test_cases/inner_transactions/out_O2/Greeter.approval.teal index 07bb1dfab7..c1bd87e542 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.approval.teal +++ b/test_cases/inner_transactions/out_O2/Greeter.approval.teal @@ -35,9 +35,9 @@ __puya_arc4_router__: __puya_arc4_router___bootstrap_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub bootstrap itob bytec_1 // 0x151f7c75 @@ -50,9 +50,9 @@ __puya_arc4_router___bootstrap_route@2: __puya_arc4_router___log_greetings_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_greetings intc_1 // 1 @@ -63,7 +63,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir index be702668e2..d686e05347 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir @@ -26,9 +26,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -37,9 +37,9 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating return 1u block@10: // after_if_else_L6 return 0u diff --git a/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.approval.teal b/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.approval.teal index 7209400179..0a1327cc88 100644 --- a/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.approval.teal @@ -28,11 +28,11 @@ __puya_arc4_router___test_branching_array_call_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // inner_transactions/array_access.py:20 // class ArrayAccessContract(ARC4Contract): txna ApplicationArgs 1 @@ -58,7 +58,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.destructured.ir index 39a246c641..e29c06f70d 100644 --- a/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/ArrayAccessContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@2: // test_branching_array_call_route_L21 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.array_access.ArrayAccessContract.test_branching_array_call(tmp%7#0) return 1u @@ -33,7 +33,7 @@ contract test_cases.inner_transactions.array_access.ArrayAccessContract: block@6: // __algopy_default_create_L1 let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (== tmp%9#0 0u) - (assert tmp%10#0) // is creating + (assert tmp%10#0) // can only call when creating test_cases.inner_transactions.array_access.ArrayAccessContract.__algopy_default_create() return 1u block@7: // switch_case_default_L20 diff --git a/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.approval.teal b/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.approval.teal index 9ed5e50069..1de98839ed 100644 --- a/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.approval.teal @@ -27,11 +27,11 @@ __puya_arc4_router___create_and_transfer_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub create_and_transfer intc_1 // 1 retsub @@ -52,7 +52,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.destructured.ir index ae26d8345c..0dbda0d025 100644 --- a/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/CreateAndTransferContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@2: // create_and_transfer_route_L11 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.create_and_transfer() return 1u block@3: // switch_case_default_L10 @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.asset_transfer.CreateAndTransferContract: block@6: // __algopy_default_create_L1 let tmp%8#0: uint64 = (txn ApplicationID) let tmp%9#0: bool = (== tmp%8#0 0u) - (assert tmp%9#0) // is creating + (assert tmp%9#0) // can only call when creating test_cases.inner_transactions.asset_transfer.CreateAndTransferContract.__algopy_default_create() return 1u block@7: // switch_case_default_L10 diff --git a/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.approval.teal b/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.approval.teal index e3e02883e6..f73181cc6d 100644 --- a/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___test_assign_tuple_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple intc_1 // 1 retsub @@ -44,11 +44,11 @@ __puya_arc4_router___test_assign_tuple_mixed_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_assign_tuple_mixed intc_1 // 1 retsub @@ -69,7 +69,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.destructured.ir index a9b7116464..9a6a08f3e9 100644 --- a/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/FieldTupleContract.destructured.ir @@ -16,19 +16,19 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@2: // test_assign_tuple_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple() return 1u block@3: // test_assign_tuple_mixed_route_L85 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.test_assign_tuple_mixed() return 1u block@4: // switch_case_default_L24 @@ -41,7 +41,7 @@ contract test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (== tmp%12#0 0u) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating test_cases.inner_transactions.field_tuple_assignment.FieldTupleContract.__algopy_default_create() return 1u block@8: // switch_case_default_L24 diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal b/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal index 5cb8a11458..6951d0da52 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal @@ -47,11 +47,11 @@ __puya_arc4_router___bootstrap_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub bootstrap itob bytec_1 // 0x151f7c75 @@ -67,11 +67,11 @@ __puya_arc4_router___log_greetings_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // inner_transactions/c2c.py:6 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -97,7 +97,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir index 59efee784c..61e712e1de 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir @@ -27,10 +27,10 @@ contract test_cases.inner_transactions.c2c.Greeter: block@2: // bootstrap_route_L10 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.inner_transactions.c2c.Greeter.bootstrap() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -39,10 +39,10 @@ contract test_cases.inner_transactions.c2c.Greeter: block@3: // log_greetings_route_L23 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) test_cases.inner_transactions.c2c.Greeter.log_greetings(tmp%12#0) return 1u @@ -56,7 +56,7 @@ contract test_cases.inner_transactions.c2c.Greeter: block@7: // __algopy_default_create_L1 let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (== tmp%14#0 0u) - (assert tmp%15#0) // is creating + (assert tmp%15#0) // can only call when creating test_cases.inner_transactions.c2c.Greeter.__algopy_default_create() return 1u block@8: // switch_case_default_L6 diff --git a/test_cases/inner_transactions/puya.log b/test_cases/inner_transactions/puya.log index 86db315c43..e9d0df2023 100644 --- a/test_cases/inner_transactions/puya.log +++ b/test_cases/inner_transactions/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inner_transactions/out/module.awst debug: Sealing block@0: // L12 @@ -7682,6 +7682,7 @@ info: Writing inner_transactions/out/itxn_loop.clear.bin info: Writing inner_transactions/out/itxn_loop.approval.puya.map info: Writing inner_transactions/out/itxn_loop.clear.puya.map info: Writing inner_transactions/out/FieldTupleContract.arc32.json +info: Writing inner_transactions/out/FieldTupleContract.arc56.json info: Writing inner_transactions/out/FieldTupleContract.approval.teal info: Writing inner_transactions/out/FieldTupleContract.clear.teal info: Writing inner_transactions/out/FieldTupleContract.approval.bin @@ -7695,6 +7696,7 @@ info: Writing inner_transactions/out/MyContract.clear.bin info: Writing inner_transactions/out/MyContract.approval.puya.map info: Writing inner_transactions/out/MyContract.clear.puya.map info: Writing inner_transactions/out/Greeter.arc32.json +info: Writing inner_transactions/out/Greeter.arc56.json info: Writing inner_transactions/out/Greeter.approval.teal info: Writing inner_transactions/out/Greeter.clear.teal info: Writing inner_transactions/out/Greeter.approval.bin @@ -7702,6 +7704,7 @@ info: Writing inner_transactions/out/Greeter.clear.bin info: Writing inner_transactions/out/Greeter.approval.puya.map info: Writing inner_transactions/out/Greeter.clear.puya.map info: Writing inner_transactions/out/CreateAndTransferContract.arc32.json +info: Writing inner_transactions/out/CreateAndTransferContract.arc56.json info: Writing inner_transactions/out/CreateAndTransferContract.approval.teal info: Writing inner_transactions/out/CreateAndTransferContract.clear.teal info: Writing inner_transactions/out/CreateAndTransferContract.approval.bin @@ -7709,6 +7712,7 @@ info: Writing inner_transactions/out/CreateAndTransferContract.clear.bin info: Writing inner_transactions/out/CreateAndTransferContract.approval.puya.map info: Writing inner_transactions/out/CreateAndTransferContract.clear.puya.map info: Writing inner_transactions/out/ArrayAccessContract.arc32.json +info: Writing inner_transactions/out/ArrayAccessContract.arc56.json info: Writing inner_transactions/out/ArrayAccessContract.approval.teal info: Writing inner_transactions/out/ArrayAccessContract.clear.teal info: Writing inner_transactions/out/ArrayAccessContract.approval.bin diff --git a/test_cases/inner_transactions_assignment/out/Contract.approval.mir b/test_cases/inner_transactions_assignment/out/Contract.approval.mir index a5cfb76b53..bdf32915f0 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.approval.mir +++ b/test_cases/inner_transactions_assignment/out/Contract.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___test_itxn_slice_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub test_itxn_slice int 1 1 retsub 1 @@ -46,9 +46,9 @@ __puya_arc4_router___test_itxn_nested_route@3: // @arc4.abimethod txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub test_itxn_nested int 1 1 retsub 1 @@ -63,7 +63,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%12#0 ! tmp%13#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/inner_transactions_assignment/out/Contract.approval.teal b/test_cases/inner_transactions_assignment/out/Contract.approval.teal index 6380667232..8794390686 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.approval.teal +++ b/test_cases/inner_transactions_assignment/out/Contract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_itxn_slice_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_itxn_slice intc_1 // 1 retsub @@ -37,9 +37,9 @@ __puya_arc4_router___test_itxn_nested_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_itxn_nested intc_1 // 1 retsub @@ -51,7 +51,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions_assignment/out/Contract.arc32.json b/test_cases/inner_transactions_assignment/out/Contract.arc32.json index a9f998ba30..1beceaf430 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.arc32.json +++ b/test_cases/inner_transactions_assignment/out/Contract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMKICAgIGJ5dGVjYmxvY2sgMHg2MTYzNjY2NyAweDcwNjE3OTMyICJwYXkxIiAiVEVTVCIgIlRTVCIgInBheTMiIDB4Njg2OSAweDc0Njg2NTcyNjUgMHg2ZDYxNzk2MjY1IDB4Njg2OTMyIDB4NjE2MzY2NjczMiAweDcwNjE3OTM1IDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhlNDZkOTAxOSAweGY4ODM4NTNlIC8vIG1ldGhvZCAidGVzdF9pdHhuX3NsaWNlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2l0eG5fbmVzdGVkKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX3NsaWNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX25lc3RlZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fc2xpY2Vfcm91dGVAMjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9pdHhuX3NsaWNlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fbmVzdGVkX3JvdXRlQDM6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfaXR4bl9uZXN0ZWQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQuY29udHJhY3QuQ29udHJhY3QudGVzdF9pdHhuX3NsaWNlKCkgLT4gdm9pZDoKdGVzdF9pdHhuX3NsaWNlOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTMtMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfaXR4bl9zbGljZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBieXRlY18yIC8vICJwYXkxIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGR1cAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE5CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTgKICAgIC8vIG5vdGU9ImFjZmciLAogICAgYnl0ZWNfMCAvLyAiYWNmZyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTcKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNgogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNQogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMwogICAgLy8gcGF5Mi5zZXQobm90ZT0icGF5MiIpCiAgICBieXRlY18xIC8vICJwYXkyIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjEKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNQogICAgLy8gcGF5My5zZXQobm90ZT0icGF5MyIpCiAgICBieXRlYyA1IC8vICJwYXkzIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAyIE5vdGUKICAgIGdpdHhuIDEgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBzbGljZWRfdHhuc1swXS5ub3RlID09IGIiYWNmZyIKICAgIGJ5dGVjXzAgLy8gMHg2MTYzNjY2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBzbGljZWRfdHhuc1sxXS5ub3RlID09IGIicGF5MiIKICAgIGJ5dGVjXzEgLy8gMHg3MDYxNzkzMgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC5jb250cmFjdC5Db250cmFjdC50ZXN0X2l0eG5fbmVzdGVkKCkgLT4gdm9pZDoKdGVzdF9pdHhuX25lc3RlZDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjMwLTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2l0eG5fbmVzdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDQKICAgIC8vIGVjaG8oQnl0ZXMoYiJoaSIpKSwKICAgIGJ5dGVjIDYgLy8gMHg2ODY5CiAgICBjYWxsc3ViIGVjaG8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozNgogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM1CiAgICAvLyBub3RlPSJhY2ZnIiwKICAgIGJ5dGVjXzAgLy8gImFjZmciCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzMgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzMKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjIDQgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzIKICAgIC8vIGFjZmcgPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0MAogICAgLy8gcGF5Mi5zZXQobm90ZT0icGF5MiIpCiAgICBieXRlY18xIC8vICJwYXkyIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBwYXkzLnNldChub3RlPSJwYXkzIikKICAgIGJ5dGVjIDUgLy8gInBheTMiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDYKICAgIC8vIGVjaG8oQnl0ZXMoYiJ0aGVyZSIpKSwKICAgIGJ5dGVjIDcgLy8gMHg3NDY4NjU3MjY1CiAgICBjYWxsc3ViIGVjaG8KICAgIGR1cAogICAgY292ZXIgMgogICAgZ2l0eG4gMSBOb3RlCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGdpdHhuIDIgTm90ZQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0OAogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVswXSA9PSBiImhpIgogICAgdW5jb3ZlciAzCiAgICBieXRlYyA2IC8vIDB4Njg2OQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMF0ubm90ZSA9PSBiImFjZmciCiAgICBieXRlY18wIC8vIDB4NjE2MzY2NjcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjUwCiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzFdLm5vdGUgPT0gYiJwYXkyIgogICAgYnl0ZWNfMSAvLyAweDcwNjE3OTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo1MQogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVsyXSA9PSBiInRoZXJlIgogICAgYnl0ZWMgNyAvLyAweDc0Njg2NTcyNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU4CiAgICAvLyBpZiBlY2hvKEJ5dGVzKGIibWF5YmUiKSkgPT0gYiJtYXliZSI6CiAgICBieXRlYyA4IC8vIDB4NmQ2MTc5NjI2NQogICAgY2FsbHN1YiBlY2hvCiAgICBieXRlYyA4IC8vIDB4NmQ2MTc5NjI2NQogICAgPT0KICAgIGJ6IHRlc3RfaXR4bl9uZXN0ZWRfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MAogICAgLy8gZWNobyhCeXRlcyhiImhpMiIpKSwKICAgIGJ5dGVjIDkgLy8gMHg2ODY5MzIKICAgIGNhbGxzdWIgZWNobwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBieXRlY18yIC8vICJwYXkxIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozNgogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhY2ZnLnNldChub3RlPSJhY2ZnMiIpCiAgICBieXRlYyAxMCAvLyAiYWNmZzIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzMgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzMKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjIDQgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzIKICAgIC8vIGFjZmcgPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU2CiAgICAvLyBwYXkzLnNldChub3RlPSJwYXk1IikKICAgIGJ5dGVjIDExIC8vICJwYXk1IgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTMpWzE6XSwKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MgogICAgLy8gZWNobyhCeXRlcyhiInRoZXJlMiIpKSwKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIGVjaG8KICAgIGZyYW1lX2J1cnkgMgogICAgZ2l0eG4gMSBOb3RlCiAgICBmcmFtZV9idXJ5IDMKICAgIGl0eG4gTm90ZQogICAgZnJhbWVfYnVyeSA0Cgp0ZXN0X2l0eG5fbmVzdGVkX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzBdID09IGIiaGkyIgogICAgZnJhbWVfZGlnIDEKICAgIGJ5dGVjIDkgLy8gMHg2ODY5MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzBdLm5vdGUgPT0gYiJhY2ZnMiIKICAgIGZyYW1lX2RpZyAzCiAgICBieXRlYyAxMCAvLyAweDYxNjM2NjY3MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzFdLm5vdGUgPT0gYiJwYXk1IgogICAgZnJhbWVfZGlnIDQKICAgIGJ5dGVjIDExIC8vIDB4NzA2MTc5MzUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY3CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzJdID09IGIidGhlcmUyIgogICAgZnJhbWVfZGlnIDIKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2ODY1NzI2NTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LmVjaG8odmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNobzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5Ojc3LTc4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8odmFsdWU6IEJ5dGVzKSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NzkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMKICAgIGJ5dGVjYmxvY2sgMHg2MTYzNjY2NyAweDcwNjE3OTMyICJwYXkxIiAiVEVTVCIgIlRTVCIgInBheTMiIDB4Njg2OSAweDc0Njg2NTcyNjUgMHg2ZDYxNzk2MjY1IDB4Njg2OTMyIDB4NjE2MzY2NjczMiAweDcwNjE3OTM1IDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhlNDZkOTAxOSAweGY4ODM4NTNlIC8vIG1ldGhvZCAidGVzdF9pdHhuX3NsaWNlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2l0eG5fbmVzdGVkKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX3NsaWNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX25lc3RlZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fc2xpY2Vfcm91dGVAMjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2l0eG5fc2xpY2UKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXR4bl9uZXN0ZWRfcm91dGVAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2l0eG5fbmVzdGVkCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC5jb250cmFjdC5Db250cmFjdC50ZXN0X2l0eG5fc2xpY2UoKSAtPiB2b2lkOgp0ZXN0X2l0eG5fc2xpY2U6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxMy0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9pdHhuX3NsaWNlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIHR4biBTZW5kZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTkKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxOAogICAgLy8gbm90ZT0iYWNmZyIsCiAgICBieXRlY18wIC8vICJhY2ZnIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXRfbmFtZT0iVEVTVCIsCiAgICBieXRlY18zIC8vICJURVNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE2CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlYyA0IC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhY2ZnID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjEKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIzCiAgICAvLyBwYXkyLnNldChub3RlPSJwYXkyIikKICAgIGJ5dGVjXzEgLy8gInBheTIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjYKICAgIC8vIHNsaWNlZF90eG5zID0gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI1CiAgICAvLyBwYXkzLnNldChub3RlPSJwYXkzIikKICAgIGJ5dGVjIDUgLy8gInBheTMiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjYKICAgIC8vIHNsaWNlZF90eG5zID0gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDIgTm90ZQogICAgZ2l0eG4gMSBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNwogICAgLy8gYXNzZXJ0IHNsaWNlZF90eG5zWzBdLm5vdGUgPT0gYiJhY2ZnIgogICAgYnl0ZWNfMCAvLyAweDYxNjM2NjY3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyOAogICAgLy8gYXNzZXJ0IHNsaWNlZF90eG5zWzFdLm5vdGUgPT0gYiJwYXkyIgogICAgYnl0ZWNfMSAvLyAweDcwNjE3OTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfaXR4bl9uZXN0ZWQoKSAtPiB2b2lkOgp0ZXN0X2l0eG5fbmVzdGVkOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzAtMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfaXR4bl9uZXN0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NAogICAgLy8gZWNobyhCeXRlcyhiImhpIikpLAogICAgYnl0ZWMgNiAvLyAweDY4NjkKICAgIGNhbGxzdWIgZWNobwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgYnl0ZWNfMiAvLyAicGF5MSIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzUKICAgIC8vIG5vdGU9ImFjZmciLAogICAgYnl0ZWNfMCAvLyAiYWNmZyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMwogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMgogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQwCiAgICAvLyBwYXkyLnNldChub3RlPSJwYXkyIikKICAgIGJ5dGVjXzEgLy8gInBheTIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDIKICAgIC8vIHBheTMuc2V0KG5vdGU9InBheTMiKQogICAgYnl0ZWMgNSAvLyAicGF5MyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NgogICAgLy8gZWNobyhCeXRlcyhiInRoZXJlIikpLAogICAgYnl0ZWMgNyAvLyAweDc0Njg2NTcyNjUKICAgIGNhbGxzdWIgZWNobwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnaXR4biAxIE5vdGUKICAgIGR1cAogICAgY292ZXIgMwogICAgZ2l0eG4gMiBOb3RlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzBdID09IGIiaGkiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDYgLy8gMHg2ODY5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0OQogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVsxXVswXS5ub3RlID09IGIiYWNmZyIKICAgIGJ5dGVjXzAgLy8gMHg2MTYzNjY2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTAKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMV0ubm90ZSA9PSBiInBheTIiCiAgICBieXRlY18xIC8vIDB4NzA2MTc5MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjUxCiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzJdID09IGIidGhlcmUiCiAgICBieXRlYyA3IC8vIDB4NzQ2ODY1NzI2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTgKICAgIC8vIGlmIGVjaG8oQnl0ZXMoYiJtYXliZSIpKSA9PSBiIm1heWJlIjoKICAgIGJ5dGVjIDggLy8gMHg2ZDYxNzk2MjY1CiAgICBjYWxsc3ViIGVjaG8KICAgIGJ5dGVjIDggLy8gMHg2ZDYxNzk2MjY1CiAgICA9PQogICAgYnogdGVzdF9pdHhuX25lc3RlZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYwCiAgICAvLyBlY2hvKEJ5dGVzKGIiaGkyIikpLAogICAgYnl0ZWMgOSAvLyAweDY4NjkzMgogICAgY2FsbHN1YiBlY2hvCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTMpWzE6XSwKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTQKICAgIC8vIGFjZmcuc2V0KG5vdGU9ImFjZmcyIikKICAgIGJ5dGVjIDEwIC8vICJhY2ZnMiIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMwogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMgogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTYKICAgIC8vIHBheTMuc2V0KG5vdGU9InBheTUiKQogICAgYnl0ZWMgMTEgLy8gInBheTUiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlY2hvKEJ5dGVzKGIidGhlcmUyIikpLAogICAgYnl0ZWMgMTIgLy8gMHg3NDY4NjU3MjY1MzIKICAgIGNhbGxzdWIgZWNobwogICAgZnJhbWVfYnVyeSAyCiAgICBnaXR4biAxIE5vdGUKICAgIGZyYW1lX2J1cnkgMwogICAgaXR4biBOb3RlCiAgICBmcmFtZV9idXJ5IDQKCnRlc3RfaXR4bl9uZXN0ZWRfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjQKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMF0gPT0gYiJoaTIiCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgOSAvLyAweDY4NjkzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjUKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMF0ubm90ZSA9PSBiImFjZmcyIgogICAgZnJhbWVfZGlnIDMKICAgIGJ5dGVjIDEwIC8vIDB4NjE2MzY2NjczMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMV0ubm90ZSA9PSBiInBheTUiCiAgICBmcmFtZV9kaWcgNAogICAgYnl0ZWMgMTEgLy8gMHg3MDYxNzkzNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjcKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMl0gPT0gYiJ0aGVyZTIiCiAgICBmcmFtZV9kaWcgMgogICAgYnl0ZWMgMTIgLy8gMHg3NDY4NjU3MjY1MzIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQuY29udHJhY3QuZWNobyh2YWx1ZTogYnl0ZXMpIC0+IGJ5dGVzOgplY2hvOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZWNobyh2YWx1ZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/inner_transactions_assignment/out/Contract.arc56.json b/test_cases/inner_transactions_assignment/out/Contract.arc56.json new file mode 100644 index 0000000000..ca476c43b6 --- /dev/null +++ b/test_cases/inner_transactions_assignment/out/Contract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "test_itxn_slice", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_itxn_nested", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 112, + 124 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 141 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 115, + 127 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMKICAgIGJ5dGVjYmxvY2sgMHg2MTYzNjY2NyAweDcwNjE3OTMyICJwYXkxIiAiVEVTVCIgIlRTVCIgInBheTMiIDB4Njg2OSAweDc0Njg2NTcyNjUgMHg2ZDYxNzk2MjY1IDB4Njg2OTMyIDB4NjE2MzY2NjczMiAweDcwNjE3OTM1IDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhlNDZkOTAxOSAweGY4ODM4NTNlIC8vIG1ldGhvZCAidGVzdF9pdHhuX3NsaWNlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2l0eG5fbmVzdGVkKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX3NsaWNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX25lc3RlZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fc2xpY2Vfcm91dGVAMjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2l0eG5fc2xpY2UKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXR4bl9uZXN0ZWRfcm91dGVAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2l0eG5fbmVzdGVkCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC5jb250cmFjdC5Db250cmFjdC50ZXN0X2l0eG5fc2xpY2UoKSAtPiB2b2lkOgp0ZXN0X2l0eG5fc2xpY2U6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxMy0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9pdHhuX3NsaWNlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIHR4biBTZW5kZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTkKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxOAogICAgLy8gbm90ZT0iYWNmZyIsCiAgICBieXRlY18wIC8vICJhY2ZnIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXRfbmFtZT0iVEVTVCIsCiAgICBieXRlY18zIC8vICJURVNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE2CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlYyA0IC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhY2ZnID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjEKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIzCiAgICAvLyBwYXkyLnNldChub3RlPSJwYXkyIikKICAgIGJ5dGVjXzEgLy8gInBheTIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjYKICAgIC8vIHNsaWNlZF90eG5zID0gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI1CiAgICAvLyBwYXkzLnNldChub3RlPSJwYXkzIikKICAgIGJ5dGVjIDUgLy8gInBheTMiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjYKICAgIC8vIHNsaWNlZF90eG5zID0gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDIgTm90ZQogICAgZ2l0eG4gMSBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNwogICAgLy8gYXNzZXJ0IHNsaWNlZF90eG5zWzBdLm5vdGUgPT0gYiJhY2ZnIgogICAgYnl0ZWNfMCAvLyAweDYxNjM2NjY3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyOAogICAgLy8gYXNzZXJ0IHNsaWNlZF90eG5zWzFdLm5vdGUgPT0gYiJwYXkyIgogICAgYnl0ZWNfMSAvLyAweDcwNjE3OTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfaXR4bl9uZXN0ZWQoKSAtPiB2b2lkOgp0ZXN0X2l0eG5fbmVzdGVkOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzAtMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfaXR4bl9uZXN0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NAogICAgLy8gZWNobyhCeXRlcyhiImhpIikpLAogICAgYnl0ZWMgNiAvLyAweDY4NjkKICAgIGNhbGxzdWIgZWNobwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgYnl0ZWNfMiAvLyAicGF5MSIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzUKICAgIC8vIG5vdGU9ImFjZmciLAogICAgYnl0ZWNfMCAvLyAiYWNmZyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMwogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMgogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQwCiAgICAvLyBwYXkyLnNldChub3RlPSJwYXkyIikKICAgIGJ5dGVjXzEgLy8gInBheTIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDIKICAgIC8vIHBheTMuc2V0KG5vdGU9InBheTMiKQogICAgYnl0ZWMgNSAvLyAicGF5MyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzgKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NgogICAgLy8gZWNobyhCeXRlcyhiInRoZXJlIikpLAogICAgYnl0ZWMgNyAvLyAweDc0Njg2NTcyNjUKICAgIGNhbGxzdWIgZWNobwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnaXR4biAxIE5vdGUKICAgIGR1cAogICAgY292ZXIgMwogICAgZ2l0eG4gMiBOb3RlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzBdID09IGIiaGkiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDYgLy8gMHg2ODY5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0OQogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVsxXVswXS5ub3RlID09IGIiYWNmZyIKICAgIGJ5dGVjXzAgLy8gMHg2MTYzNjY2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTAKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMV0ubm90ZSA9PSBiInBheTIiCiAgICBieXRlY18xIC8vIDB4NzA2MTc5MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjUxCiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzJdID09IGIidGhlcmUiCiAgICBieXRlYyA3IC8vIDB4NzQ2ODY1NzI2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTgKICAgIC8vIGlmIGVjaG8oQnl0ZXMoYiJtYXliZSIpKSA9PSBiIm1heWJlIjoKICAgIGJ5dGVjIDggLy8gMHg2ZDYxNzk2MjY1CiAgICBjYWxsc3ViIGVjaG8KICAgIGJ5dGVjIDggLy8gMHg2ZDYxNzk2MjY1CiAgICA9PQogICAgYnogdGVzdF9pdHhuX25lc3RlZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYwCiAgICAvLyBlY2hvKEJ5dGVzKGIiaGkyIikpLAogICAgYnl0ZWMgOSAvLyAweDY4NjkzMgogICAgY2FsbHN1YiBlY2hvCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTMpWzE6XSwKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTQKICAgIC8vIGFjZmcuc2V0KG5vdGU9ImFjZmcyIikKICAgIGJ5dGVjIDEwIC8vICJhY2ZnMiIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMwogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMgogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NTYKICAgIC8vIHBheTMuc2V0KG5vdGU9InBheTUiKQogICAgYnl0ZWMgMTEgLy8gInBheTUiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlY2hvKEJ5dGVzKGIidGhlcmUyIikpLAogICAgYnl0ZWMgMTIgLy8gMHg3NDY4NjU3MjY1MzIKICAgIGNhbGxzdWIgZWNobwogICAgZnJhbWVfYnVyeSAyCiAgICBnaXR4biAxIE5vdGUKICAgIGZyYW1lX2J1cnkgMwogICAgaXR4biBOb3RlCiAgICBmcmFtZV9idXJ5IDQKCnRlc3RfaXR4bl9uZXN0ZWRfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjQKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMF0gPT0gYiJoaTIiCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgOSAvLyAweDY4NjkzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjUKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMF0ubm90ZSA9PSBiImFjZmcyIgogICAgZnJhbWVfZGlnIDMKICAgIGJ5dGVjIDEwIC8vIDB4NjE2MzY2NjczMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMV0ubm90ZSA9PSBiInBheTUiCiAgICBmcmFtZV9kaWcgNAogICAgYnl0ZWMgMTEgLy8gMHg3MDYxNzkzNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjcKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMl0gPT0gYiJ0aGVyZTIiCiAgICBmcmFtZV9kaWcgMgogICAgYnl0ZWMgMTIgLy8gMHg3NDY4NjU3MjY1MzIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQuY29udHJhY3QuZWNobyh2YWx1ZTogYnl0ZXMpIC0+IGJ5dGVzOgplY2hvOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZWNobyh2YWx1ZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAEDJg0EYWNmZwRwYXkyBHBheTEEVEVTVANUU1QEcGF5MwJoaQV0aGVyZQVtYXliZQNoaTIFYWNmZzIEcGF5NQZ0aGVyZTKIAAFDigABMRtBAC+CAgTkbZAZBPiDhT42GgCOAgACAA4iiTEZFEQxGESIABsjiTEZFEQxGESIAGYjiTEZQAAGMRgURCOJIomKAAAxALEqsgUisghJsgcjshAisgG2I7IiKLIFK7ImJwSyJSSyECKyAbYjshAisghJsgcpsgUisgG2I7IQIrIIsgcnBbIFIrIBs7cCBbcBBSgSRCkSRImKAAAxAEknBogA4UlPArEqsgUisghJsgcjshAisgG2I7IiKLIFK7ImJwSyJSSyECKyAbYjshAisghJsgcpsgUisgG2I7IQIrIIsgcnBbIFIrIBsycHiACUSU4CtwEFSU4DtwIFSU4CTgRPAycGEkQoEkQpEkQnBxJEJwiIAG4nCBJBAE8nCYgAY4wBsSqyBSKyCIsASbIHI7IQIrIBtiOyIicKsgUrsiYnBLIlJLIQIrIBtiOyECKyCLIHJwuyBSKyAbMnDIgAJIwCtwEFjAO0BYwEiwEnCRJEiwMnChJEiwQnCxJEiwInDBJEiYoBAYv/iQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/inner_transactions_assignment/out/Contract.destructured.ir b/test_cases/inner_transactions_assignment/out/Contract.destructured.ir index e2fd995b6f..8a00938cf5 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.destructured.ir +++ b/test_cases/inner_transactions_assignment/out/Contract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@6: // bare_routing_L11 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u diff --git a/test_cases/inner_transactions_assignment/out/Contract.ssa.ir b/test_cases/inner_transactions_assignment/out/Contract.ssa.ir index ac31d36424..9d4369341e 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.ssa.ir +++ b/test_cases/inner_transactions_assignment/out/Contract.ssa.ir @@ -16,19 +16,19 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@4: // switch_case_default_L11 @@ -41,7 +41,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (== tmp%12#0 0u) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating test_cases.inner_transactions_assignment.contract.Contract.__algopy_default_create() return 1u block@8: // switch_case_default_L11 diff --git a/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_1.ir b/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_1.ir index f22ce69fe6..fc67c2eb4b 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_1.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@6: // bare_routing_L11 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u diff --git a/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_2.ir b/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_2.ir index 48a1d2df9e..f4a7a73f99 100644 --- a/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions_assignment/out/Contract.ssa.opt_pass_2.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@6: // bare_routing_L11 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u diff --git a/test_cases/inner_transactions_assignment/out_O2/Contract.approval.teal b/test_cases/inner_transactions_assignment/out_O2/Contract.approval.teal index 3a0421c00a..9f677c7e94 100644 --- a/test_cases/inner_transactions_assignment/out_O2/Contract.approval.teal +++ b/test_cases/inner_transactions_assignment/out_O2/Contract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_itxn_slice_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_itxn_slice intc_1 // 1 retsub @@ -31,9 +31,9 @@ __puya_arc4_router___test_itxn_slice_route@2: __puya_arc4_router___test_itxn_nested_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_itxn_nested intc_1 // 1 retsub @@ -43,7 +43,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/inner_transactions_assignment/out_O2/Contract.destructured.ir b/test_cases/inner_transactions_assignment/out_O2/Contract.destructured.ir index e2fd995b6f..8a00938cf5 100644 --- a/test_cases/inner_transactions_assignment/out_O2/Contract.destructured.ir +++ b/test_cases/inner_transactions_assignment/out_O2/Contract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@6: // bare_routing_L11 @@ -34,7 +34,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating return 1u block@10: // after_if_else_L11 return 0u diff --git a/test_cases/inner_transactions_assignment/out_unoptimized/Contract.approval.teal b/test_cases/inner_transactions_assignment/out_unoptimized/Contract.approval.teal index 1f1b88f770..a46dbd49ba 100644 --- a/test_cases/inner_transactions_assignment/out_unoptimized/Contract.approval.teal +++ b/test_cases/inner_transactions_assignment/out_unoptimized/Contract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___test_itxn_slice_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_itxn_slice intc_1 // 1 retsub @@ -44,11 +44,11 @@ __puya_arc4_router___test_itxn_nested_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_itxn_nested intc_1 // 1 retsub @@ -69,7 +69,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/inner_transactions_assignment/out_unoptimized/Contract.destructured.ir b/test_cases/inner_transactions_assignment/out_unoptimized/Contract.destructured.ir index a1352431c8..0b63eb13da 100644 --- a/test_cases/inner_transactions_assignment/out_unoptimized/Contract.destructured.ir +++ b/test_cases/inner_transactions_assignment/out_unoptimized/Contract.destructured.ir @@ -16,19 +16,19 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@2: // test_itxn_slice_route_L13 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_slice() return 1u block@3: // test_itxn_nested_route_L30 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested() return 1u block@4: // switch_case_default_L11 @@ -41,7 +41,7 @@ contract test_cases.inner_transactions_assignment.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%12#0: uint64 = (txn ApplicationID) let tmp%13#0: bool = (== tmp%12#0 0u) - (assert tmp%13#0) // is creating + (assert tmp%13#0) // can only call when creating test_cases.inner_transactions_assignment.contract.Contract.__algopy_default_create() return 1u block@8: // switch_case_default_L11 diff --git a/test_cases/inner_transactions_assignment/puya.log b/test_cases/inner_transactions_assignment/puya.log index 97b70446b8..f83eb7585b 100644 --- a/test_cases/inner_transactions_assignment/puya.log +++ b/test_cases/inner_transactions_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inner_transactions_assignment/out/module.awst debug: Sealing block@0: // L12 @@ -3230,6 +3230,7 @@ debug: Found 1 edge set/s for test_cases.inner_transactions_assignment.contract. debug: test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested f-stack entry: [] debug: test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested f-stack on first store: ['pay1%%param_Receiver_idx_0#0', 'nested_tuple.0#0', 'nested_tuple.2#0', 'nested_tuple.1.0.Note#0', 'nested_tuple.1.1.Note#0'] info: Writing inner_transactions_assignment/out/Contract.arc32.json +info: Writing inner_transactions_assignment/out/Contract.arc56.json info: Writing inner_transactions_assignment/out/Contract.approval.teal info: Writing inner_transactions_assignment/out/Contract.clear.teal info: Writing inner_transactions_assignment/out/Contract.approval.bin diff --git a/test_cases/intrinsics/puya.log b/test_cases/intrinsics/puya.log index e7db103062..85dcac0e78 100644 --- a/test_cases/intrinsics/puya.log +++ b/test_cases/intrinsics/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['intrinsics'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['intrinsics'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing intrinsics/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/iteration/puya.log b/test_cases/iteration/puya.log index 24880d549f..093bc1fd77 100644 --- a/test_cases/iteration/puya.log +++ b/test_cases/iteration/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['iteration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['iteration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv iteration/base.py:38 debug: skipping trivial method test_forwards iteration/base.py:42 debug: skipping trivial method test_reversed diff --git a/test_cases/koopman/puya.log b/test_cases/koopman/puya.log index db4bb5f1c7..78783cfe59 100644 --- a/test_cases/koopman/puya.log +++ b/test_cases/koopman/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['koopman'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['koopman'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing koopman/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/less_simple/puya.log b/test_cases/less_simple/puya.log index 35f71890db..a1f9f054dd 100644 --- a/test_cases/less_simple/puya.log +++ b/test_cases/less_simple/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['less_simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['less_simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing less_simple/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/literals/puya.log b/test_cases/literals/puya.log index 911c5c50ac..a5103ed954 100644 --- a/test_cases/literals/puya.log +++ b/test_cases/literals/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['literals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['literals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv literals/folding.py:7:12 warning: expression is always True literals/folding.py:8:17 warning: expression is always False diff --git a/test_cases/log/puya.log b/test_cases/log/puya.log index 560272982f..723863218a 100644 --- a/test_cases/log/puya.log +++ b/test_cases/log/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['log'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['log'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing log/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/logic_signature/puya.log b/test_cases/logic_signature/puya.log index f5dbd81d9b..511520faa1 100644 --- a/test_cases/logic_signature/puya.log +++ b/test_cases/logic_signature/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SELLER': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'PRICE': 1, 'ASSET_ID': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['logic_signature'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SELLER': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'PRICE': 1, 'ASSET_ID': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['logic_signature'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing logic_signature/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/loop_else/puya.log b/test_cases/loop_else/puya.log index 12f0e526e4..a614bd5e77 100644 --- a/test_cases/loop_else/puya.log +++ b/test_cases/loop_else/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['loop_else'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['loop_else'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing loop_else/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/match/puya.log b/test_cases/match/puya.log index 957b0348c0..af6dffcb95 100644 --- a/test_cases/match/puya.log +++ b/test_cases/match/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['match'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['match'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing match/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/module_consts/puya.log b/test_cases/module_consts/puya.log index 9af10efda9..eb0592a113 100644 --- a/test_cases/module_consts/puya.log +++ b/test_cases/module_consts/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['module_consts'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['module_consts'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing module_consts/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/mylib/puya.log b/test_cases/mylib/puya.log index cbd61061ba..f7b44a6434 100644 --- a/test_cases/mylib/puya.log +++ b/test_cases/mylib/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['mylib'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['mylib'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing mylib/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/named_tuples/contract.py b/test_cases/named_tuples/contract.py index 19c6e5f184..ecc5866a76 100644 --- a/test_cases/named_tuples/contract.py +++ b/test_cases/named_tuples/contract.py @@ -4,6 +4,8 @@ class TestTuple(typing.NamedTuple): + """This is a test tuple""" + a: UInt64 b: BigUInt c: String diff --git a/test_cases/named_tuples/out/NamedTuplesContract.approval.mir b/test_cases/named_tuples/out/NamedTuplesContract.approval.mir index 3b139b276e..89a8c88f71 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.approval.mir +++ b/test_cases/named_tuples/out/NamedTuplesContract.approval.mir @@ -7,19 +7,19 @@ main_block@0: // test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> uint64: __puya_arc4_router__: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): proto 0 1 __puya_arc4_router___block@0: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txn NumAppArgs tmp%0#0 bz __puya_arc4_router___bare_routing@6 // Implicit fall through to __puya_arc4_router___abi_routing@1 __puya_arc4_router___abi_routing@1: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 0 tmp%2#0 method build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[]) tmp%2#0,Method(build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])) @@ -30,14 +30,14 @@ __puya_arc4_router___abi_routing@1: retsub 0 __puya_arc4_router___build_tuple_route@2: - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%7#0 btoi tmp%8#0 @@ -46,7 +46,7 @@ __puya_arc4_router___build_tuple_route@2: extract 2 0 tmp%8#0,tmp%9#0,tmp%11#0 txna ApplicationArgs 4 tmp%8#0,tmp%9#0,tmp%11#0,tmp%12#0 extract 2 0 tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0 - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() l-load tmp%8#0 3 tmp%9#0,tmp%11#0,tmp%13#0,tmp%8#0 l-load tmp%9#0 3 tmp%11#0,tmp%13#0,tmp%8#0,tmp%9#0 @@ -104,14 +104,14 @@ __puya_arc4_router___build_tuple_route@2: retsub 1 __puya_arc4_router___test_tuple_route@3: - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() txn OnCompletion tmp%15#0 ! tmp%16#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%17#0 - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 tmp%19#0 l-load-copy tmp%19#0 0 tmp%19#0,tmp%19#0 (copy) @@ -137,7 +137,7 @@ __puya_arc4_router___test_tuple_route@3: l-load item_end_offset%1#0 2 item0%0%0#0,item1%0#0,item2%0%0#0,tmp%19#0,item_end_offset%0#0,item_end_offset%1#0 substring3 item0%0%0#0,item1%0#0,item2%0%0#0,item3%0#0 extract 2 0 item0%0%0#0,item1%0#0,item2%0%0#0,item3%0%0#0 - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() l-load item0%0%0#0 3 item1%0#0,item2%0%0#0,item3%0%0#0,item0%0%0#0 l-load item1%0#0 3 item2%0%0#0,item3%0%0#0,item0%0%0#0,item1%0#0 @@ -148,7 +148,7 @@ __puya_arc4_router___test_tuple_route@3: retsub 1 __puya_arc4_router___bare_routing@6: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txn OnCompletion tmp%20#0 bnz __puya_arc4_router___after_if_else@10 @@ -157,12 +157,12 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%21#0 ! tmp%22#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 __puya_arc4_router___after_if_else@10: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): int 0 0 retsub 0 @@ -170,27 +170,27 @@ __puya_arc4_router___after_if_else@10: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:15-16 + // named_tuples/contract.py:17-18 // @arc4.abimethod() // def build_tuple(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 (𝕡) a#0,b#0,c#0,d#0 | build_tuple_block@0: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:17 + // named_tuples/contract.py:19 // t1 = self.build_tuple_by_name(a, b, c, d) p-load a#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy) p-load b#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy),b#0 (copy) p-load c#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy),b#0 (copy),c#0 (copy) p-load d#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy),b#0 (copy),c#0 (copy),d#0 (copy) callsub build_tuple_by_name (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0 - // named_tuples/contract.py:18 + // named_tuples/contract.py:20 // t2 = self.build_tuple_by_position(a, b, c, d) p-load a#0 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,a#0 (copy) p-load b#0 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,a#0 (copy),b#0 (copy) p-load c#0 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,a#0 (copy),b#0 (copy),c#0 (copy) p-load d#0 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,a#0 (copy),b#0 (copy),c#0 (copy),d#0 (copy) callsub build_tuple_by_position (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,t2.a#0,t2.b#0,t2.c#0,t2.d#0 - // named_tuples/contract.py:19 + // named_tuples/contract.py:21 // assert t1 == t2 l-load-copy t1.a#0 7 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,t2.a#0,t2.b#0,t2.c#0,t2.d#0,t1.a#0 (copy) l-load t2.a#0 4 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,t2.b#0,t2.c#0,t2.d#0,t1.a#0 (copy),t2.a#0 @@ -214,7 +214,7 @@ build_tuple_block@0: l-load tmp%5#0 1 (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,tmp%4#0,tmp%5#0 && (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0,tmp%6#0 assert (𝕡) a#0,b#0,c#0,d#0 | t1.a#0,t1.b#0,t1.c#0,t1.d#0 - // named_tuples/contract.py:20 + // named_tuples/contract.py:22 // return t1 l-load t1.a#0 3 (𝕡) a#0,b#0,c#0,d#0 | t1.b#0,t1.c#0,t1.d#0,t1.a#0 l-load t1.b#0 3 (𝕡) a#0,b#0,c#0,d#0 | t1.c#0,t1.d#0,t1.a#0,t1.b#0 @@ -225,13 +225,13 @@ build_tuple_block@0: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_name: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:22-23 + // named_tuples/contract.py:24-25 // @subroutine // def build_tuple_by_name(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 (𝕡) a#0,b#0,c#0,d#0 | build_tuple_by_name_block@0: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:24 + // named_tuples/contract.py:26 // return TestTuple(a=a, b=b, c=c, d=d) p-load a#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy) p-load b#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy),b#0 (copy) @@ -242,13 +242,13 @@ build_tuple_by_name_block@0: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_position: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:26-27 + // named_tuples/contract.py:28-29 // @subroutine // def build_tuple_by_position(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 (𝕡) a#0,b#0,c#0,d#0 | build_tuple_by_position_block@0: (𝕡) a#0,b#0,c#0,d#0 | - // named_tuples/contract.py:28 + // named_tuples/contract.py:30 // return TestTuple(a, b, c, d) p-load a#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy) p-load b#0 (𝕡) a#0,b#0,c#0,d#0 | a#0 (copy),b#0 (copy) @@ -259,32 +259,32 @@ build_tuple_by_position_block@0: // test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: bytes, value.c: bytes, value.d: bytes) -> void: test_tuple: (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | - // named_tuples/contract.py:30-31 + // named_tuples/contract.py:32-33 // @arc4.abimethod() // def test_tuple(self, value: TestTuple) -> None: proto 4 0 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | test_tuple_block@0: (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | - // named_tuples/contract.py:32 + // named_tuples/contract.py:34 // assert value.a < 1000 p-load value.a#0 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | value.a#0 (copy) int 1000 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | value.a#0 (copy),1000 < (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%0#0 assert (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | - // named_tuples/contract.py:33 + // named_tuples/contract.py:35 // assert value.b < 2**65 p-load value.b#0 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | value.b#0 (copy) byte 0x020000000000000000 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | value.b#0 (copy),0x020000000000000000 b< (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%1#0 assert (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | - // named_tuples/contract.py:34 + // named_tuples/contract.py:36 // assert value.c.bytes.length > 1 p-load value.c#0 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | value.c#0 (copy) len (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%2#0 int 1 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%2#0,1 > (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%3#0 assert (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | - // named_tuples/contract.py:35 + // named_tuples/contract.py:37 // assert value.d == Txn.sender.bytes txn Sender (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%4#0 p-load value.d#0 (𝕡) value.a#0,value.b#0,value.c#0,value.d#0 | tmp%4#0,value.d#0 (copy) diff --git a/test_cases/named_tuples/out/NamedTuplesContract.approval.teal b/test_cases/named_tuples/out/NamedTuplesContract.approval.teal index 0d2c380ae3..da862d34af 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.approval.teal +++ b/test_cases/named_tuples/out/NamedTuplesContract.approval.teal @@ -8,7 +8,7 @@ test_cases.named_tuples.contract.NamedTuplesContract.approval_program: // test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> uint64: __puya_arc4_router__: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): proto 0 1 txn NumAppArgs @@ -20,14 +20,14 @@ __puya_arc4_router__: retsub __puya_arc4_router___build_tuple_route@2: - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 btoi @@ -36,7 +36,7 @@ __puya_arc4_router___build_tuple_route@2: extract 2 0 txna ApplicationArgs 4 extract 2 0 - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() callsub build_tuple uncover 3 @@ -86,14 +86,14 @@ __puya_arc4_router___build_tuple_route@2: retsub __puya_arc4_router___test_tuple_route@3: - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 dup @@ -119,25 +119,25 @@ __puya_arc4_router___test_tuple_route@3: uncover 2 substring3 extract 2 0 - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() callsub test_tuple intc_0 // 1 retsub __puya_arc4_router___bare_routing@6: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txn OnCompletion bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub __puya_arc4_router___after_if_else@10: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): intc_1 // 0 retsub @@ -145,25 +145,25 @@ __puya_arc4_router___after_if_else@10: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple: - // named_tuples/contract.py:15-16 + // named_tuples/contract.py:17-18 // @arc4.abimethod() // def build_tuple(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:17 + // named_tuples/contract.py:19 // t1 = self.build_tuple_by_name(a, b, c, d) frame_dig -4 frame_dig -3 frame_dig -2 frame_dig -1 callsub build_tuple_by_name - // named_tuples/contract.py:18 + // named_tuples/contract.py:20 // t2 = self.build_tuple_by_position(a, b, c, d) frame_dig -4 frame_dig -3 frame_dig -2 frame_dig -1 callsub build_tuple_by_position - // named_tuples/contract.py:19 + // named_tuples/contract.py:21 // assert t1 == t2 dig 7 uncover 4 @@ -181,18 +181,18 @@ build_tuple: == && assert - // named_tuples/contract.py:20 + // named_tuples/contract.py:22 // return t1 retsub // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_name: - // named_tuples/contract.py:22-23 + // named_tuples/contract.py:24-25 // @subroutine // def build_tuple_by_name(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:24 + // named_tuples/contract.py:26 // return TestTuple(a=a, b=b, c=c, d=d) frame_dig -4 frame_dig -3 @@ -203,11 +203,11 @@ build_tuple_by_name: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_position: - // named_tuples/contract.py:26-27 + // named_tuples/contract.py:28-29 // @subroutine // def build_tuple_by_position(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:28 + // named_tuples/contract.py:30 // return TestTuple(a, b, c, d) frame_dig -4 frame_dig -3 @@ -218,30 +218,30 @@ build_tuple_by_position: // test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: bytes, value.c: bytes, value.d: bytes) -> void: test_tuple: - // named_tuples/contract.py:30-31 + // named_tuples/contract.py:32-33 // @arc4.abimethod() // def test_tuple(self, value: TestTuple) -> None: proto 4 0 - // named_tuples/contract.py:32 + // named_tuples/contract.py:34 // assert value.a < 1000 frame_dig -4 pushint 1000 // 1000 < assert - // named_tuples/contract.py:33 + // named_tuples/contract.py:35 // assert value.b < 2**65 frame_dig -3 pushbytes 0x020000000000000000 b< assert - // named_tuples/contract.py:34 + // named_tuples/contract.py:36 // assert value.c.bytes.length > 1 frame_dig -2 len intc_0 // 1 > assert - // named_tuples/contract.py:35 + // named_tuples/contract.py:37 // assert value.d == Txn.sender.bytes frame_dig -1 txn Sender diff --git a/test_cases/named_tuples/out/NamedTuplesContract.arc32.json b/test_cases/named_tuples/out/NamedTuplesContract.arc32.json index e8acacc22f..564e291393 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.arc32.json +++ b/test_cases/named_tuples/out/NamedTuplesContract.arc32.json @@ -58,7 +58,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxMwogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQ1NmVlYWNlIDB4NmY5ZjViZjAgLy8gbWV0aG9kICJidWlsZF90dXBsZSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSIsIG1ldGhvZCAidGVzdF90dXBsZSgodWludDY0LHVpbnQ1MTIsc3RyaW5nLGJ5dGVbXSkpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2J1aWxkX3R1cGxlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF90dXBsZV9yb3V0ZUAzCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idWlsZF90dXBsZV9yb3V0ZUAyOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBOYW1lZFR1cGxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBidWlsZF90dXBsZQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgNAogICAgYnwKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDRjCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF90dXBsZV9yb3V0ZUAzOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBjbGFzcyBOYW1lZFR1cGxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIGxlbgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF90dXBsZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTMKICAgIC8vIGNsYXNzIE5hbWVkVHVwbGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTMKICAgIC8vIGNsYXNzIE5hbWVkVHVwbGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMubmFtZWRfdHVwbGVzLmNvbnRyYWN0Lk5hbWVkVHVwbGVzQ29udHJhY3QuYnVpbGRfdHVwbGUoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmJ1aWxkX3R1cGxlOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGJ1aWxkX3R1cGxlKHNlbGYsIGE6IFVJbnQ2NCwgYjogQmlnVUludCwgYzogU3RyaW5nLCBkOiBCeXRlcykgLT4gVGVzdFR1cGxlOgogICAgcHJvdG8gNCA0CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTcKICAgIC8vIHQxID0gc2VsZi5idWlsZF90dXBsZV9ieV9uYW1lKGEsIGIsIGMsIGQpCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYnVpbGRfdHVwbGVfYnlfbmFtZQogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE4CiAgICAvLyB0MiA9IHNlbGYuYnVpbGRfdHVwbGVfYnlfcG9zaXRpb24oYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBidWlsZF90dXBsZV9ieV9wb3NpdGlvbgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBhc3NlcnQgdDEgPT0gdDIKICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgID09CiAgICBkaWcgNgogICAgdW5jb3ZlciA0CiAgICBiPT0KICAgICYmCiAgICBkaWcgNAogICAgdW5jb3ZlciAzCiAgICA9PQogICAgJiYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjAKICAgIC8vIHJldHVybiB0MQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC5idWlsZF90dXBsZV9ieV9uYW1lKGE6IHVpbnQ2NCwgYjogYnl0ZXMsIGM6IGJ5dGVzLCBkOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgpidWlsZF90dXBsZV9ieV9uYW1lOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjIyLTIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJ1aWxkX3R1cGxlX2J5X25hbWUoc2VsZiwgYTogVUludDY0LCBiOiBCaWdVSW50LCBjOiBTdHJpbmcsIGQ6IEJ5dGVzKSAtPiBUZXN0VHVwbGU6CiAgICBwcm90byA0IDQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToyNAogICAgLy8gcmV0dXJuIFRlc3RUdXBsZShhPWEsIGI9YiwgYz1jLCBkPWQpCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMubmFtZWRfdHVwbGVzLmNvbnRyYWN0Lk5hbWVkVHVwbGVzQ29udHJhY3QuYnVpbGRfdHVwbGVfYnlfcG9zaXRpb24oYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmJ1aWxkX3R1cGxlX2J5X3Bvc2l0aW9uOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJ1aWxkX3R1cGxlX2J5X3Bvc2l0aW9uKHNlbGYsIGE6IFVJbnQ2NCwgYjogQmlnVUludCwgYzogU3RyaW5nLCBkOiBCeXRlcykgLT4gVGVzdFR1cGxlOgogICAgcHJvdG8gNCA0CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjgKICAgIC8vIHJldHVybiBUZXN0VHVwbGUoYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC50ZXN0X3R1cGxlKHZhbHVlLmE6IHVpbnQ2NCwgdmFsdWUuYjogYnl0ZXMsIHZhbHVlLmM6IGJ5dGVzLCB2YWx1ZS5kOiBieXRlcykgLT4gdm9pZDoKdGVzdF90dXBsZToKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMC0zMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3R1cGxlKHNlbGYsIHZhbHVlOiBUZXN0VHVwbGUpIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlLmEgPCAxMDAwCiAgICBmcmFtZV9kaWcgLTQKICAgIHB1c2hpbnQgMTAwMCAvLyAxMDAwCiAgICA8CiAgICBhc3NlcnQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMwogICAgLy8gYXNzZXJ0IHZhbHVlLmIgPCAyKio2NQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgMHgwMjAwMDAwMDAwMDAwMDAwMDAKICAgIGI8CiAgICBhc3NlcnQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IHZhbHVlLmMuYnl0ZXMubGVuZ3RoID4gMQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozNQogICAgLy8gYXNzZXJ0IHZhbHVlLmQgPT0gVHhuLnNlbmRlci5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQ1NmVlYWNlIDB4NmY5ZjViZjAgLy8gbWV0aG9kICJidWlsZF90dXBsZSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSIsIG1ldGhvZCAidGVzdF90dXBsZSgodWludDY0LHVpbnQ1MTIsc3RyaW5nLGJ5dGVbXSkpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2J1aWxkX3R1cGxlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF90dXBsZV9yb3V0ZUAzCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idWlsZF90dXBsZV9yb3V0ZUAyOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIE5hbWVkVHVwbGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJ1aWxkX3R1cGxlCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA0CiAgICBifAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwNGMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA3NiAvLyA3NgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3R1cGxlX3JvdXRlQDM6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfdHVwbGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBOYW1lZFR1cGxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC5idWlsZF90dXBsZShhOiB1aW50NjQsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKYnVpbGRfdHVwbGU6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTctMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYnVpbGRfdHVwbGUoc2VsZiwgYTogVUludDY0LCBiOiBCaWdVSW50LCBjOiBTdHJpbmcsIGQ6IEJ5dGVzKSAtPiBUZXN0VHVwbGU6CiAgICBwcm90byA0IDQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxOQogICAgLy8gdDEgPSBzZWxmLmJ1aWxkX3R1cGxlX2J5X25hbWUoYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBidWlsZF90dXBsZV9ieV9uYW1lCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjAKICAgIC8vIHQyID0gc2VsZi5idWlsZF90dXBsZV9ieV9wb3NpdGlvbihhLCBiLCBjLCBkKQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGJ1aWxkX3R1cGxlX2J5X3Bvc2l0aW9uCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCB0MSA9PSB0MgogICAgZGlnIDcKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGRpZyA2CiAgICB1bmNvdmVyIDQKICAgIGI9PQogICAgJiYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDMKICAgID09CiAgICAmJgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToyMgogICAgLy8gcmV0dXJuIHQxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmJ1aWxkX3R1cGxlX2J5X25hbWUoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmJ1aWxkX3R1cGxlX2J5X25hbWU6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjQtMjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfdHVwbGVfYnlfbmFtZShzZWxmLCBhOiBVSW50NjQsIGI6IEJpZ1VJbnQsIGM6IFN0cmluZywgZDogQnl0ZXMpIC0+IFRlc3RUdXBsZToKICAgIHByb3RvIDQgNAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXR1cm4gVGVzdFR1cGxlKGE9YSwgYj1iLCBjPWMsIGQ9ZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC5idWlsZF90dXBsZV9ieV9wb3NpdGlvbihhOiB1aW50NjQsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKYnVpbGRfdHVwbGVfYnlfcG9zaXRpb246CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfdHVwbGVfYnlfcG9zaXRpb24oc2VsZiwgYTogVUludDY0LCBiOiBCaWdVSW50LCBjOiBTdHJpbmcsIGQ6IEJ5dGVzKSAtPiBUZXN0VHVwbGU6CiAgICBwcm90byA0IDQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMAogICAgLy8gcmV0dXJuIFRlc3RUdXBsZShhLCBiLCBjLCBkKQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LnRlc3RfdHVwbGUodmFsdWUuYTogdWludDY0LCB2YWx1ZS5iOiBieXRlcywgdmFsdWUuYzogYnl0ZXMsIHZhbHVlLmQ6IGJ5dGVzKSAtPiB2b2lkOgp0ZXN0X3R1cGxlOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfdHVwbGUoc2VsZiwgdmFsdWU6IFRlc3RUdXBsZSkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NlcnQgdmFsdWUuYSA8IDEwMDAKICAgIGZyYW1lX2RpZyAtNAogICAgcHVzaGludCAxMDAwIC8vIDEwMDAKICAgIDwKICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgdmFsdWUuYiA8IDIqKjY1CiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAweDAyMDAwMDAwMDAwMDAwMDAwMAogICAgYjwKICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NlcnQgdmFsdWUuYy5ieXRlcy5sZW5ndGggPiAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID4KICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBhc3NlcnQgdmFsdWUuZCA9PSBUeG4uc2VuZGVyLmJ5dGVzCiAgICBmcmFtZV9kaWcgLTEKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/named_tuples/out/NamedTuplesContract.arc56.json b/test_cases/named_tuples/out/NamedTuplesContract.arc56.json new file mode 100644 index 0000000000..4169e3d534 --- /dev/null +++ b/test_cases/named_tuples/out/NamedTuplesContract.arc56.json @@ -0,0 +1,169 @@ +{ + "name": "NamedTuplesContract", + "structs": { + "TestTuple": [ + { + "name": "a", + "type": "uint64" + }, + { + "name": "b", + "type": "uint512" + }, + { + "name": "c", + "type": "string" + }, + { + "name": "d", + "type": "byte[]" + } + ] + }, + "methods": [ + { + "name": "build_tuple", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint512", + "name": "b" + }, + { + "type": "string", + "name": "c" + }, + { + "type": "byte[]", + "name": "d" + } + ], + "returns": { + "type": "(uint64,uint512,string,byte[])", + "struct": "TestTuple" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_tuple", + "args": [ + { + "type": "(uint64,uint512,string,byte[])", + "struct": "TestTuple", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 44, + 144 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 207 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 47, + 147 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 78 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQ1NmVlYWNlIDB4NmY5ZjViZjAgLy8gbWV0aG9kICJidWlsZF90dXBsZSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSh1aW50NjQsdWludDUxMixzdHJpbmcsYnl0ZVtdKSIsIG1ldGhvZCAidGVzdF90dXBsZSgodWludDY0LHVpbnQ1MTIsc3RyaW5nLGJ5dGVbXSkpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2J1aWxkX3R1cGxlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF90dXBsZV9yb3V0ZUAzCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idWlsZF90dXBsZV9yb3V0ZUAyOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIE5hbWVkVHVwbGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJ1aWxkX3R1cGxlCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA0CiAgICBifAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwNGMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA3NiAvLyA3NgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3R1cGxlX3JvdXRlQDM6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfdHVwbGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBOYW1lZFR1cGxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgTmFtZWRUdXBsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC5idWlsZF90dXBsZShhOiB1aW50NjQsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKYnVpbGRfdHVwbGU6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MTctMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYnVpbGRfdHVwbGUoc2VsZiwgYTogVUludDY0LCBiOiBCaWdVSW50LCBjOiBTdHJpbmcsIGQ6IEJ5dGVzKSAtPiBUZXN0VHVwbGU6CiAgICBwcm90byA0IDQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToxOQogICAgLy8gdDEgPSBzZWxmLmJ1aWxkX3R1cGxlX2J5X25hbWUoYSwgYiwgYywgZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBidWlsZF90dXBsZV9ieV9uYW1lCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjAKICAgIC8vIHQyID0gc2VsZi5idWlsZF90dXBsZV9ieV9wb3NpdGlvbihhLCBiLCBjLCBkKQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGJ1aWxkX3R1cGxlX2J5X3Bvc2l0aW9uCiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCB0MSA9PSB0MgogICAgZGlnIDcKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGRpZyA2CiAgICB1bmNvdmVyIDQKICAgIGI9PQogICAgJiYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDMKICAgID09CiAgICAmJgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weToyMgogICAgLy8gcmV0dXJuIHQxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmJ1aWxkX3R1cGxlX2J5X25hbWUoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmJ1aWxkX3R1cGxlX2J5X25hbWU6CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjQtMjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfdHVwbGVfYnlfbmFtZShzZWxmLCBhOiBVSW50NjQsIGI6IEJpZ1VJbnQsIGM6IFN0cmluZywgZDogQnl0ZXMpIC0+IFRlc3RUdXBsZToKICAgIHByb3RvIDQgNAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXR1cm4gVGVzdFR1cGxlKGE9YSwgYj1iLCBjPWMsIGQ9ZCkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5uYW1lZF90dXBsZXMuY29udHJhY3QuTmFtZWRUdXBsZXNDb250cmFjdC5idWlsZF90dXBsZV9ieV9wb3NpdGlvbihhOiB1aW50NjQsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKYnVpbGRfdHVwbGVfYnlfcG9zaXRpb246CiAgICAvLyBuYW1lZF90dXBsZXMvY29udHJhY3QucHk6MjgtMjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfdHVwbGVfYnlfcG9zaXRpb24oc2VsZiwgYTogVUludDY0LCBiOiBCaWdVSW50LCBjOiBTdHJpbmcsIGQ6IEJ5dGVzKSAtPiBUZXN0VHVwbGU6CiAgICBwcm90byA0IDQKICAgIC8vIG5hbWVkX3R1cGxlcy9jb250cmFjdC5weTozMAogICAgLy8gcmV0dXJuIFRlc3RUdXBsZShhLCBiLCBjLCBkKQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LnRlc3RfdHVwbGUodmFsdWUuYTogdWludDY0LCB2YWx1ZS5iOiBieXRlcywgdmFsdWUuYzogYnl0ZXMsIHZhbHVlLmQ6IGJ5dGVzKSAtPiB2b2lkOgp0ZXN0X3R1cGxlOgogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfdHVwbGUoc2VsZiwgdmFsdWU6IFRlc3RUdXBsZSkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NlcnQgdmFsdWUuYSA8IDEwMDAKICAgIGZyYW1lX2RpZyAtNAogICAgcHVzaGludCAxMDAwIC8vIDEwMDAKICAgIDwKICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgdmFsdWUuYiA8IDIqKjY1CiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAweDAyMDAwMDAwMDAwMDAwMDAwMAogICAgYjwKICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NlcnQgdmFsdWUuYy5ieXRlcy5sZW5ndGggPiAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID4KICAgIGFzc2VydAogICAgLy8gbmFtZWRfdHVwbGVzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBhc3NlcnQgdmFsdWUuZCA9PSBUeG4uc2VuZGVyLmJ5dGVzCiAgICBmcmFtZV9kaWcgLTEKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLm5hbWVkX3R1cGxlcy5jb250cmFjdC5OYW1lZFR1cGxlc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAQBAiAABQ4oAATEbQQC1ggIERW7qzgRvn1vwNhoAjgIAAgBmI4kxGRREMRhENhoBFzYaAjYaA1cCADYaBFcCAIgAjk8DFksDFSQORCSvTwSrSwMVFlcGAk8EUEsDFRZXBgJPBFBPA08DUIACAExQSwIVgUwIFlcGAlBPAlBMUIAEFR98dUxQsCKJMRkURDEYRDYaAUlXAAgXSwFXCEBLAoFIWUsDgUpZSwRPAksCUlcCAEsEFU8FTwNPAlJXAgCIAFkiiTEZQAAGMRgURCKJI4mKBASL/Iv9i/6L/4gAJIv8i/2L/ov/iAAlSwdPBBJLBk8EqBBLBE8DEhBLAk8CEhBEiYoEBIv8i/2L/ov/iYoEBIv8i/2L/ov/iYoEAIv8gegHDESL/YAJAgAAAAAAAAAApESL/hUiDUSL/zEAEkSJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/named_tuples/out/NamedTuplesContract.destructured.ir b/test_cases/named_tuples/out/NamedTuplesContract.destructured.ir index d4989d9edc..fdab88bef3 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.destructured.ir +++ b/test_cases/named_tuples/out/NamedTuplesContract.destructured.ir @@ -6,18 +6,18 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) goto tmp%0#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -52,12 +52,12 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%19#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -71,19 +71,19 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) goto tmp%20#0 ? block@10 : block@7 block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating return 1u - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -97,15 +97,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/out/NamedTuplesContract.ssa.ir b/test_cases/named_tuples/out/NamedTuplesContract.ssa.ir index 51589b7392..debd4b3f79 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.ssa.ir +++ b/test_cases/named_tuples/out/NamedTuplesContract.ssa.ir @@ -6,20 +6,20 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) let tmp%1#0: bool = (!= tmp%0#0 0u) goto tmp%1#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@4} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -61,13 +61,13 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = (extract3 tmp%19#0 0u 8u) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -82,28 +82,28 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@4: // switch_case_default_L13 + block@4: // switch_case_default_L15 goto block@5 - block@5: // switch_case_next_L13 + block@5: // switch_case_next_L15 goto block@10 - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) switch tmp%20#0 {0u => block@7, * => block@8} block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (== tmp%21#0 0u) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating test_cases.named_tuples.contract.NamedTuplesContract.__algopy_default_create() return 1u - block@8: // switch_case_default_L13 + block@8: // switch_case_default_L15 goto block@9 - block@9: // switch_case_next_L13 + block@9: // switch_case_next_L15 goto block@10 - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -117,15 +117,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_1.ir b/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_1.ir index a7be948f71..f71333d7a6 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_1.ir +++ b/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_1.ir @@ -6,18 +6,18 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) goto tmp%0#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -54,12 +54,12 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%19#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -73,19 +73,19 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) goto tmp%20#0 ? block@10 : block@7 block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating return 1u - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -99,15 +99,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_2.ir b/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_2.ir index d4989d9edc..fdab88bef3 100644 --- a/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_2.ir +++ b/test_cases/named_tuples/out/NamedTuplesContract.ssa.opt_pass_2.ir @@ -6,18 +6,18 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) goto tmp%0#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -52,12 +52,12 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%19#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -71,19 +71,19 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) goto tmp%20#0 ? block@10 : block@7 block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating return 1u - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -97,15 +97,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/out_O2/NamedTuplesContract.approval.teal b/test_cases/named_tuples/out_O2/NamedTuplesContract.approval.teal index 71f0eed1d1..2db30643b8 100644 --- a/test_cases/named_tuples/out_O2/NamedTuplesContract.approval.teal +++ b/test_cases/named_tuples/out_O2/NamedTuplesContract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___build_tuple_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txna ApplicationArgs 2 @@ -80,9 +80,9 @@ __puya_arc4_router___build_tuple_route@2: __puya_arc4_router___test_tuple_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -116,7 +116,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/named_tuples/out_O2/NamedTuplesContract.destructured.ir b/test_cases/named_tuples/out_O2/NamedTuplesContract.destructured.ir index d4989d9edc..fdab88bef3 100644 --- a/test_cases/named_tuples/out_O2/NamedTuplesContract.destructured.ir +++ b/test_cases/named_tuples/out_O2/NamedTuplesContract.destructured.ir @@ -6,18 +6,18 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) goto tmp%0#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -52,12 +52,12 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (! tmp%15#0) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = ((extract 0 8) tmp%19#0) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -71,19 +71,19 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) goto tmp%20#0 ? block@10 : block@7 block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating return 1u - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -97,15 +97,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.approval.teal b/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.approval.teal index 1c85352e43..dfa25cf38b 100644 --- a/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.approval.teal +++ b/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.approval.teal @@ -8,7 +8,7 @@ test_cases.named_tuples.contract.NamedTuplesContract.approval_program: // test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> uint64: __puya_arc4_router__: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): proto 0 1 txn NumAppArgs @@ -23,17 +23,17 @@ __puya_arc4_router__: b __puya_arc4_router___switch_case_default@4 __puya_arc4_router___build_tuple_route@2: - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 btoi @@ -42,7 +42,7 @@ __puya_arc4_router___build_tuple_route@2: extract 2 0 txna ApplicationArgs 4 extract 2 0 - // named_tuples/contract.py:15 + // named_tuples/contract.py:17 // @arc4.abimethod() uncover 3 uncover 3 @@ -105,17 +105,17 @@ __puya_arc4_router___build_tuple_route@2: retsub __puya_arc4_router___test_tuple_route@3: - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating - // named_tuples/contract.py:13 + assert // can only call when not creating + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txna ApplicationArgs 1 dup @@ -153,7 +153,7 @@ __puya_arc4_router___test_tuple_route@3: uncover 2 substring3 extract 2 0 - // named_tuples/contract.py:30 + // named_tuples/contract.py:32 // @arc4.abimethod() uncover 3 uncover 3 @@ -167,7 +167,7 @@ __puya_arc4_router___switch_case_default@4: b __puya_arc4_router___after_if_else@10 __puya_arc4_router___bare_routing@6: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): txn OnCompletion intc_0 // 0 @@ -179,7 +179,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub @@ -187,7 +187,7 @@ __puya_arc4_router_____algopy_default_create@7: __puya_arc4_router___switch_case_default@8: __puya_arc4_router___after_if_else@10: - // named_tuples/contract.py:13 + // named_tuples/contract.py:15 // class NamedTuplesContract(arc4.ARC4Contract): intc_0 // 0 retsub @@ -195,11 +195,11 @@ __puya_arc4_router___after_if_else@10: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple: - // named_tuples/contract.py:15-16 + // named_tuples/contract.py:17-18 // @arc4.abimethod() // def build_tuple(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:17 + // named_tuples/contract.py:19 // t1 = self.build_tuple_by_name(a, b, c, d) frame_dig -4 frame_dig -3 @@ -209,7 +209,7 @@ build_tuple: cover 3 cover 2 swap - // named_tuples/contract.py:18 + // named_tuples/contract.py:20 // t2 = self.build_tuple_by_position(a, b, c, d) frame_dig -4 frame_dig -3 @@ -219,7 +219,7 @@ build_tuple: cover 6 cover 4 swap - // named_tuples/contract.py:19 + // named_tuples/contract.py:21 // assert t1 == t2 dig 2 == @@ -236,7 +236,7 @@ build_tuple: == && assert - // named_tuples/contract.py:20 + // named_tuples/contract.py:22 // return t1 swap uncover 2 @@ -246,11 +246,11 @@ build_tuple: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_name: - // named_tuples/contract.py:22-23 + // named_tuples/contract.py:24-25 // @subroutine // def build_tuple_by_name(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:24 + // named_tuples/contract.py:26 // return TestTuple(a=a, b=b, c=c, d=d) frame_dig -4 frame_dig -3 @@ -261,11 +261,11 @@ build_tuple_by_name: // test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: bytes, c: bytes, d: bytes) -> uint64, bytes, bytes, bytes: build_tuple_by_position: - // named_tuples/contract.py:26-27 + // named_tuples/contract.py:28-29 // @subroutine // def build_tuple_by_position(self, a: UInt64, b: BigUInt, c: String, d: Bytes) -> TestTuple: proto 4 4 - // named_tuples/contract.py:28 + // named_tuples/contract.py:30 // return TestTuple(a, b, c, d) frame_dig -4 frame_dig -3 @@ -276,30 +276,30 @@ build_tuple_by_position: // test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: bytes, value.c: bytes, value.d: bytes) -> void: test_tuple: - // named_tuples/contract.py:30-31 + // named_tuples/contract.py:32-33 // @arc4.abimethod() // def test_tuple(self, value: TestTuple) -> None: proto 4 0 - // named_tuples/contract.py:32 + // named_tuples/contract.py:34 // assert value.a < 1000 frame_dig -4 pushint 1000 // 1000 < assert - // named_tuples/contract.py:33 + // named_tuples/contract.py:35 // assert value.b < 2**65 frame_dig -3 pushbytes 0x020000000000000000 b< assert - // named_tuples/contract.py:34 + // named_tuples/contract.py:36 // assert value.c.bytes.length > 1 frame_dig -2 len intc_1 // 1 > assert - // named_tuples/contract.py:35 + // named_tuples/contract.py:37 // assert value.d == Txn.sender.bytes txn Sender frame_dig -1 diff --git a/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.destructured.ir b/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.destructured.ir index 1f7ed0b2b0..358f1cda61 100644 --- a/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.destructured.ir +++ b/test_cases/named_tuples/out_unoptimized/NamedTuplesContract.destructured.ir @@ -6,20 +6,20 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return tmp%0#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__() -> bool: - block@0: // L13 + block@0: // L15 let tmp%0#0: uint64 = (txn NumAppArgs) let tmp%1#0: bool = (!= tmp%0#0 0u) goto tmp%1#0 ? block@1 : block@6 - block@1: // abi_routing_L13 + block@1: // abi_routing_L15 let tmp%2#0: bytes = (txna ApplicationArgs 0) switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@4} - block@2: // build_tuple_route_L15 + block@2: // build_tuple_route_L17 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: uint64 = (btoi tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -57,13 +57,13 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let tmp%14#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0) (log tmp%14#0) return 1u - block@3: // test_tuple_route_L30 + block@3: // test_tuple_route_L32 let tmp%15#0: uint64 = (txn OnCompletion) let tmp%16#0: bool = (== tmp%15#0 NoOp) - (assert tmp%16#0) // OnCompletion is NoOp + (assert tmp%16#0) // OnCompletion is not NoOp let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating let tmp%19#0: bytes = (txna ApplicationArgs 1) let item0%0#0: bytes = (extract3 tmp%19#0 0u 8u) // on error: Index access is out of bounds let item0%0%0#0: uint64 = (btoi item0%0#0) @@ -78,28 +78,28 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: let item3%0%0#0: bytes = ((extract 2 0) item3%0#0) test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(item0%0%0#0, item1%0#0, item2%0%0#0, item3%0%0#0) return 1u - block@4: // switch_case_default_L13 + block@4: // switch_case_default_L15 goto block@5 - block@5: // switch_case_next_L13 + block@5: // switch_case_next_L15 goto block@10 - block@6: // bare_routing_L13 + block@6: // bare_routing_L15 let tmp%20#0: uint64 = (txn OnCompletion) switch tmp%20#0 {0u => block@7, * => block@8} block@7: // __algopy_default_create_L1 let tmp%21#0: uint64 = (txn ApplicationID) let tmp%22#0: bool = (== tmp%21#0 0u) - (assert tmp%22#0) // is creating + (assert tmp%22#0) // can only call when creating test_cases.named_tuples.contract.NamedTuplesContract.__algopy_default_create() return 1u - block@8: // switch_case_default_L13 + block@8: // switch_case_default_L15 goto block@9 - block@9: // switch_case_next_L13 + block@9: // switch_case_next_L15 goto block@10 - block@10: // after_if_else_L13 + block@10: // after_if_else_L15 return 0u subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L15 + block@0: // L17 let (t1.a#0: uint64, t1.b#0: biguint, t1.c#0: bytes, t1.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a#0, b#0, c#0, d#0) let (t2.a#0: uint64, t2.b#0: biguint, t2.c#0: bytes, t2.d#0: bytes) = test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a#0, b#0, c#0, d#0) let tmp%0#0: bool = (== t1.a#0 t2.a#0) @@ -113,15 +113,15 @@ contract test_cases.named_tuples.contract.NamedTuplesContract: return t1.a#0 t1.b#0 t1.c#0 t1.d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_name(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L22 + block@0: // L24 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.build_tuple_by_position(a: uint64, b: biguint, c: bytes, d: bytes) -> : - block@0: // L26 + block@0: // L28 return a#0 b#0 c#0 d#0 subroutine test_cases.named_tuples.contract.NamedTuplesContract.test_tuple(value.a: uint64, value.b: biguint, value.c: bytes, value.d: bytes) -> void: - block@0: // L30 + block@0: // L32 let tmp%0#0: bool = (< value.a#0 1000u) (assert tmp%0#0) let tmp%1#0: bool = (b< value.b#0 36893488147419103232b) diff --git a/test_cases/named_tuples/puya.log b/test_cases/named_tuples/puya.log index 966fe3fdf3..93e020afa8 100644 --- a/test_cases/named_tuples/puya.log +++ b/test_cases/named_tuples/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['named_tuples'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['named_tuples'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing named_tuples/out/module.awst debug: Sealing block@0: // L12 @@ -350,36 +350,36 @@ debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#1: bytes debug: Added array_head_and_tail#2 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#2 <- block@3) in block@3: // for_footer_L327 debug: Sealing block@4: // after_for_L327 debug: Terminated block@4: // after_for_L327 -debug: Sealing block@0: // L13 -debug: Terminated block@0: // L13 -debug: Sealing block@1: // abi_routing_L13 -debug: Terminated block@1: // abi_routing_L13 -debug: Sealing block@2: // build_tuple_route_L15 -debug: Terminated block@2: // build_tuple_route_L15 -debug: Sealing block@3: // test_tuple_route_L30 -debug: Terminated block@3: // test_tuple_route_L30 -debug: Sealing block@4: // switch_case_default_L13 -debug: Terminated block@4: // switch_case_default_L13 -debug: Sealing block@5: // switch_case_next_L13 -debug: Terminated block@5: // switch_case_next_L13 -debug: Sealing block@6: // bare_routing_L13 -debug: Terminated block@6: // bare_routing_L13 -debug: Sealing block@7: // __algopy_default_create_L1 -debug: Terminated block@7: // __algopy_default_create_L1 -debug: Sealing block@8: // switch_case_default_L13 -debug: Terminated block@8: // switch_case_default_L13 -debug: Sealing block@9: // switch_case_next_L13 -debug: Terminated block@9: // switch_case_next_L13 -debug: Sealing block@10: // after_if_else_L13 -debug: Terminated block@10: // after_if_else_L13 debug: Sealing block@0: // L15 debug: Terminated block@0: // L15 -debug: Sealing block@0: // L22 -debug: Terminated block@0: // L22 -debug: Sealing block@0: // L26 -debug: Terminated block@0: // L26 -debug: Sealing block@0: // L30 -debug: Terminated block@0: // L30 +debug: Sealing block@1: // abi_routing_L15 +debug: Terminated block@1: // abi_routing_L15 +debug: Sealing block@2: // build_tuple_route_L17 +debug: Terminated block@2: // build_tuple_route_L17 +debug: Sealing block@3: // test_tuple_route_L32 +debug: Terminated block@3: // test_tuple_route_L32 +debug: Sealing block@4: // switch_case_default_L15 +debug: Terminated block@4: // switch_case_default_L15 +debug: Sealing block@5: // switch_case_next_L15 +debug: Terminated block@5: // switch_case_next_L15 +debug: Sealing block@6: // bare_routing_L15 +debug: Terminated block@6: // bare_routing_L15 +debug: Sealing block@7: // __algopy_default_create_L1 +debug: Terminated block@7: // __algopy_default_create_L1 +debug: Sealing block@8: // switch_case_default_L15 +debug: Terminated block@8: // switch_case_default_L15 +debug: Sealing block@9: // switch_case_next_L15 +debug: Terminated block@9: // switch_case_next_L15 +debug: Sealing block@10: // after_if_else_L15 +debug: Terminated block@10: // after_if_else_L15 +debug: Sealing block@0: // L17 +debug: Terminated block@0: // L17 +debug: Sealing block@0: // L24 +debug: Terminated block@0: // L24 +debug: Sealing block@0: // L28 +debug: Terminated block@0: // L28 +debug: Sealing block@0: // L32 +debug: Terminated block@0: // L32 debug: Sealing block@0: // L1 debug: Terminated block@0: // L1 debug: Sealing block@0: // L1 @@ -427,28 +427,28 @@ debug: Optimizer: Inner Txn Field Replacer debug: Optimizer: Replace Compiled References debug: Optimizer: Simplify Control Ops debug: inlining the default target of a switch/goto nth -debug: adding block@1: // abi_routing_L13 as a predecessor of block@5: // switch_case_next_L13 due to inlining of block@4: // switch_case_default_L13 -debug: simplified terminator of block@1: // abi_routing_L13 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@4} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@5} +debug: adding block@1: // abi_routing_L15 as a predecessor of block@5: // switch_case_next_L15 due to inlining of block@4: // switch_case_default_L15 +debug: simplified terminator of block@1: // abi_routing_L15 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@4} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@5} debug: simplifying a switch with constants into goto nth -debug: simplified terminator of block@6: // bare_routing_L13 from switch tmp%20#0 {0u => block@7, * => block@8} to goto_nth [block@7][tmp%20#0] else goto block@8 +debug: simplified terminator of block@6: // bare_routing_L15 from switch tmp%20#0 {0u => block@7, * => block@8} to goto_nth [block@7][tmp%20#0] else goto block@8 debug: inlining the default target of a switch/goto nth -debug: adding block@1: // abi_routing_L13 as a predecessor of block@10: // after_if_else_L13 due to inlining of block@5: // switch_case_next_L13 -debug: simplified terminator of block@1: // abi_routing_L13 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@5} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@10} +debug: adding block@1: // abi_routing_L15 as a predecessor of block@10: // after_if_else_L15 due to inlining of block@5: // switch_case_next_L15 +debug: simplified terminator of block@1: // abi_routing_L15 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@5} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@10} debug: simplifying a goto nth with two targets into a conditional branch -debug: simplified terminator of block@6: // bare_routing_L13 from goto_nth [block@7][tmp%20#0] else goto block@8 to goto tmp%20#0 ? block@8 : block@7 +debug: simplified terminator of block@6: // bare_routing_L15 from goto_nth [block@7][tmp%20#0] else goto block@8 to goto tmp%20#0 ? block@8 : block@7 debug: inlining the default target of a switch/goto nth -debug: simplified terminator of block@1: // abi_routing_L13 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@10} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} +debug: simplified terminator of block@1: // abi_routing_L15 from switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => block@10} to switch tmp%2#0 {method "build_tuple(uint64,uint512,string,byte[])(uint64,uint512,string,byte[])" => block@2, method "test_tuple((uint64,uint512,string,byte[]))void" => block@3, * => return 0u} debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@5: // switch_case_next_L13 with block@4: // switch_case_default_L13 in block@10: // after_if_else_L13 -debug: Merged linear block@5: // switch_case_next_L13 into block@4: // switch_case_default_L13 -debug: Replaced predecessor block@9: // switch_case_next_L13 with block@8: // switch_case_default_L13 in block@10: // after_if_else_L13 -debug: Merged linear block@9: // switch_case_next_L13 into block@8: // switch_case_default_L13 +debug: Replaced predecessor block@5: // switch_case_next_L15 with block@4: // switch_case_default_L15 in block@10: // after_if_else_L15 +debug: Merged linear block@5: // switch_case_next_L15 into block@4: // switch_case_default_L15 +debug: Replaced predecessor block@9: // switch_case_next_L15 with block@8: // switch_case_default_L15 in block@10: // after_if_else_L15 +debug: Merged linear block@9: // switch_case_next_L15 into block@8: // switch_case_default_L15 debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@4: // switch_case_default_L13 -debug: Removed empty block: block@8: // switch_case_default_L13 +debug: Removed empty block: block@4: // switch_case_default_L15 +debug: Removed empty block: block@8: // switch_case_default_L15 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Replacing redundant declaration let item_start_offset%1#0: uint64 = (extract_uint16 tmp%19#0 74u) with copy of existing registers (Register(source_location=named_tuples/contract.py:13, ir_type=uint64, name='item_end_offset%0', version=0),) +debug: Replacing redundant declaration let item_start_offset%1#0: uint64 = (extract_uint16 tmp%19#0 74u) with copy of existing registers (Register(source_location=named_tuples/contract.py:15, ir_type=uint64, name='item_end_offset%0', version=0),) debug: Found equivalence set: val_as_bytes%0#0, encoded_tuple_buffer%1#0 debug: Replacing {encoded_tuple_buffer%1#0} with val_as_bytes%0#0 made 1 modifications debug: Found equivalence set: item_end_offset%0#0, item_start_offset%1#0 @@ -945,6 +945,7 @@ debug: Inserted test_tuple_block@0.ops[26]: 'l-store-copy tmp%4#0 0' debug: Replaced test_tuple_block@0.ops[29]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 3 edge set/s for test_cases.named_tuples.contract.NamedTuplesContract.__puya_arc4_router__ info: Writing named_tuples/out/NamedTuplesContract.arc32.json +info: Writing named_tuples/out/NamedTuplesContract.arc56.json info: Writing named_tuples/out/NamedTuplesContract.approval.teal info: Writing named_tuples/out/NamedTuplesContract.clear.teal info: Writing named_tuples/out/NamedTuplesContract.approval.bin diff --git a/test_cases/nested_loops/puya.log b/test_cases/nested_loops/puya.log index dad0bd3cdd..e994633abf 100644 --- a/test_cases/nested_loops/puya.log +++ b/test_cases/nested_loops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['nested_loops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['nested_loops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing nested_loops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/regression_tests/out/Issue118.approval.mir b/test_cases/regression_tests/out/Issue118.approval.mir index 36de54c57e..e30d064462 100644 --- a/test_cases/regression_tests/out/Issue118.approval.mir +++ b/test_cases/regression_tests/out/Issue118.approval.mir @@ -33,9 +33,9 @@ __puya_arc4_router___verify_route@2: // @abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // regression_tests/issue_118.py:5 // class Issue118(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -59,7 +59,7 @@ __puya_arc4_router___bare_routing@5: __puya_arc4_router_____algopy_default_create@6: txn ApplicationID tmp%11#0 ! tmp%12#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/regression_tests/out/Issue118.approval.teal b/test_cases/regression_tests/out/Issue118.approval.teal index 7e7a1ea440..9f939143a7 100644 --- a/test_cases/regression_tests/out/Issue118.approval.teal +++ b/test_cases/regression_tests/out/Issue118.approval.teal @@ -26,9 +26,9 @@ __puya_arc4_router___verify_route@2: // @abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // regression_tests/issue_118.py:5 // class Issue118(ARC4Contract): txna ApplicationArgs 1 @@ -50,7 +50,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/regression_tests/out/Issue118.arc32.json b/test_cases/regression_tests/out/Issue118.arc32.json index c8c44bacdc..1073f11c55 100644 --- a/test_cases/regression_tests/out/Issue118.arc32.json +++ b/test_cases/regression_tests/out/Issue118.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MDAwMyAweDAwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVncmVzc2lvbl90ZXN0cy5pc3N1ZV8xMTguSXNzdWUxMTguX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHhiYzY2ZWI2MiAvLyBtZXRob2QgInZlcmlmeSh1aW50MjU2W10pKGJvb2wsc3RyaW5nKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtNwogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo1CiAgICAvLyBjbGFzcyBJc3N1ZTExOChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6Ni03CiAgICAvLyAjIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FsZ29yYW5kZm91bmRhdGlvbi9wdXlhL2lzc3Vlcy8xMTgKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWdyZXNzaW9uX3Rlc3RzLmlzc3VlXzExOC5Jc3N1ZTExOC52ZXJpZnkodmFsdWVzOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtOAogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHZhbHVlczogRHluYW1pY0FycmF5W1VJbnQyNTZdKSAtPiBUdXBsZVtCb29sLCBTdHJpbmddOgogICAgcHJvdG8gMSAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo5LTExCiAgICAvLyB2YWwxID0gQm9vbCgKICAgIC8vICAgICBib29sKFR4bi5udW1fYXBwX2FyZ3MpCiAgICAvLyApICAjIHVzZSBhIG5vbiBjb25zdGFudCB2YWx1ZSBzbyB0aGUgcmVwZWF0ZWQgZXhwcmVzc2lvbiBpcyBub3Qgc2ltcGxpZmllZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMAogICAgLy8gYm9vbChUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjktMTEKICAgIC8vIHZhbDEgPSBCb29sKAogICAgLy8gICAgIGJvb2woVHhuLm51bV9hcHBfYXJncykKICAgIC8vICkgICMgdXNlIGEgbm9uIGNvbnN0YW50IHZhbHVlIHNvIHRoZSByZXBlYXRlZCBleHByZXNzaW9uIGlzIG5vdCBzaW1wbGlmaWVkCiAgICBzZXRiaXQKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjEyCiAgICAvLyBpZiB2YWx1ZXMubGVuZ3RoICE9IDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICE9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMwogICAgLy8gcmV0dXJuIFR1cGxlKCh2YWwxLCBTdHJpbmcoIiIpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAzCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIHJldHN1YgoKdmVyaWZ5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjE0CiAgICAvLyByZXR1cm4gVHVwbGUoKHZhbDEsIFN0cmluZygiIikpKQogICAgYnl0ZWNfMCAvLyAweDAwMDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MDAwMyAweDAwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVncmVzc2lvbl90ZXN0cy5pc3N1ZV8xMTguSXNzdWUxMTguX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHhiYzY2ZWI2MiAvLyBtZXRob2QgInZlcmlmeSh1aW50MjU2W10pKGJvb2wsc3RyaW5nKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtNwogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo2LTcKICAgIC8vICMgcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL3B1eWEvaXNzdWVzLzExOAogICAgLy8gQGFiaW1ldGhvZAogICAgY2FsbHN1YiB2ZXJpZnkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo1CiAgICAvLyBjbGFzcyBJc3N1ZTExOChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWdyZXNzaW9uX3Rlc3RzLmlzc3VlXzExOC5Jc3N1ZTExOC52ZXJpZnkodmFsdWVzOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtOAogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHZhbHVlczogRHluYW1pY0FycmF5W1VJbnQyNTZdKSAtPiBUdXBsZVtCb29sLCBTdHJpbmddOgogICAgcHJvdG8gMSAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo5LTExCiAgICAvLyB2YWwxID0gQm9vbCgKICAgIC8vICAgICBib29sKFR4bi5udW1fYXBwX2FyZ3MpCiAgICAvLyApICAjIHVzZSBhIG5vbiBjb25zdGFudCB2YWx1ZSBzbyB0aGUgcmVwZWF0ZWQgZXhwcmVzc2lvbiBpcyBub3Qgc2ltcGxpZmllZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMAogICAgLy8gYm9vbChUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjktMTEKICAgIC8vIHZhbDEgPSBCb29sKAogICAgLy8gICAgIGJvb2woVHhuLm51bV9hcHBfYXJncykKICAgIC8vICkgICMgdXNlIGEgbm9uIGNvbnN0YW50IHZhbHVlIHNvIHRoZSByZXBlYXRlZCBleHByZXNzaW9uIGlzIG5vdCBzaW1wbGlmaWVkCiAgICBzZXRiaXQKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjEyCiAgICAvLyBpZiB2YWx1ZXMubGVuZ3RoICE9IDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICE9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMwogICAgLy8gcmV0dXJuIFR1cGxlKCh2YWwxLCBTdHJpbmcoIiIpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAzCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIHJldHN1YgoKdmVyaWZ5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjE0CiAgICAvLyByZXR1cm4gVHVwbGUoKHZhbDEsIFN0cmluZygiIikpKQogICAgYnl0ZWNfMCAvLyAweDAwMDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/regression_tests/out/Issue118.arc56.json b/test_cases/regression_tests/out/Issue118.arc56.json new file mode 100644 index 0000000000..d13c4ad1c0 --- /dev/null +++ b/test_cases/regression_tests/out/Issue118.arc56.json @@ -0,0 +1,107 @@ +{ + "name": "Issue118", + "structs": {}, + "methods": [ + { + "name": "verify", + "args": [ + { + "type": "uint256[]", + "name": "values" + } + ], + "returns": { + "type": "(bool,string)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 72 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 46 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MDAwMyAweDAwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVncmVzc2lvbl90ZXN0cy5pc3N1ZV8xMTguSXNzdWUxMTguX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHhiYzY2ZWI2MiAvLyBtZXRob2QgInZlcmlmeSh1aW50MjU2W10pKGJvb2wsc3RyaW5nKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtNwogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo2LTcKICAgIC8vICMgcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL3B1eWEvaXNzdWVzLzExOAogICAgLy8gQGFiaW1ldGhvZAogICAgY2FsbHN1YiB2ZXJpZnkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo1CiAgICAvLyBjbGFzcyBJc3N1ZTExOChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWdyZXNzaW9uX3Rlc3RzLmlzc3VlXzExOC5Jc3N1ZTExOC52ZXJpZnkodmFsdWVzOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtOAogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHZhbHVlczogRHluYW1pY0FycmF5W1VJbnQyNTZdKSAtPiBUdXBsZVtCb29sLCBTdHJpbmddOgogICAgcHJvdG8gMSAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo5LTExCiAgICAvLyB2YWwxID0gQm9vbCgKICAgIC8vICAgICBib29sKFR4bi5udW1fYXBwX2FyZ3MpCiAgICAvLyApICAjIHVzZSBhIG5vbiBjb25zdGFudCB2YWx1ZSBzbyB0aGUgcmVwZWF0ZWQgZXhwcmVzc2lvbiBpcyBub3Qgc2ltcGxpZmllZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMAogICAgLy8gYm9vbChUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjktMTEKICAgIC8vIHZhbDEgPSBCb29sKAogICAgLy8gICAgIGJvb2woVHhuLm51bV9hcHBfYXJncykKICAgIC8vICkgICMgdXNlIGEgbm9uIGNvbnN0YW50IHZhbHVlIHNvIHRoZSByZXBlYXRlZCBleHByZXNzaW9uIGlzIG5vdCBzaW1wbGlmaWVkCiAgICBzZXRiaXQKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjEyCiAgICAvLyBpZiB2YWx1ZXMubGVuZ3RoICE9IDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICE9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMwogICAgLy8gcmV0dXJuIFR1cGxlKCh2YWwxLCBTdHJpbmcoIiIpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAzCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIHJldHN1YgoKdmVyaWZ5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjE0CiAgICAvLyByZXR1cm4gVHVwbGUoKHZhbDEsIFN0cmluZygiIikpKQogICAgYnl0ZWNfMCAvLyAweDAwMDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAEmAgIAAwIAAIgAAUOKAAExG0EAJ4AEvGbrYjYaAI4BAAIiiTEZFEQxGEQ2GgGIABiABBUffHVMULAjiTEZQAAGMRgURCOJIomKAQGAAQAiMRtUi/8iWYECE0EABShQKVCJKFApUIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/regression_tests/out/Issue118.destructured.ir b/test_cases/regression_tests/out/Issue118.destructured.ir index fd132b620e..c3fa4fe92e 100644 --- a/test_cases/regression_tests/out/Issue118.destructured.ir +++ b/test_cases/regression_tests/out/Issue118.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -29,7 +29,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L5 return 0u diff --git a/test_cases/regression_tests/out/Issue118.ssa.ir b/test_cases/regression_tests/out/Issue118.ssa.ir index b6001b2cc4..f63685b254 100644 --- a/test_cases/regression_tests/out/Issue118.ssa.ir +++ b/test_cases/regression_tests/out/Issue118.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -35,7 +35,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating test_cases.regression_tests.issue_118.Issue118.__algopy_default_create() return 1u block@7: // switch_case_default_L5 diff --git a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_1.ir b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_1.ir index 60d62ca156..6f294420c3 100644 --- a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_1.ir +++ b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -29,7 +29,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L5 return 0u diff --git a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_2.ir b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_2.ir index 409cf08fa7..fb0d2c64b5 100644 --- a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_2.ir +++ b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -29,7 +29,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L5 return 0u diff --git a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_3.ir b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_3.ir index fd132b620e..c3fa4fe92e 100644 --- a/test_cases/regression_tests/out/Issue118.ssa.opt_pass_3.ir +++ b/test_cases/regression_tests/out/Issue118.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -29,7 +29,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L5 return 0u diff --git a/test_cases/regression_tests/out_O2/Issue118.approval.teal b/test_cases/regression_tests/out_O2/Issue118.approval.teal index 2c55832e67..9b7277f0bb 100644 --- a/test_cases/regression_tests/out_O2/Issue118.approval.teal +++ b/test_cases/regression_tests/out_O2/Issue118.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___verify_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub verify pushbytes 0x151f7c75 @@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5: bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/regression_tests/out_O2/Issue118.destructured.ir b/test_cases/regression_tests/out_O2/Issue118.destructured.ir index fd132b620e..c3fa4fe92e 100644 --- a/test_cases/regression_tests/out_O2/Issue118.destructured.ir +++ b/test_cases/regression_tests/out_O2/Issue118.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -29,7 +29,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating return 1u block@9: // after_if_else_L5 return 0u diff --git a/test_cases/regression_tests/out_unoptimized/Issue118.approval.teal b/test_cases/regression_tests/out_unoptimized/Issue118.approval.teal index 090f36947c..ef98e33e7c 100644 --- a/test_cases/regression_tests/out_unoptimized/Issue118.approval.teal +++ b/test_cases/regression_tests/out_unoptimized/Issue118.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___verify_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // regression_tests/issue_118.py:5 // class Issue118(ARC4Contract): txna ApplicationArgs 1 @@ -64,7 +64,7 @@ __puya_arc4_router_____algopy_default_create@6: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/regression_tests/out_unoptimized/Issue118.destructured.ir b/test_cases/regression_tests/out_unoptimized/Issue118.destructured.ir index 7aca2367e3..9d7f86f180 100644 --- a/test_cases/regression_tests/out_unoptimized/Issue118.destructured.ir +++ b/test_cases/regression_tests/out_unoptimized/Issue118.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.regression_tests.issue_118.Issue118: block@2: // verify_route_L7 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = test_cases.regression_tests.issue_118.Issue118.verify(tmp%7#0) let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0) @@ -35,7 +35,7 @@ contract test_cases.regression_tests.issue_118.Issue118: block@6: // __algopy_default_create_L1 let tmp%11#0: uint64 = (txn ApplicationID) let tmp%12#0: bool = (== tmp%11#0 0u) - (assert tmp%12#0) // is creating + (assert tmp%12#0) // can only call when creating test_cases.regression_tests.issue_118.Issue118.__algopy_default_create() return 1u block@7: // switch_case_default_L5 diff --git a/test_cases/regression_tests/puya.log b/test_cases/regression_tests/puya.log index 225c8e1a7e..d179ee4ded 100644 --- a/test_cases/regression_tests/puya.log +++ b/test_cases/regression_tests/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['regression_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['regression_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing regression_tests/out/module.awst debug: Sealing block@0: // L12 @@ -902,6 +902,7 @@ info: Writing regression_tests/out/Issue194.clear.bin info: Writing regression_tests/out/Issue194.approval.puya.map info: Writing regression_tests/out/Issue194.clear.puya.map info: Writing regression_tests/out/Issue118.arc32.json +info: Writing regression_tests/out/Issue118.arc56.json info: Writing regression_tests/out/Issue118.approval.teal info: Writing regression_tests/out/Issue118.clear.teal info: Writing regression_tests/out/Issue118.approval.bin diff --git a/test_cases/reinterpret_cast/out/Contract.approval.mir b/test_cases/reinterpret_cast/out/Contract.approval.mir index 2044cea613..f370e4e689 100644 --- a/test_cases/reinterpret_cast/out/Contract.approval.mir +++ b/test_cases/reinterpret_cast/out/Contract.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___bytes_to_bool_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub bytes_to_bool to_encode%0#0 byte 0x00 to_encode%0#0,0x00 int 0 to_encode%0#0,0x00,0 @@ -54,9 +54,9 @@ __puya_arc4_router___test_bytes_to_biguint_route@3: // @arc4.abimethod() txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating callsub test_bytes_to_biguint int 1 1 retsub 1 @@ -71,7 +71,7 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router_____algopy_default_create@7: txn ApplicationID tmp%13#0 ! tmp%14#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/reinterpret_cast/out/Contract.approval.teal b/test_cases/reinterpret_cast/out/Contract.approval.teal index 89a71bf770..15582eebc9 100644 --- a/test_cases/reinterpret_cast/out/Contract.approval.teal +++ b/test_cases/reinterpret_cast/out/Contract.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___bytes_to_bool_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub bytes_to_bool pushbytes 0x00 intc_0 // 0 @@ -44,9 +44,9 @@ __puya_arc4_router___test_bytes_to_biguint_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_bytes_to_biguint intc_1 // 1 retsub @@ -58,7 +58,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/reinterpret_cast/out/Contract.arc32.json b/test_cases/reinterpret_cast/out/Contract.arc32.json index 618d4b9b2f..7746ac99d0 100644 --- a/test_cases/reinterpret_cast/out/Contract.arc32.json +++ b/test_cases/reinterpret_cast/out/Contract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQwMzRiNzMxIDB4N2U5ZmQ0Y2YgLy8gbWV0aG9kICJieXRlc190b19ib29sKClib29sIiwgbWV0aG9kICJ0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ieXRlc190b19ib29sX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ieXRlc190b19iaWd1aW50X3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2J5dGVzX3RvX2Jvb2xfcm91dGVAMjoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYnl0ZXNfdG9fYm9vbAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2J5dGVzX3RvX2JpZ3VpbnRfcm91dGVAMzoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYnl0ZXNfdG9fYmlndWludAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYnl0ZXNfdG9fYm9vbCgpIC0+IHVpbnQ2NDoKYnl0ZXNfdG9fYm9vbDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6Ni03CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGJ5dGVzX3RvX2Jvb2woc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gYm9vbChCeXRlcygpKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC50ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKSAtPiB2b2lkOgp0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQ6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYnl0ZXNfdG9fYmlndWludChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBhc3NlcnQgYnl0ZXNfdG9fYmlndWludCgpCiAgICBjYWxsc3ViIGJ5dGVzX3RvX2JpZ3VpbnQKICAgIHB1c2hieXRlcyAweAogICAgYiE9CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5ieXRlc190b19iaWd1aW50KCkgLT4gYnl0ZXM6CmJ5dGVzX3RvX2JpZ3VpbnQ6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJ5dGVzX3RvX2JpZ3VpbnQoKSAtPiBCaWdVSW50OgogICAgcHJvdG8gMCAxCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyByZXR1cm4gQmlnVUludC5mcm9tX2J5dGVzKEJ5dGVzKCkpCiAgICBwdXNoYnl0ZXMgMHgKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQwMzRiNzMxIDB4N2U5ZmQ0Y2YgLy8gbWV0aG9kICJieXRlc190b19ib29sKClib29sIiwgbWV0aG9kICJ0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ieXRlc190b19ib29sX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ieXRlc190b19iaWd1aW50X3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2J5dGVzX3RvX2Jvb2xfcm91dGVAMjoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBieXRlc190b19ib29sCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnl0ZXNfdG9fYmlndWludF9yb3V0ZUAzOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5ieXRlc190b19ib29sKCkgLT4gdWludDY0OgpieXRlc190b19ib29sOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo2LTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYnl0ZXNfdG9fYm9vbChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjgKICAgIC8vIHJldHVybiBib29sKEJ5dGVzKCkpCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWludGVycHJldF9jYXN0LmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfYnl0ZXNfdG9fYmlndWludCgpIC0+IHZvaWQ6CnRlc3RfYnl0ZXNfdG9fYmlndWludDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9ieXRlc190b19iaWd1aW50KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTIKICAgIC8vIGFzc2VydCBieXRlc190b19iaWd1aW50KCkKICAgIGNhbGxzdWIgYnl0ZXNfdG9fYmlndWludAogICAgcHVzaGJ5dGVzIDB4CiAgICBiIT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWludGVycHJldF9jYXN0LmNvbnRyYWN0LmJ5dGVzX3RvX2JpZ3VpbnQoKSAtPiBieXRlczoKYnl0ZXNfdG9fYmlndWludDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnl0ZXNfdG9fYmlndWludCgpIC0+IEJpZ1VJbnQ6CiAgICBwcm90byAwIDEKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiBCaWdVSW50LmZyb21fYnl0ZXMoQnl0ZXMoKSkKICAgIHB1c2hieXRlcyAweAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/reinterpret_cast/out/Contract.arc56.json b/test_cases/reinterpret_cast/out/Contract.arc56.json new file mode 100644 index 0000000000..a62b77dca9 --- /dev/null +++ b/test_cases/reinterpret_cast/out/Contract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "bytes_to_bool", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_bytes_to_biguint", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43, + 71 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 88 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 46, + 74 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQwMzRiNzMxIDB4N2U5ZmQ0Y2YgLy8gbWV0aG9kICJieXRlc190b19ib29sKClib29sIiwgbWV0aG9kICJ0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ieXRlc190b19ib29sX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ieXRlc190b19iaWd1aW50X3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2J5dGVzX3RvX2Jvb2xfcm91dGVAMjoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBieXRlc190b19ib29sCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnl0ZXNfdG9fYmlndWludF9yb3V0ZUAzOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5ieXRlc190b19ib29sKCkgLT4gdWludDY0OgpieXRlc190b19ib29sOgogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo2LTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYnl0ZXNfdG9fYm9vbChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjgKICAgIC8vIHJldHVybiBib29sKEJ5dGVzKCkpCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWludGVycHJldF9jYXN0LmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfYnl0ZXNfdG9fYmlndWludCgpIC0+IHZvaWQ6CnRlc3RfYnl0ZXNfdG9fYmlndWludDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9ieXRlc190b19iaWd1aW50KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTIKICAgIC8vIGFzc2VydCBieXRlc190b19iaWd1aW50KCkKICAgIGNhbGxzdWIgYnl0ZXNfdG9fYmlndWludAogICAgcHVzaGJ5dGVzIDB4CiAgICBiIT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWludGVycHJldF9jYXN0LmNvbnRyYWN0LmJ5dGVzX3RvX2JpZ3VpbnQoKSAtPiBieXRlczoKYnl0ZXNfdG9fYmlndWludDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnl0ZXNfdG9fYmlndWludCgpIC0+IEJpZ1VJbnQ6CiAgICBwcm90byAwIDEKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiBCaWdVSW50LmZyb21fYnl0ZXMoQnl0ZXMoKSkKICAgIHB1c2hieXRlcyAweAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAAGIAAFDigABMRtBAD+CAgRANLcxBH6f1M82GgCOAgACAB4iiTEZFEQxGESIACuAAQAiTwJUgAQVH3x1TFCwI4kxGRREMRhEiAAUI4kxGUAABjEYFEQjiSKJigABIomKAACIAAWAAKlEiYoAAYAAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/reinterpret_cast/out/Contract.destructured.ir b/test_cases/reinterpret_cast/out/Contract.destructured.ir index 0c10334078..5b4e893622 100644 --- a/test_cases/reinterpret_cast/out/Contract.destructured.ir +++ b/test_cases/reinterpret_cast/out/Contract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -26,9 +26,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@6: // bare_routing_L4 @@ -37,7 +37,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/reinterpret_cast/out/Contract.ssa.ir b/test_cases/reinterpret_cast/out/Contract.ssa.ir index 392aff11a2..3411adb355 100644 --- a/test_cases/reinterpret_cast/out/Contract.ssa.ir +++ b/test_cases/reinterpret_cast/out/Contract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -28,10 +28,10 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@4: // switch_case_default_L4 @@ -44,7 +44,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (== tmp%13#0 0u) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating test_cases.reinterpret_cast.contract.Contract.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_1.ir b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_1.ir index dbee749ac2..f50795e9e7 100644 --- a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_1.ir +++ b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -26,9 +26,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@6: // bare_routing_L4 @@ -37,7 +37,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_2.ir b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_2.ir index ee91c8ce24..72f11fd91e 100644 --- a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_2.ir +++ b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -26,9 +26,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@6: // bare_routing_L4 @@ -37,7 +37,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_3.ir b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_3.ir index 0c10334078..5b4e893622 100644 --- a/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_3.ir +++ b/test_cases/reinterpret_cast/out/Contract.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -26,9 +26,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@6: // bare_routing_L4 @@ -37,7 +37,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/reinterpret_cast/out_O2/Contract.approval.teal b/test_cases/reinterpret_cast/out_O2/Contract.approval.teal index 0fcf36faae..1afea8e3bb 100644 --- a/test_cases/reinterpret_cast/out_O2/Contract.approval.teal +++ b/test_cases/reinterpret_cast/out_O2/Contract.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___bytes_to_bool_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub bytes_to_bool pushbytes 0x00 intc_0 // 0 @@ -38,9 +38,9 @@ __puya_arc4_router___bytes_to_bool_route@2: __puya_arc4_router___test_bytes_to_biguint_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub test_bytes_to_biguint intc_1 // 1 retsub @@ -50,7 +50,7 @@ __puya_arc4_router___bare_routing@6: bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/reinterpret_cast/out_O2/Contract.destructured.ir b/test_cases/reinterpret_cast/out_O2/Contract.destructured.ir index 0c10334078..5b4e893622 100644 --- a/test_cases/reinterpret_cast/out_O2/Contract.destructured.ir +++ b/test_cases/reinterpret_cast/out_O2/Contract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -26,9 +26,9 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@6: // bare_routing_L4 @@ -37,7 +37,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating return 1u block@10: // after_if_else_L4 return 0u diff --git a/test_cases/reinterpret_cast/out_unoptimized/Contract.approval.teal b/test_cases/reinterpret_cast/out_unoptimized/Contract.approval.teal index 1e80e41a07..49b711a845 100644 --- a/test_cases/reinterpret_cast/out_unoptimized/Contract.approval.teal +++ b/test_cases/reinterpret_cast/out_unoptimized/Contract.approval.teal @@ -28,11 +28,11 @@ __puya_arc4_router___bytes_to_bool_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub bytes_to_bool pushbytes 0x00 intc_0 // 0 @@ -51,11 +51,11 @@ __puya_arc4_router___test_bytes_to_biguint_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub test_bytes_to_biguint intc_1 // 1 retsub @@ -76,7 +76,7 @@ __puya_arc4_router_____algopy_default_create@7: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/reinterpret_cast/out_unoptimized/Contract.destructured.ir b/test_cases/reinterpret_cast/out_unoptimized/Contract.destructured.ir index e0d170aa81..b33a4f8ee6 100644 --- a/test_cases/reinterpret_cast/out_unoptimized/Contract.destructured.ir +++ b/test_cases/reinterpret_cast/out_unoptimized/Contract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.reinterpret_cast.contract.Contract: block@2: // bytes_to_bool_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bool = test_cases.reinterpret_cast.contract.Contract.bytes_to_bool() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -28,10 +28,10 @@ contract test_cases.reinterpret_cast.contract.Contract: block@3: // test_bytes_to_biguint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating test_cases.reinterpret_cast.contract.Contract.test_bytes_to_biguint() return 1u block@4: // switch_case_default_L4 @@ -44,7 +44,7 @@ contract test_cases.reinterpret_cast.contract.Contract: block@7: // __algopy_default_create_L1 let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (== tmp%13#0 0u) - (assert tmp%14#0) // is creating + (assert tmp%14#0) // can only call when creating test_cases.reinterpret_cast.contract.Contract.__algopy_default_create() return 1u block@8: // switch_case_default_L4 diff --git a/test_cases/reinterpret_cast/puya.log b/test_cases/reinterpret_cast/puya.log index 21feec1f65..ddd77b33b8 100644 --- a/test_cases/reinterpret_cast/puya.log +++ b/test_cases/reinterpret_cast/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['reinterpret_cast'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['reinterpret_cast'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing reinterpret_cast/out/module.awst debug: Sealing block@0: // L12 @@ -817,6 +817,7 @@ debug: Inserted test_bytes_to_biguint_block@0.ops[6]: 'l-store-copy tmp%1#0 0' debug: Replaced test_bytes_to_biguint_block@0.ops[8]: 'v-load tmp%1#0' with 'l-load tmp%1#0' debug: Found 3 edge set/s for test_cases.reinterpret_cast.contract.Contract.__puya_arc4_router__ info: Writing reinterpret_cast/out/Contract.arc32.json +info: Writing reinterpret_cast/out/Contract.arc56.json info: Writing reinterpret_cast/out/Contract.approval.teal info: Writing reinterpret_cast/out/Contract.clear.teal info: Writing reinterpret_cast/out/Contract.approval.bin diff --git a/test_cases/scratch_slots/puya.log b/test_cases/scratch_slots/puya.log index 73829db12e..4711cae66b 100644 --- a/test_cases/scratch_slots/puya.log +++ b/test_cases/scratch_slots/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['scratch_slots'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['scratch_slots'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing scratch_slots/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/simple/puya.log b/test_cases/simple/puya.log index 26a8dda23a..c361c5453f 100644 --- a/test_cases/simple/puya.log +++ b/test_cases/simple/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing simple/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/simplish/puya.log b/test_cases/simplish/puya.log index 0b5762caf6..6481874deb 100644 --- a/test_cases/simplish/puya.log +++ b/test_cases/simplish/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simplish'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simplish'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing simplish/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/ssa/puya.log b/test_cases/ssa/puya.log index 90aafdcda5..04cd3994c6 100644 --- a/test_cases/ssa/puya.log +++ b/test_cases/ssa/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing ssa/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/ssa2/puya.log b/test_cases/ssa2/puya.log index b49eb2a817..3f26bec6a5 100644 --- a/test_cases/ssa2/puya.log +++ b/test_cases/ssa2/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa2'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa2'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing ssa2/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/state_mutations/out/Contract.approval.mir b/test_cases/state_mutations/out/Contract.approval.mir index 9bf8ce1be3..d76f51af76 100644 --- a/test_cases/state_mutations/out/Contract.approval.mir +++ b/test_cases/state_mutations/out/Contract.approval.mir @@ -35,9 +35,9 @@ __puya_arc4_router___append_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub append int 1 1 retsub 1 @@ -47,9 +47,9 @@ __puya_arc4_router___modify_route@3: // @arc4.abimethod txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub modify int 1 1 retsub 1 @@ -59,9 +59,9 @@ __puya_arc4_router___get_route@4: // @arc4.abimethod txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating callsub get tmp%15#0 byte 0x151f7c75 tmp%15#0,0x151f7c75 l-load tmp%15#0 1 0x151f7c75,tmp%15#0 @@ -82,7 +82,7 @@ __puya_arc4_router___opt_in@8: // state_mutations/contract.py:29 // @arc4.baremethod(allow_actions=["OptIn"]) txn ApplicationID tmp%18#0 - assert // is not creating + assert // can only call when not creating // state_mutations/contract.py:29-30 // @arc4.baremethod(allow_actions=["OptIn"]) // def opt_in(self) -> None: @@ -93,7 +93,7 @@ __puya_arc4_router___opt_in@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID tmp%20#0 ! tmp%21#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/state_mutations/out/Contract.approval.teal b/test_cases/state_mutations/out/Contract.approval.teal index 9f473afbe1..758d03d5ca 100644 --- a/test_cases/state_mutations/out/Contract.approval.teal +++ b/test_cases/state_mutations/out/Contract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___append_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub append intc_1 // 1 retsub @@ -37,9 +37,9 @@ __puya_arc4_router___modify_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub modify intc_1 // 1 retsub @@ -49,9 +49,9 @@ __puya_arc4_router___get_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get pushbytes 0x151f7c75 swap @@ -72,7 +72,7 @@ __puya_arc4_router___opt_in@8: // state_mutations/contract.py:29 // @arc4.baremethod(allow_actions=["OptIn"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // state_mutations/contract.py:29-30 // @arc4.baremethod(allow_actions=["OptIn"]) // def opt_in(self) -> None: @@ -83,7 +83,7 @@ __puya_arc4_router___opt_in@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/state_mutations/out/Contract.arc32.json b/test_cases/state_mutations/out/Contract.arc32.json index d4058d8a28..74af8e4c2f 100644 --- a/test_cases/state_mutations/out/Contract.arc32.json +++ b/test_cases/state_mutations/out/Contract.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAyIDgKICAgIGJ5dGVjYmxvY2sgImJveCIgImdsb2IiICJsb2MiICJtYXAiIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQgMHgwMDAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDUyNmU4YmJmIDB4OTVmZWYxM2QgMHgwYzI5NDQ0YiAvLyBtZXRob2QgImFwcGVuZCgpdm9pZCIsIG1ldGhvZCAibW9kaWZ5KCl2b2lkIiwgbWV0aG9kICJnZXQoKSh1aW50NjQsc3RyaW5nKVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYXBwZW5kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fbW9kaWZ5X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGVuZF9yb3V0ZUAyOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXBwZW5kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tb2RpZnlfcm91dGVAMzoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1vZGlmeQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQ6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5AOAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luQDg6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBvcHRfaW4KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QuYXBwZW5kKCkgLT4gdm9pZDoKYXBwZW5kOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhcHBlbmQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBzdHJ1Y3QgPSBnZXRfc3RydWN0KCkKICAgIGNhbGxzdWIgZ2V0X3N0cnVjdAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDIKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5nZXRfc3RydWN0KCkgLT4gYnl0ZXM6CmdldF9zdHJ1Y3Q6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjQtNjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cnVjdCgpIC0+IE15U3RydWN0OgogICAgcHJvdG8gMCAxCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjYtNjkKICAgIC8vIHJldHVybiBNeVN0cnVjdCgKICAgIC8vICAgICBiYXI9YXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYmF6PWFyYzQuU3RyaW5nKCJiYXoiKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QubW9kaWZ5KCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ0LTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtb2RpZnkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzZWxmLmdsb2IudmFsdWVbMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNCAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QuZ2V0KCkgLT4gYnl0ZXM6CmdldDoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZ2V0KHNlbGYpIC0+IE15QXJyYXk6CiAgICBwcm90byAwIDEKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1MwogICAgLy8gYTEgPSBzZWxmLmdsb2IudmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhMiA9IHNlbGYubG9jW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1NQogICAgLy8gYTMgPSBzZWxmLmJveC52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1NgogICAgLy8gYTQgPSBzZWxmLm1hcFtUeG4uc2VuZGVyXS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgYTEgPT0gYTIsICJleHBlY3RlZCBsb2NhbCA9PSBnbG9iYWwiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IGdsb2JhbAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgYTEgPT0gYTMsICJleHBlY3RlZCBib3ggPT0gZ2xvYmFsIgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBib3ggPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjAKICAgIC8vIGFzc2VydCBhMSA9PSBhNCwgImV4cGVjdGVkIG1hcCA9PSBnbG9iYWwiCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBtYXAgPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjEKICAgIC8vIHJldHVybiBhMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3Qub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYm94X3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTozNAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAyIDgKICAgIGJ5dGVjYmxvY2sgImJveCIgImdsb2IiICJsb2MiICJtYXAiIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQgMHgwMDAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDUyNmU4YmJmIDB4OTVmZWYxM2QgMHgwYzI5NDQ0YiAvLyBtZXRob2QgImFwcGVuZCgpdm9pZCIsIG1ldGhvZCAibW9kaWZ5KCl2b2lkIiwgbWV0aG9kICJnZXQoKSh1aW50NjQsc3RyaW5nKVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYXBwZW5kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fbW9kaWZ5X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGVuZF9yb3V0ZUAyOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBhcHBlbmQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21vZGlmeV9yb3V0ZUAzOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtb2RpZnkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9yb3V0ZUA0OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5AOAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luQDg6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIC8vIGRlZiBvcHRfaW4oc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHBlbmQoKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFwcGVuZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzgKICAgIC8vIHN0cnVjdCA9IGdldF9zdHJ1Y3QoKQogICAgY2FsbHN1YiBnZXRfc3RydWN0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzkKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDAKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDEKICAgIC8vIHNlbGYuYm94LnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0MgogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfbXV0YXRpb25zLmNvbnRyYWN0LmdldF9zdHJ1Y3QoKSAtPiBieXRlczoKZ2V0X3N0cnVjdDoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2NC02NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RydWN0KCkgLT4gTXlTdHJ1Y3Q6CiAgICBwcm90byAwIDEKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2Ni02OQogICAgLy8gcmV0dXJuIE15U3RydWN0KAogICAgLy8gICAgIGJhcj1hcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBiYXo9YXJjNC5TdHJpbmcoImJheiIpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5tb2RpZnkoKSAtPiB2b2lkOgptb2RpZnk6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDQtNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1vZGlmeShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNCAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJnbG9iIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDgKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0OQogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5nZXQoKSAtPiBieXRlczoKZ2V0OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUxLTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBnZXQoc2VsZikgLT4gTXlBcnJheToKICAgIHByb3RvIDAgMQogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBhMSA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTQKICAgIC8vIGEyID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhMyA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhNCA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBhMSA9PSBhMiwgImV4cGVjdGVkIGxvY2FsID09IGdsb2JhbCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbG9jYWwgPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBhMSA9PSBhMywgImV4cGVjdGVkIGJveCA9PSBnbG9iYWwiCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGJveCA9PSBnbG9iYWwKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IGExID09IGE0LCAiZXhwZWN0ZWQgbWFwID09IGdsb2JhbCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBnbG9iYWwKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIGExCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5vcHRfaW4oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICAvLyBkZWYgb3B0X2luKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTozMQogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzIKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzMKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdID0gTXlBcnJheSgpCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBzdGF0aWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50KGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQsIGFycmF5X2xlbmd0aDogdWludDY0KSAtPiBieXRlczoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTQKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/state_mutations/out/Contract.arc56.json b/test_cases/state_mutations/out/Contract.arc56.json new file mode 100644 index 0000000000..a5cce79fb9 --- /dev/null +++ b/test_cases/state_mutations/out/Contract.arc56.json @@ -0,0 +1,219 @@ +{ + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "append", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "modify", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get", + "args": [], + "returns": { + "type": "(uint64,string)[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 1 + } + }, + "keys": { + "global": { + "glob": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "Z2xvYg==" + } + }, + "local": { + "loc": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "bG9j" + } + }, + "box": { + "box": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "Ym94" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "map": { + "keyType": "AVMBytes", + "valueType": "(uint64,string)[]", + "prefix": "bWFw" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "OptIn" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 85, + 97, + 109 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 148 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 88, + 100, + 112, + 139 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 213, + 393, + 429, + 516 + ], + "errorMessage": "check self.box exists" + }, + { + "pc": [ + 160, + 289, + 326, + 507 + ], + "errorMessage": "check self.glob exists" + }, + { + "pc": [ + 191, + 340, + 379, + 513 + ], + "errorMessage": "check self.loc exists for account" + }, + { + "pc": [ + 238, + 446, + 485, + 522 + ], + "errorMessage": "check self.map entry exists" + }, + { + "pc": [ + 534 + ], + "errorMessage": "expected box == global" + }, + { + "pc": [ + 528 + ], + "errorMessage": "expected local == global" + }, + { + "pc": [ + 538 + ], + "errorMessage": "expected map == global" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAyIDgKICAgIGJ5dGVjYmxvY2sgImJveCIgImdsb2IiICJsb2MiICJtYXAiIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQgMHgwMDAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDUyNmU4YmJmIDB4OTVmZWYxM2QgMHgwYzI5NDQ0YiAvLyBtZXRob2QgImFwcGVuZCgpdm9pZCIsIG1ldGhvZCAibW9kaWZ5KCl2b2lkIiwgbWV0aG9kICJnZXQoKSh1aW50NjQsc3RyaW5nKVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYXBwZW5kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fbW9kaWZ5X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGVuZF9yb3V0ZUAyOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBhcHBlbmQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21vZGlmeV9yb3V0ZUAzOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtb2RpZnkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9yb3V0ZUA0OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5AOAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luQDg6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIC8vIGRlZiBvcHRfaW4oc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHBlbmQoKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFwcGVuZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzgKICAgIC8vIHN0cnVjdCA9IGdldF9zdHJ1Y3QoKQogICAgY2FsbHN1YiBnZXRfc3RydWN0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzkKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDAKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDEKICAgIC8vIHNlbGYuYm94LnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0MgogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfbXV0YXRpb25zLmNvbnRyYWN0LmdldF9zdHJ1Y3QoKSAtPiBieXRlczoKZ2V0X3N0cnVjdDoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2NC02NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RydWN0KCkgLT4gTXlTdHJ1Y3Q6CiAgICBwcm90byAwIDEKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2Ni02OQogICAgLy8gcmV0dXJuIE15U3RydWN0KAogICAgLy8gICAgIGJhcj1hcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBiYXo9YXJjNC5TdHJpbmcoImJheiIpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5tb2RpZnkoKSAtPiB2b2lkOgptb2RpZnk6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDQtNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1vZGlmeShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNCAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJnbG9iIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDgKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0OQogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5nZXQoKSAtPiBieXRlczoKZ2V0OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUxLTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBnZXQoc2VsZikgLT4gTXlBcnJheToKICAgIHByb3RvIDAgMQogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBhMSA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTQKICAgIC8vIGEyID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhMyA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhNCA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBhMSA9PSBhMiwgImV4cGVjdGVkIGxvY2FsID09IGdsb2JhbCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbG9jYWwgPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBhMSA9PSBhMywgImV4cGVjdGVkIGJveCA9PSBnbG9iYWwiCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGJveCA9PSBnbG9iYWwKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IGExID09IGE0LCAiZXhwZWN0ZWQgbWFwID09IGdsb2JhbCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBnbG9iYWwKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIGExCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5vcHRfaW4oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICAvLyBkZWYgb3B0X2luKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTozMQogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzIKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzMKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdID0gTXlBcnJheSgpCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBzdGF0aWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50KGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQsIGFycmF5X2xlbmd0aDogdWludDY0KSAtPiBieXRlczoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTQKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAAECCCYGA2JveARnbG9iA2xvYwNtYXAKAAhtb2RpZmllZAIAAIgAAUOKAAExG0EAS4IDBFJui78Elf7xPQQMKURLNhoAjgMAAgAOABoiiTEZFEQxGESIADsjiTEZFEQxGESIALMjiTEZFEQxGESIAYGABBUffHVMULAjiTEZjQIACgACIokxGESIAY0jiTEYFEQjiYoAAIgAaSIpZUSAAgACTwJQSwEiWU8CVwIAI0sDiAGEKUxnMQAiKmNESSJZTFcCACNLA4gBbjEAKk8CZii+REkiWUxXAgAjSwOIAVgovEgoTL8rMQBQvkRJIllMVwIAI08DiAE/KzEAUEm8SEy/iYoAAYAPAAAAAAAAAAEACgADYmF6iYoAACIpZURJVwIASSJZTwIiWSMJSwIVSwMkWU8CTVJJJVkiTFgnBFAiKWVETCKIAXApTGcxACIqY0RJVwIASSJZTwIiWSMJSwIVSwMkWU8CTVJJJVkiTFgnBFAxACIqY0RMIogBOzEAKk8CZii+RElXAgBJIllPAiJZIwlLAhVLAyRZTwJNUkklWSJMWCcEUCi+REwiiAEJKLxIKEy/KzEAUL5ESVcCAEkiWU8CIlkjCUsCFUsDJFlPAk1SSSVZIkxYJwRQKzEAUL5ETCKIANErMQBQSbxITL+JigABIillRDEAIipjRCi+RCsxAFC+REsDTwMSREsCTwISREsBEkSJigAAKScFZyi8SCgnBb8xAConBWYrMQBQSbxIJwW/iYoEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv+i/9PA4gAAlCJigQBi/4kC4v8TFmL/iMIJAtJTgKL/ExZi/wVi/+L/gkjCUsBTwNPAk1JSwMJTgOL/RVOA4v8Ik8EUov9UIv8TwJPA1JQi/8kC4sAiwQMQQAgiwNJiwBJTgNZiwIIiwEJFlcGAksCTF2MAyQIjABC/9iLA4wAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/state_mutations/out/Contract.destructured.ir b/test_cases/state_mutations/out/Contract.destructured.ir index ce07b8d49c..173b8fc5a7 100644 --- a/test_cases/state_mutations/out/Contract.destructured.ir +++ b/test_cases/state_mutations/out/Contract.destructured.ir @@ -15,25 +15,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -43,13 +43,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out/Contract.ssa.ir b/test_cases/state_mutations/out/Contract.ssa.ir index f767860972..a00fdec923 100644 --- a/test_cases/state_mutations/out/Contract.ssa.ir +++ b/test_cases/state_mutations/out/Contract.ssa.ir @@ -26,28 +26,28 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -62,13 +62,13 @@ contract test_cases.state_mutations.contract.Contract: block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) let tmp%19#0: bool = (!= tmp%18#0 0u) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (== tmp%20#0 0u) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating test_cases.state_mutations.contract.Contract.__algopy_default_create() return 1u block@10: // switch_case_default_L22 diff --git a/test_cases/state_mutations/out/Contract.ssa.opt_pass_1.ir b/test_cases/state_mutations/out/Contract.ssa.opt_pass_1.ir index c2d6152779..51ec98446c 100644 --- a/test_cases/state_mutations/out/Contract.ssa.opt_pass_1.ir +++ b/test_cases/state_mutations/out/Contract.ssa.opt_pass_1.ir @@ -20,25 +20,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -48,13 +48,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out/Contract.ssa.opt_pass_2.ir b/test_cases/state_mutations/out/Contract.ssa.opt_pass_2.ir index b4bcb4f1f8..9fc812e7c5 100644 --- a/test_cases/state_mutations/out/Contract.ssa.opt_pass_2.ir +++ b/test_cases/state_mutations/out/Contract.ssa.opt_pass_2.ir @@ -18,25 +18,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -46,13 +46,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out/Contract.ssa.opt_pass_3.ir b/test_cases/state_mutations/out/Contract.ssa.opt_pass_3.ir index d794747318..829f83e906 100644 --- a/test_cases/state_mutations/out/Contract.ssa.opt_pass_3.ir +++ b/test_cases/state_mutations/out/Contract.ssa.opt_pass_3.ir @@ -15,25 +15,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -43,13 +43,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out/Contract.ssa.opt_pass_4.ir b/test_cases/state_mutations/out/Contract.ssa.opt_pass_4.ir index aed90f91d5..8b2e56b099 100644 --- a/test_cases/state_mutations/out/Contract.ssa.opt_pass_4.ir +++ b/test_cases/state_mutations/out/Contract.ssa.opt_pass_4.ir @@ -15,25 +15,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -43,13 +43,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out/Contract.ssa.opt_pass_5.ir b/test_cases/state_mutations/out/Contract.ssa.opt_pass_5.ir index 616c684f4d..d573d3fafb 100644 --- a/test_cases/state_mutations/out/Contract.ssa.opt_pass_5.ir +++ b/test_cases/state_mutations/out/Contract.ssa.opt_pass_5.ir @@ -15,25 +15,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -43,13 +43,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out_O2/Contract.approval.teal b/test_cases/state_mutations/out_O2/Contract.approval.teal index 0d97ee08dc..6d783cd612 100644 --- a/test_cases/state_mutations/out_O2/Contract.approval.teal +++ b/test_cases/state_mutations/out_O2/Contract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___append_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub append intc_1 // 1 retsub @@ -31,9 +31,9 @@ __puya_arc4_router___append_route@2: __puya_arc4_router___modify_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub modify intc_1 // 1 retsub @@ -41,9 +41,9 @@ __puya_arc4_router___modify_route@3: __puya_arc4_router___get_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get pushbytes 0x151f7c75 swap @@ -60,7 +60,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router___opt_in@8: txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub opt_in intc_1 // 1 retsub @@ -68,7 +68,7 @@ __puya_arc4_router___opt_in@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/state_mutations/out_O2/Contract.destructured.ir b/test_cases/state_mutations/out_O2/Contract.destructured.ir index ce07b8d49c..173b8fc5a7 100644 --- a/test_cases/state_mutations/out_O2/Contract.destructured.ir +++ b/test_cases/state_mutations/out_O2/Contract.destructured.ir @@ -15,25 +15,25 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -43,13 +43,13 @@ contract test_cases.state_mutations.contract.Contract: goto_nth [block@9, block@8][tmp%17#0] else return 0u block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating return 1u subroutine test_cases.state_mutations.contract.Contract.append() -> void: diff --git a/test_cases/state_mutations/out_unoptimized/Contract.approval.teal b/test_cases/state_mutations/out_unoptimized/Contract.approval.teal index d54c59e151..578bf79dab 100644 --- a/test_cases/state_mutations/out_unoptimized/Contract.approval.teal +++ b/test_cases/state_mutations/out_unoptimized/Contract.approval.teal @@ -43,11 +43,11 @@ __puya_arc4_router___append_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub append intc_2 // 1 retsub @@ -58,11 +58,11 @@ __puya_arc4_router___modify_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub modify intc_2 // 1 retsub @@ -73,11 +73,11 @@ __puya_arc4_router___get_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get pushbytes 0x151f7c75 swap @@ -105,7 +105,7 @@ __puya_arc4_router___opt_in@8: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // state_mutations/contract.py:29-30 // @arc4.baremethod(allow_actions=["OptIn"]) // def opt_in(self) -> None: @@ -117,7 +117,7 @@ __puya_arc4_router_____algopy_default_create@9: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_2 // 1 retsub diff --git a/test_cases/state_mutations/out_unoptimized/Contract.destructured.ir b/test_cases/state_mutations/out_unoptimized/Contract.destructured.ir index eb0105c530..c8e7f38c7d 100644 --- a/test_cases/state_mutations/out_unoptimized/Contract.destructured.ir +++ b/test_cases/state_mutations/out_unoptimized/Contract.destructured.ir @@ -26,28 +26,28 @@ contract test_cases.state_mutations.contract.Contract: block@2: // append_route_L36 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.state_mutations.contract.Contract.append() return 1u block@3: // modify_route_L44 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.state_mutations.contract.Contract.modify() return 1u block@4: // get_route_L51 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = test_cases.state_mutations.contract.Contract.get() let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0) (log tmp%16#0) @@ -62,13 +62,13 @@ contract test_cases.state_mutations.contract.Contract: block@8: // opt_in_L29 let tmp%18#0: uint64 = (txn ApplicationID) let tmp%19#0: bool = (!= tmp%18#0 0u) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating test_cases.state_mutations.contract.Contract.opt_in() return 1u block@9: // __algopy_default_create_L1 let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (== tmp%20#0 0u) - (assert tmp%21#0) // is creating + (assert tmp%21#0) // can only call when creating test_cases.state_mutations.contract.Contract.__algopy_default_create() return 1u block@10: // switch_case_default_L22 diff --git a/test_cases/state_mutations/puya.log b/test_cases/state_mutations/puya.log index 2615de3c1a..2b0f13f306 100644 --- a/test_cases/state_mutations/puya.log +++ b/test_cases/state_mutations/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_mutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_mutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_mutations/out/module.awst debug: Sealing block@0: // L12 @@ -2081,6 +2081,7 @@ debug: _puya_lib.arc4.dynamic_array_concat_dynamic_element f-stack on first stor debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack entry: [] debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack on first store: ['head_offset#0', 'original_item_length#0', 'new_item_length#0', 'new_head_and_tail#0', 'tmp%7#0'] info: Writing state_mutations/out/Contract.arc32.json +info: Writing state_mutations/out/Contract.arc56.json info: Writing state_mutations/out/Contract.approval.teal info: Writing state_mutations/out/Contract.clear.teal info: Writing state_mutations/out/Contract.approval.bin diff --git a/test_cases/state_proxies/out/StateProxyContract.approval.mir b/test_cases/state_proxies/out/StateProxyContract.approval.mir index 82aaedc389..b6806aa17c 100644 --- a/test_cases/state_proxies/out/StateProxyContract.approval.mir +++ b/test_cases/state_proxies/out/StateProxyContract.approval.mir @@ -83,10 +83,10 @@ __puya_arc4_router___create_route@2: txn OnCompletion tmp%3#0 int OptIn tmp%3#0,OptIn == tmp%4#0 - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating callsub create int 1 1 retsub 1 diff --git a/test_cases/state_proxies/out/StateProxyContract.approval.teal b/test_cases/state_proxies/out/StateProxyContract.approval.teal index 358d9c9485..14cd021772 100644 --- a/test_cases/state_proxies/out/StateProxyContract.approval.teal +++ b/test_cases/state_proxies/out/StateProxyContract.approval.teal @@ -58,10 +58,10 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_1 // OptIn == - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/state_proxies/out/StateProxyContract.arc32.json b/test_cases/state_proxies/out/StateProxyContract.arc32.json index 05d76a5607..0a462ad893 100644 --- a/test_cases/state_proxies/out/StateProxyContract.arc32.json +++ b/test_cases/state_proxies/out/StateProxyContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBzZWxmLmdsb2JhbDIgPSBHbG9iYWxTdGF0ZVtVSW50NjRdKFVJbnQ2NCgwKSwga2V5PWIiZzIiLCBkZXNjcmlwdGlvbj0iZzIgZGVzY3JpcHRpb24iKQogICAgcHVzaGJ5dGVzIDB4NjczMgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBlbHNlIEdsb2JhbFN0YXRlKFVJbnQ2NCwga2V5PSJ0b3duIikKICAgIHB1c2hieXRlc3MgInRvd24iICJmdW5reSIgLy8gInRvd24iLCAiZnVua3kiCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBUeG4ubnVtX2FwcF9hcmdzCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxOS0yMQogICAgLy8gR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9ImZ1bmt5IikKICAgIC8vIGlmIFR4bi5udW1fYXBwX2FyZ3MKICAgIC8vIGVsc2UgR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9InRvd24iKQogICAgc2VsZWN0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBmdW5reV90b3duLnZhbHVlID0gVUludDY0KDEyMykKICAgIHB1c2hpbnQgMTIzIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTIKICAgIC8vIGNsYXNzIFN0YXRlUHJveHlDb250cmFjdChBUkM0Q29udHJhY3QsIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscyhnbG9iYWxfdWludHM9MykpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuY3JlYXRlKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmdsb2JhbDEudmFsdWUgPSBVSW50NjQoMSkKICAgIHB1c2hieXRlcyAiZzEiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYubG9jYWwxW1R4bi5zZW5kZXJdID0gVUludDY0KDIpCiAgICB0eG4gU2VuZGVyCiAgICBwdXNoYnl0ZXMgImwxIgogICAgcHVzaGludCAyIC8vIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjkKICAgIC8vIHNlbGYubG9jYWwyW1R4bi5zZW5kZXJdID0gVUludDY0KDMpCiAgICB0eG4gU2VuZGVyCiAgICBwdXNoYnl0ZXMgMHg2YzMyCiAgICBwdXNoaW50IDMgLy8gMwogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBzZWxmLmdsb2JhbDIgPSBHbG9iYWxTdGF0ZVtVSW50NjRdKFVJbnQ2NCgwKSwga2V5PWIiZzIiLCBkZXNjcmlwdGlvbj0iZzIgZGVzY3JpcHRpb24iKQogICAgcHVzaGJ5dGVzIDB4NjczMgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBlbHNlIEdsb2JhbFN0YXRlKFVJbnQ2NCwga2V5PSJ0b3duIikKICAgIHB1c2hieXRlc3MgInRvd24iICJmdW5reSIgLy8gInRvd24iLCAiZnVua3kiCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBUeG4ubnVtX2FwcF9hcmdzCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxOS0yMQogICAgLy8gR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9ImZ1bmt5IikKICAgIC8vIGlmIFR4bi5udW1fYXBwX2FyZ3MKICAgIC8vIGVsc2UgR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9InRvd24iKQogICAgc2VsZWN0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBmdW5reV90b3duLnZhbHVlID0gVUludDY0KDEyMykKICAgIHB1c2hpbnQgMTIzIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9wcm94aWVzLmNvbnRyYWN0LlN0YXRlUHJveHlDb250cmFjdC5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjI1LTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuZ2xvYmFsMS52YWx1ZSA9IFVJbnQ2NCgxKQogICAgcHVzaGJ5dGVzICJnMSIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyOAogICAgLy8gc2VsZi5sb2NhbDFbVHhuLnNlbmRlcl0gPSBVSW50NjQoMikKICAgIHR4biBTZW5kZXIKICAgIHB1c2hieXRlcyAibDEiCiAgICBwdXNoaW50IDIgLy8gMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyOQogICAgLy8gc2VsZi5sb2NhbDJbVHhuLnNlbmRlcl0gPSBVSW50NjQoMykKICAgIHR4biBTZW5kZXIKICAgIHB1c2hieXRlcyAweDZjMzIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/state_proxies/out/StateProxyContract.arc56.json b/test_cases/state_proxies/out/StateProxyContract.arc56.json new file mode 100644 index 0000000000..64adb974b5 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.arc56.json @@ -0,0 +1,120 @@ +{ + "name": "StateProxyContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "OptIn" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 0 + }, + "local": { + "ints": 2, + "bytes": 0 + } + }, + "keys": { + "global": { + "global1": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZzE=", + "desc": "g1 description" + }, + "global2": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "ZzI=", + "desc": "g2 description" + } + }, + "local": { + "local1": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bDE=", + "desc": "l1 description" + }, + "local2": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "bDI=", + "desc": "l2 description" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 73 + ], + "errorMessage": "OnCompletion is not OptIn" + }, + { + "pc": [ + 77 + ], + "errorMessage": "can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBzZWxmLmdsb2JhbDIgPSBHbG9iYWxTdGF0ZVtVSW50NjRdKFVJbnQ2NCgwKSwga2V5PWIiZzIiLCBkZXNjcmlwdGlvbj0iZzIgZGVzY3JpcHRpb24iKQogICAgcHVzaGJ5dGVzIDB4NjczMgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBlbHNlIEdsb2JhbFN0YXRlKFVJbnQ2NCwga2V5PSJ0b3duIikKICAgIHB1c2hieXRlc3MgInRvd24iICJmdW5reSIgLy8gInRvd24iLCAiZnVua3kiCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBUeG4ubnVtX2FwcF9hcmdzCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxOS0yMQogICAgLy8gR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9ImZ1bmt5IikKICAgIC8vIGlmIFR4bi5udW1fYXBwX2FyZ3MKICAgIC8vIGVsc2UgR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9InRvd24iKQogICAgc2VsZWN0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBmdW5reV90b3duLnZhbHVlID0gVUludDY0KDEyMykKICAgIHB1c2hpbnQgMTIzIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9wcm94aWVzLmNvbnRyYWN0LlN0YXRlUHJveHlDb250cmFjdC5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjI1LTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuZ2xvYmFsMS52YWx1ZSA9IFVJbnQ2NCgxKQogICAgcHVzaGJ5dGVzICJnMSIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyOAogICAgLy8gc2VsZi5sb2NhbDFbVHhuLnNlbmRlcl0gPSBVSW50NjQoMikKICAgIHR4biBTZW5kZXIKICAgIHB1c2hieXRlcyAibDEiCiAgICBwdXNoaW50IDIgLy8gMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyOQogICAgLy8gc2VsZi5sb2NhbDJbVHhuLnNlbmRlcl0gPSBVSW50NjQoMykKICAgIHR4biBTZW5kZXIKICAgIHB1c2hieXRlcyAweDZjMzIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gABIgAHkOKAACAAmcyImeCAgR0b3duBWZ1bmt5MRtNgXtniYoAATEbQQAdgARMXGG6NhoAjgEAAiKJMRkjEkQxGBREiAAEI4kiiYoAAIACZzEjZzEAgAJsMYECZjEAgAJsMoEDZok=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/state_proxies/out/StateProxyContract.destructured.ir b/test_cases/state_proxies/out/StateProxyContract.destructured.ir index c35ab2b811..21ae62f07c 100644 --- a/test_cases/state_proxies/out/StateProxyContract.destructured.ir +++ b/test_cases/state_proxies/out/StateProxyContract.destructured.ir @@ -29,10 +29,10 @@ contract test_cases.state_proxies.contract.StateProxyContract: block@2: // create_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 OptIn) - (assert tmp%4#0) // OnCompletion is OptIn + (assert tmp%4#0) // OnCompletion is not OptIn let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.state_proxies.contract.StateProxyContract.create() return 1u block@6: // after_if_else_L12 diff --git a/test_cases/state_proxies/out/StateProxyContract.ssa.ir b/test_cases/state_proxies/out/StateProxyContract.ssa.ir index d2a0697d0a..317b040bd8 100644 --- a/test_cases/state_proxies/out/StateProxyContract.ssa.ir +++ b/test_cases/state_proxies/out/StateProxyContract.ssa.ir @@ -31,10 +31,10 @@ contract test_cases.state_proxies.contract.StateProxyContract: block@2: // create_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 OptIn) - (assert tmp%4#0) // OnCompletion is OptIn + (assert tmp%4#0) // OnCompletion is not OptIn let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.state_proxies.contract.StateProxyContract.create() return 1u block@3: // switch_case_default_L12 diff --git a/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir b/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir index c35ab2b811..21ae62f07c 100644 --- a/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir +++ b/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir @@ -29,10 +29,10 @@ contract test_cases.state_proxies.contract.StateProxyContract: block@2: // create_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 OptIn) - (assert tmp%4#0) // OnCompletion is OptIn + (assert tmp%4#0) // OnCompletion is not OptIn let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.state_proxies.contract.StateProxyContract.create() return 1u block@6: // after_if_else_L12 diff --git a/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal b/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal index 81aa11d4c2..7ffa4d98b2 100644 --- a/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal +++ b/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal @@ -40,10 +40,10 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_1 // OptIn == - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID ! - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir b/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir index c35ab2b811..21ae62f07c 100644 --- a/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir +++ b/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir @@ -29,10 +29,10 @@ contract test_cases.state_proxies.contract.StateProxyContract: block@2: // create_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 OptIn) - (assert tmp%4#0) // OnCompletion is OptIn + (assert tmp%4#0) // OnCompletion is not OptIn let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.state_proxies.contract.StateProxyContract.create() return 1u block@6: // after_if_else_L12 diff --git a/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal b/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal index 66edee78c4..26b3cc670f 100644 --- a/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal +++ b/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal @@ -72,11 +72,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_1 // OptIn == - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub diff --git a/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir b/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir index d2a0697d0a..317b040bd8 100644 --- a/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir +++ b/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir @@ -31,10 +31,10 @@ contract test_cases.state_proxies.contract.StateProxyContract: block@2: // create_route_L25 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 OptIn) - (assert tmp%4#0) // OnCompletion is OptIn + (assert tmp%4#0) // OnCompletion is not OptIn let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.state_proxies.contract.StateProxyContract.create() return 1u block@3: // switch_case_default_L12 diff --git a/test_cases/state_proxies/puya.log b/test_cases/state_proxies/puya.log index 67e9a61bae..e4544aa896 100644 --- a/test_cases/state_proxies/puya.log +++ b/test_cases/state_proxies/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_proxies'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_proxies'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_proxies/out/module.awst debug: Sealing block@0: // L12 @@ -582,6 +582,7 @@ debug: Replaced create_block@0.ops[13]: 'v-load tmp%1#0' with 'l-load tmp%1#0' debug: Found 1 edge set/s for test_cases.state_proxies.contract.StateProxyContract.approval_program debug: Found 2 edge set/s for test_cases.state_proxies.contract.StateProxyContract.__puya_arc4_router__ info: Writing state_proxies/out/StateProxyContract.arc32.json +info: Writing state_proxies/out/StateProxyContract.arc56.json info: Writing state_proxies/out/StateProxyContract.approval.teal info: Writing state_proxies/out/StateProxyContract.clear.teal info: Writing state_proxies/out/StateProxyContract.approval.bin diff --git a/test_cases/state_totals/out/Contract.approval.mir b/test_cases/state_totals/out/Contract.approval.mir index 6166081f81..b336067867 100644 --- a/test_cases/state_totals/out/Contract.approval.mir +++ b/test_cases/state_totals/out/Contract.approval.mir @@ -39,7 +39,7 @@ __puya_arc4_router___create@3: // @arc4.baremethod(create="require") txn ApplicationID tmp%3#0 ! tmp%4#0 - assert // is creating + assert // can only call when creating // state_totals/contract.py:14-15 // @arc4.baremethod(create="require") // def create(self) -> None: diff --git a/test_cases/state_totals/out/Contract.approval.teal b/test_cases/state_totals/out/Contract.approval.teal index bf198f15e9..7954fc89f1 100644 --- a/test_cases/state_totals/out/Contract.approval.teal +++ b/test_cases/state_totals/out/Contract.approval.teal @@ -21,7 +21,7 @@ __puya_arc4_router__: // @arc4.baremethod(create="require") txn ApplicationID ! - assert // is creating + assert // can only call when creating // state_totals/contract.py:14-15 // @arc4.baremethod(create="require") // def create(self) -> None: diff --git a/test_cases/state_totals/out/Contract.arc32.json b/test_cases/state_totals/out/Contract.arc32.json index 5c381bdf4d..82592e988b 100644 --- a/test_cases/state_totals/out/Contract.arc32.json +++ b/test_cases/state_totals/out/Contract.arc32.json @@ -1,7 +1,7 @@ { "hints": {}, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV90b3RhbHMuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjE0LTE1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzdGF0ZV90b3RhbHMvY29udHJhY3QucHk6Ni05CiAgICAvLyBjbGFzcyBDb250cmFjdCgKICAgIC8vICAgICBhcmM0LkFSQzRDb250cmFjdCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMobG9jYWxfYnl0ZXM9MSwgZ2xvYmFsX3VpbnRzPUdMT0JBTF9VSU5UUyksCiAgICAvLyApOgogICAgcHVzaGludCAwIC8vIDAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV90b3RhbHMuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNC0xNQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/state_totals/out/Contract.arc56.json b/test_cases/state_totals/out/Contract.arc56.json new file mode 100644 index 0000000000..2eaa979e89 --- /dev/null +++ b/test_cases/state_totals/out/Contract.arc56.json @@ -0,0 +1,85 @@ +{ + "name": "Contract", + "structs": {}, + "methods": [], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 1 + }, + "local": { + "ints": 1, + "bytes": 1 + } + }, + "keys": { + "global": { + "global_one": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z2xvYmFsX29uZQ==" + } + }, + "local": { + "local_one": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bG9jYWxfb25l" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 21 + ], + "errorMessage": "can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV90b3RhbHMuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNC0xNQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CogAAUOKAAExG0AADDEZQAAHMRgURIEBiYEAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/state_totals/out/Contract.destructured.ir b/test_cases/state_totals/out/Contract.destructured.ir index ef5b6277cf..1f675f3ef9 100644 --- a/test_cases/state_totals/out/Contract.destructured.ir +++ b/test_cases/state_totals/out/Contract.destructured.ir @@ -15,7 +15,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L6 return 0u diff --git a/test_cases/state_totals/out/Contract.ssa.ir b/test_cases/state_totals/out/Contract.ssa.ir index a835246609..8f6dcc277f 100644 --- a/test_cases/state_totals/out/Contract.ssa.ir +++ b/test_cases/state_totals/out/Contract.ssa.ir @@ -28,7 +28,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (== tmp%3#0 0u) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating test_cases.state_totals.contract.Contract.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/state_totals/out/Contract.ssa.opt_pass_1.ir b/test_cases/state_totals/out/Contract.ssa.opt_pass_1.ir index 5b43aface6..590fb8f866 100644 --- a/test_cases/state_totals/out/Contract.ssa.opt_pass_1.ir +++ b/test_cases/state_totals/out/Contract.ssa.opt_pass_1.ir @@ -20,7 +20,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L6 return 0u diff --git a/test_cases/state_totals/out/Contract.ssa.opt_pass_2.ir b/test_cases/state_totals/out/Contract.ssa.opt_pass_2.ir index 8dcfc7275e..0536fe02ad 100644 --- a/test_cases/state_totals/out/Contract.ssa.opt_pass_2.ir +++ b/test_cases/state_totals/out/Contract.ssa.opt_pass_2.ir @@ -18,7 +18,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L6 return 0u diff --git a/test_cases/state_totals/out/Contract.ssa.opt_pass_3.ir b/test_cases/state_totals/out/Contract.ssa.opt_pass_3.ir index ef5b6277cf..1f675f3ef9 100644 --- a/test_cases/state_totals/out/Contract.ssa.opt_pass_3.ir +++ b/test_cases/state_totals/out/Contract.ssa.opt_pass_3.ir @@ -15,7 +15,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L6 return 0u diff --git a/test_cases/state_totals/out_O2/Contract.approval.teal b/test_cases/state_totals/out_O2/Contract.approval.teal index 757adae2f4..df29455a2a 100644 --- a/test_cases/state_totals/out_O2/Contract.approval.teal +++ b/test_cases/state_totals/out_O2/Contract.approval.teal @@ -14,7 +14,7 @@ __puya_arc4_router__: bnz __puya_arc4_router___after_if_else@6 txn ApplicationID ! - assert // is creating + assert // can only call when creating pushint 1 // 1 retsub diff --git a/test_cases/state_totals/out_O2/Contract.destructured.ir b/test_cases/state_totals/out_O2/Contract.destructured.ir index ef5b6277cf..1f675f3ef9 100644 --- a/test_cases/state_totals/out_O2/Contract.destructured.ir +++ b/test_cases/state_totals/out_O2/Contract.destructured.ir @@ -15,7 +15,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating return 1u block@6: // after_if_else_L6 return 0u diff --git a/test_cases/state_totals/out_unoptimized/Contract.approval.teal b/test_cases/state_totals/out_unoptimized/Contract.approval.teal index 3251688f25..9dfc5ed626 100644 --- a/test_cases/state_totals/out_unoptimized/Contract.approval.teal +++ b/test_cases/state_totals/out_unoptimized/Contract.approval.teal @@ -51,7 +51,7 @@ __puya_arc4_router___create@3: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating // state_totals/contract.py:14-15 // @arc4.baremethod(create="require") // def create(self) -> None: diff --git a/test_cases/state_totals/out_unoptimized/Contract.destructured.ir b/test_cases/state_totals/out_unoptimized/Contract.destructured.ir index a835246609..8f6dcc277f 100644 --- a/test_cases/state_totals/out_unoptimized/Contract.destructured.ir +++ b/test_cases/state_totals/out_unoptimized/Contract.destructured.ir @@ -28,7 +28,7 @@ contract test_cases.state_totals.contract.Contract: block@3: // create_L14 let tmp%3#0: uint64 = (txn ApplicationID) let tmp%4#0: bool = (== tmp%3#0 0u) - (assert tmp%4#0) // is creating + (assert tmp%4#0) // can only call when creating test_cases.state_totals.contract.Contract.create() return 1u block@4: // switch_case_default_L6 diff --git a/test_cases/state_totals/puya.log b/test_cases/state_totals/puya.log index 246d9da8db..a2d3c8dd18 100644 --- a/test_cases/state_totals/puya.log +++ b/test_cases/state_totals/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_totals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_totals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_totals/out/module.awst debug: Sealing block@0: // L12 @@ -613,6 +613,7 @@ debug: Inserted __puya_arc4_router___create@3.ops[5]: 'l-store-copy tmp%4#0 0' debug: Replaced __puya_arc4_router___create@3.ops[7]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 1 edge set/s for test_cases.state_totals.contract.Contract.__puya_arc4_router__ info: Writing state_totals/out/Contract.arc32.json +info: Writing state_totals/out/Contract.arc56.json info: Writing state_totals/out/Contract.approval.teal info: Writing state_totals/out/Contract.clear.teal info: Writing state_totals/out/Contract.approval.bin diff --git a/test_cases/stress_tests/puya.log b/test_cases/stress_tests/puya.log index 5a3894b264..019260f70a 100644 --- a/test_cases/stress_tests/puya.log +++ b/test_cases/stress_tests/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stress_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stress_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing stress_tests/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/string_ops/puya.log b/test_cases/string_ops/puya.log index ff48d6b41d..735766ef63 100644 --- a/test_cases/string_ops/puya.log +++ b/test_cases/string_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['string_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['string_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing string_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/stubs/puya.log b/test_cases/stubs/puya.log index 9aa4921bc1..d13237c7c6 100644 --- a/test_cases/stubs/puya.log +++ b/test_cases/stubs/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stubs'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stubs'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing stubs/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/template_variables/out/TemplateVariablesContract.approval.mir b/test_cases/template_variables/out/TemplateVariablesContract.approval.mir index 92030273d0..e5cf840a5f 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.approval.mir +++ b/test_cases/template_variables/out/TemplateVariablesContract.approval.mir @@ -34,9 +34,9 @@ __puya_arc4_router___get_bytes_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub get_bytes to_encode%0#0 l-load-copy to_encode%0#0 0 to_encode%0#0,to_encode%0#0 (copy) len to_encode%0#0,length%0#0 @@ -56,9 +56,9 @@ __puya_arc4_router___get_big_uint_route@3: // @arc4.abimethod() txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating callsub get_big_uint tmp%12#0 byte 0x151f7c75 tmp%12#0,0x151f7c75 l-load tmp%12#0 1 0x151f7c75,tmp%12#0 @@ -79,7 +79,7 @@ __puya_arc4_router___on_update@7: // template_variables/contract.py:15 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:15-16 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def on_update(self) -> None: @@ -91,7 +91,7 @@ __puya_arc4_router___on_delete@8: // template_variables/contract.py:19 // @arc4.baremethod(allow_actions=["DeleteApplication"]) txn ApplicationID tmp%17#0 - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:19-20 // @arc4.baremethod(allow_actions=["DeleteApplication"]) // def on_delete(self) -> None: @@ -102,7 +102,7 @@ __puya_arc4_router___on_delete@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID tmp%19#0 ! tmp%20#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/template_variables/out/TemplateVariablesContract.approval.teal b/test_cases/template_variables/out/TemplateVariablesContract.approval.teal index 0f6a019658..953306c1ab 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.approval.teal +++ b/test_cases/template_variables/out/TemplateVariablesContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___get_bytes_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_bytes dup len @@ -47,9 +47,9 @@ __puya_arc4_router___get_big_uint_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_big_uint bytec_0 // 0x151f7c75 swap @@ -70,7 +70,7 @@ __puya_arc4_router___on_update@7: // template_variables/contract.py:15 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:15-16 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def on_update(self) -> None: @@ -82,7 +82,7 @@ __puya_arc4_router___on_delete@8: // template_variables/contract.py:19 // @arc4.baremethod(allow_actions=["DeleteApplication"]) txn ApplicationID - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:19-20 // @arc4.baremethod(allow_actions=["DeleteApplication"]) // def on_delete(self) -> None: @@ -93,7 +93,7 @@ __puya_arc4_router___on_delete@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/template_variables/out/TemplateVariablesContract.arc32.json b/test_cases/template_variables/out/TemplateVariablesContract.arc32.json index 56fdd489ad..ec7cab4ea5 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.arc32.json +++ b/test_cases/template_variables/out/TemplateVariablesContract.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0IFRNUExfVVBEQVRBQkxFIFRNUExfREVMRVRBQkxFCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgVE1QTF9TT01FX0JZVEVTIFRNUExfU09NRV9CSUdfVUlOVAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDJmY2FkZGY2IDB4MzdmNjRjZjMgLy8gbWV0aG9kICJnZXRfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2JpZ191aW50KCl1aW50NTEyIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2J5dGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9ieXRlc19yb3V0ZUAyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9iaWdfdWludF9yb3V0ZUAzOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX3VpbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjUKICAgIC8vIGNsYXNzIFRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fb25fdXBkYXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fb25fZGVsZXRlQDgKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX3VwZGF0ZUA3OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNS0xNgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBvbl91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgb25fdXBkYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vbl9kZWxldGVAODoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fZGVsZXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIG9uX2RlbGV0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5nZXRfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2J5dGVzOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYtNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfYnl0ZXMoc2VsZikgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXJbQnl0ZXNdKCJTT01FX0JZVEVTIikKICAgIGJ5dGVjXzEgLy8gVE1QTF9TT01FX0JZVEVTCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmdldF9iaWdfdWludCgpIC0+IGJ5dGVzOgpnZXRfYmlnX3VpbnQ6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ2V0X2JpZ191aW50KHNlbGYpIC0+IFVJbnQ1MTI6CiAgICBwcm90byAwIDEKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxMgogICAgLy8geCA9IFRlbXBsYXRlVmFyW0JpZ1VJbnRdKCJTT01FX0JJR19VSU5UIikKICAgIGJ5dGVjXzIgLy8gVE1QTF9TT01FX0JJR19VSU5UCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTMKICAgIC8vIHJldHVybiBVSW50NTEyKHgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5vbl91cGRhdGUoKSAtPiB2b2lkOgpvbl91cGRhdGU6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXJ0IFRlbXBsYXRlVmFyW2Jvb2xdKCJVUERBVEFCTEUiKQogICAgaW50Y18zIC8vIFRNUExfVVBEQVRBQkxFCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3Qub25fZGVsZXRlKCkgLT4gdm9pZDoKb25fZGVsZXRlOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX2RlbGV0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCBUZW1wbGF0ZVZhcltVSW50NjRdKCJERUxFVEFCTEUiKQogICAgaW50YyA0IC8vIFRNUExfREVMRVRBQkxFCiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0IFRNUExfVVBEQVRBQkxFIFRNUExfREVMRVRBQkxFCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgVE1QTF9TT01FX0JZVEVTIFRNUExfU09NRV9CSUdfVUlOVAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDJmY2FkZGY2IDB4MzdmNjRjZjMgLy8gbWV0aG9kICJnZXRfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2JpZ191aW50KCl1aW50NTEyIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2J5dGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9ieXRlc19yb3V0ZUAyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2J5dGVzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDM6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2JpZ191aW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBUZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX3VwZGF0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX2RlbGV0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vbl91cGRhdGVANzoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBvbl91cGRhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX2RlbGV0ZUA4OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fZGVsZXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIG9uX2RlbGV0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjUKICAgIC8vIGNsYXNzIFRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QuZ2V0X2J5dGVzKCkgLT4gYnl0ZXM6CmdldF9ieXRlczoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo2LTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ2V0X2J5dGVzKHNlbGYpIC0+IEJ5dGVzOgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6OAogICAgLy8gcmV0dXJuIFRlbXBsYXRlVmFyW0J5dGVzXSgiU09NRV9CWVRFUyIpCiAgICBieXRlY18xIC8vIFRNUExfU09NRV9CWVRFUwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5nZXRfYmlnX3VpbnQoKSAtPiBieXRlczoKZ2V0X2JpZ191aW50OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfdWludChzZWxmKSAtPiBVSW50NTEyOgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTIKICAgIC8vIHggPSBUZW1wbGF0ZVZhcltCaWdVSW50XSgiU09NRV9CSUdfVUlOVCIpCiAgICBieXRlY18yIC8vIFRNUExfU09NRV9CSUdfVUlOVAogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyByZXR1cm4gVUludDUxMih4KQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3Qub25fdXBkYXRlKCkgLT4gdm9pZDoKb25fdXBkYXRlOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTcKICAgIC8vIGFzc2VydCBUZW1wbGF0ZVZhcltib29sXSgiVVBEQVRBQkxFIikKICAgIGludGNfMyAvLyBUTVBMX1VQREFUQUJMRQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0Lm9uX2RlbGV0ZSgpIC0+IHZvaWQ6Cm9uX2RlbGV0ZToKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxOS0yMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBvbl9kZWxldGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBhc3NlcnQgVGVtcGxhdGVWYXJbVUludDY0XSgiREVMRVRBQkxFIikKICAgIGludGMgNCAvLyBUTVBMX0RFTEVUQUJMRQogICAgYXNzZXJ0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/template_variables/out/TemplateVariablesContract.arc56.json b/test_cases/template_variables/out/TemplateVariablesContract.arc56.json new file mode 100644 index 0000000000..222f1900a2 --- /dev/null +++ b/test_cases/template_variables/out/TemplateVariablesContract.arc56.json @@ -0,0 +1,148 @@ +{ + "name": "TemplateVariablesContract", + "structs": {}, + "methods": [ + { + "name": "get_bytes", + "args": [], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_big_uint", + "args": [], + "returns": { + "type": "uint512" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "DeleteApplication", + "UpdateApplication" + ] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 55, + 79 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 129 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 58, + 82, + 112, + 120 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 147 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0IFRNUExfVVBEQVRBQkxFIFRNUExfREVMRVRBQkxFCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgVE1QTF9TT01FX0JZVEVTIFRNUExfU09NRV9CSUdfVUlOVAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDJmY2FkZGY2IDB4MzdmNjRjZjMgLy8gbWV0aG9kICJnZXRfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2JpZ191aW50KCl1aW50NTEyIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2J5dGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9ieXRlc19yb3V0ZUAyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2J5dGVzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDM6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2JpZ191aW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo1CiAgICAvLyBjbGFzcyBUZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX3VwZGF0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX2RlbGV0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vbl91cGRhdGVANzoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBvbl91cGRhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29uX2RlbGV0ZUA4OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fZGVsZXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIG9uX2RlbGV0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjUKICAgIC8vIGNsYXNzIFRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QuZ2V0X2J5dGVzKCkgLT4gYnl0ZXM6CmdldF9ieXRlczoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo2LTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ2V0X2J5dGVzKHNlbGYpIC0+IEJ5dGVzOgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6OAogICAgLy8gcmV0dXJuIFRlbXBsYXRlVmFyW0J5dGVzXSgiU09NRV9CWVRFUyIpCiAgICBieXRlY18xIC8vIFRNUExfU09NRV9CWVRFUwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5nZXRfYmlnX3VpbnQoKSAtPiBieXRlczoKZ2V0X2JpZ191aW50OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfdWludChzZWxmKSAtPiBVSW50NTEyOgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTIKICAgIC8vIHggPSBUZW1wbGF0ZVZhcltCaWdVSW50XSgiU09NRV9CSUdfVUlOVCIpCiAgICBieXRlY18yIC8vIFRNUExfU09NRV9CSUdfVUlOVAogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyByZXR1cm4gVUludDUxMih4KQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3Qub25fdXBkYXRlKCkgLT4gdm9pZDoKb25fdXBkYXRlOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTcKICAgIC8vIGFzc2VydCBUZW1wbGF0ZVZhcltib29sXSgiVVBEQVRBQkxFIikKICAgIGludGNfMyAvLyBUTVBMX1VQREFUQUJMRQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0Lm9uX2RlbGV0ZSgpIC0+IHZvaWQ6Cm9uX2RlbGV0ZToKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxOS0yMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBvbl9kZWxldGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBhc3NlcnQgVGVtcGxhdGVWYXJbVUludDY0XSgiREVMRVRBQkxFIikKICAgIGludGMgNCAvLyBUTVBMX0RFTEVUQUJMRQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAFAQBAAAAmAwQVH3x1AACIAAFDigABMRtBAD+CAgQvyt32BDf2TPM2GgCOAgACABojiTEZFEQxGESIAEhJFRZXBgJMUChMULAiiTEZFEQxGESIADUoTFCwIokxGY0GABIAGAAYABgAAgAKI4kxGESIACQiiTEYRIgAIiKJMRgURCKJI4mKAAEpiYoAASpJFSQORCSvq4mKAAAlRImKAAAhBESJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": { + "SOME_BYTES": { + "type": "AVMBytes", + "value": "" + }, + "SOME_BIG_UINT": { + "type": "AVMBytes", + "value": "" + }, + "UPDATABLE": { + "type": "AVMUint64", + "value": "AAAAAAAAAAA=" + }, + "DELETABLE": { + "type": "AVMUint64", + "value": "AAAAAAAAAAA=" + } + } +} \ No newline at end of file diff --git a/test_cases/template_variables/out/TemplateVariablesContract.destructured.ir b/test_cases/template_variables/out/TemplateVariablesContract.destructured.ir index 102a08d31b..b343ead5cd 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.destructured.ir +++ b/test_cases/template_variables/out/TemplateVariablesContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@2: // get_bytes_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_bytes() let length%0#0: uint64 = (len to_encode%0#0) let as_bytes%0#0: bytes = (itob length%0#0) @@ -29,9 +29,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@3: // get_big_uint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_big_uint() let tmp%13#0: bytes = (concat 0x151f7c75 tmp%12#0) (log tmp%13#0) @@ -41,18 +41,18 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: goto_nth [block@9, block@12, block@12, block@12, block@7, block@8][tmp%14#0] else return 0u block@7: // on_update_L15 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_update() return 1u block@8: // on_delete_L19 let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_delete() return 1u block@9: // __algopy_default_create_L1 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // is creating + (assert tmp%20#0) // can only call when creating return 1u block@12: // after_if_else_L5 return 0u diff --git a/test_cases/template_variables/out/TemplateVariablesContract.ssa.ir b/test_cases/template_variables/out/TemplateVariablesContract.ssa.ir index 9e162ecc0f..0ba3abf906 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.ssa.ir +++ b/test_cases/template_variables/out/TemplateVariablesContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@2: // get_bytes_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_bytes() let length%0#0: uint64 = (len to_encode%0#0) let as_bytes%0#0: bytes = (itob length%0#0) @@ -31,10 +31,10 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@3: // get_big_uint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_big_uint() let tmp%13#0: bytes = (concat 0x151f7c75 tmp%12#0) (log tmp%13#0) @@ -49,19 +49,19 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@7: // on_update_L15 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_update() return 1u block@8: // on_delete_L19 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_delete() return 1u block@9: // __algopy_default_create_L1 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (== tmp%19#0 0u) - (assert tmp%20#0) // is creating + (assert tmp%20#0) // can only call when creating test_cases.template_variables.contract.TemplateVariablesContract.__algopy_default_create() return 1u block@10: // switch_case_default_L5 diff --git a/test_cases/template_variables/out/TemplateVariablesContract.ssa.opt_pass_1.ir b/test_cases/template_variables/out/TemplateVariablesContract.ssa.opt_pass_1.ir index 102a08d31b..b343ead5cd 100644 --- a/test_cases/template_variables/out/TemplateVariablesContract.ssa.opt_pass_1.ir +++ b/test_cases/template_variables/out/TemplateVariablesContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@2: // get_bytes_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_bytes() let length%0#0: uint64 = (len to_encode%0#0) let as_bytes%0#0: bytes = (itob length%0#0) @@ -29,9 +29,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@3: // get_big_uint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_big_uint() let tmp%13#0: bytes = (concat 0x151f7c75 tmp%12#0) (log tmp%13#0) @@ -41,18 +41,18 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: goto_nth [block@9, block@12, block@12, block@12, block@7, block@8][tmp%14#0] else return 0u block@7: // on_update_L15 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_update() return 1u block@8: // on_delete_L19 let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_delete() return 1u block@9: // __algopy_default_create_L1 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // is creating + (assert tmp%20#0) // can only call when creating return 1u block@12: // after_if_else_L5 return 0u diff --git a/test_cases/template_variables/out_O2/TemplateVariablesContract.approval.teal b/test_cases/template_variables/out_O2/TemplateVariablesContract.approval.teal index 858d0b4b1a..b1401a9ef6 100644 --- a/test_cases/template_variables/out_O2/TemplateVariablesContract.approval.teal +++ b/test_cases/template_variables/out_O2/TemplateVariablesContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___get_bytes_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_bytes dup len @@ -41,9 +41,9 @@ __puya_arc4_router___get_bytes_route@2: __puya_arc4_router___get_big_uint_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub get_big_uint bytec_0 // 0x151f7c75 swap @@ -60,14 +60,14 @@ __puya_arc4_router___bare_routing@6: __puya_arc4_router___on_update@7: txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub on_update intc_0 // 1 retsub __puya_arc4_router___on_delete@8: txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub on_delete intc_0 // 1 retsub @@ -75,7 +75,7 @@ __puya_arc4_router___on_delete@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/template_variables/out_O2/TemplateVariablesContract.destructured.ir b/test_cases/template_variables/out_O2/TemplateVariablesContract.destructured.ir index 102a08d31b..b343ead5cd 100644 --- a/test_cases/template_variables/out_O2/TemplateVariablesContract.destructured.ir +++ b/test_cases/template_variables/out_O2/TemplateVariablesContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@2: // get_bytes_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_bytes() let length%0#0: uint64 = (len to_encode%0#0) let as_bytes%0#0: bytes = (itob length%0#0) @@ -29,9 +29,9 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@3: // get_big_uint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_big_uint() let tmp%13#0: bytes = (concat 0x151f7c75 tmp%12#0) (log tmp%13#0) @@ -41,18 +41,18 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: goto_nth [block@9, block@12, block@12, block@12, block@7, block@8][tmp%14#0] else return 0u block@7: // on_update_L15 let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_update() return 1u block@8: // on_delete_L19 let tmp%17#0: uint64 = (txn ApplicationID) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_delete() return 1u block@9: // __algopy_default_create_L1 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (! tmp%19#0) - (assert tmp%20#0) // is creating + (assert tmp%20#0) // can only call when creating return 1u block@12: // after_if_else_L5 return 0u diff --git a/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.approval.teal b/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.approval.teal index 3179969c56..3f65e4bcec 100644 --- a/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.approval.teal +++ b/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___get_bytes_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_bytes dup len @@ -54,11 +54,11 @@ __puya_arc4_router___get_big_uint_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub get_big_uint bytec_0 // 0x151f7c75 swap @@ -87,7 +87,7 @@ __puya_arc4_router___on_update@7: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:15-16 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def on_update(self) -> None: @@ -101,7 +101,7 @@ __puya_arc4_router___on_delete@8: txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // template_variables/contract.py:19-20 // @arc4.baremethod(allow_actions=["DeleteApplication"]) // def on_delete(self) -> None: @@ -113,7 +113,7 @@ __puya_arc4_router_____algopy_default_create@9: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.destructured.ir b/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.destructured.ir index 9e162ecc0f..0ba3abf906 100644 --- a/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.destructured.ir +++ b/test_cases/template_variables/out_unoptimized/TemplateVariablesContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@2: // get_bytes_route_L6 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_bytes() let length%0#0: uint64 = (len to_encode%0#0) let as_bytes%0#0: bytes = (itob length%0#0) @@ -31,10 +31,10 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@3: // get_big_uint_route_L10 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = test_cases.template_variables.contract.TemplateVariablesContract.get_big_uint() let tmp%13#0: bytes = (concat 0x151f7c75 tmp%12#0) (log tmp%13#0) @@ -49,19 +49,19 @@ contract test_cases.template_variables.contract.TemplateVariablesContract: block@7: // on_update_L15 let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_update() return 1u block@8: // on_delete_L19 let tmp%17#0: uint64 = (txn ApplicationID) let tmp%18#0: bool = (!= tmp%17#0 0u) - (assert tmp%18#0) // is not creating + (assert tmp%18#0) // can only call when not creating test_cases.template_variables.contract.TemplateVariablesContract.on_delete() return 1u block@9: // __algopy_default_create_L1 let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (== tmp%19#0 0u) - (assert tmp%20#0) // is creating + (assert tmp%20#0) // can only call when creating test_cases.template_variables.contract.TemplateVariablesContract.__algopy_default_create() return 1u block@10: // switch_case_default_L5 diff --git a/test_cases/template_variables/puya.log b/test_cases/template_variables/puya.log index da3f806621..f955eb6460 100644 --- a/test_cases/template_variables/puya.log +++ b/test_cases/template_variables/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SOME_BYTES': b'', 'SOME_BIG_UINT': b'', 'UPDATABLE': 0, 'DELETABLE': 0}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['template_variables'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SOME_BYTES': b'', 'SOME_BIG_UINT': b'', 'UPDATABLE': 0, 'DELETABLE': 0}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['template_variables'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing template_variables/out/module.awst debug: Sealing block@0: // L12 @@ -722,6 +722,7 @@ debug: Inserted get_big_uint_block@0.ops[4]: 'l-store-copy x#0 0' debug: Replaced get_big_uint_block@0.ops[19]: 'v-load x#0' with 'l-load x#0' debug: Found 3 edge set/s for test_cases.template_variables.contract.TemplateVariablesContract.__puya_arc4_router__ info: Writing template_variables/out/TemplateVariablesContract.arc32.json +info: Writing template_variables/out/TemplateVariablesContract.arc56.json info: Writing template_variables/out/TemplateVariablesContract.approval.teal info: Writing template_variables/out/TemplateVariablesContract.clear.teal info: Writing template_variables/out/TemplateVariablesContract.approval.bin diff --git a/test_cases/too_many_permutations/puya.log b/test_cases/too_many_permutations/puya.log index 3071ef21b3..5a0333e4d6 100644 --- a/test_cases/too_many_permutations/puya.log +++ b/test_cases/too_many_permutations/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['too_many_permutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['too_many_permutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing too_many_permutations/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/transaction/out/TransactionContract.approval.mir b/test_cases/transaction/out/TransactionContract.approval.mir index a32164d5f1..2dcc32969a 100644 --- a/test_cases/transaction/out/TransactionContract.approval.mir +++ b/test_cases/transaction/out/TransactionContract.approval.mir @@ -42,10 +42,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 ! tmp%6#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 @@ -54,9 +54,9 @@ __puya_arc4_router___pay_route@3: // @arc4.abimethod txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%11#0 @@ -79,9 +79,9 @@ __puya_arc4_router___key_route@4: // @arc4.abimethod txn OnCompletion tmp%12#0 ! tmp%13#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%14#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%16#0 @@ -104,9 +104,9 @@ __puya_arc4_router___asset_config_route@5: // @arc4.abimethod txn OnCompletion tmp%17#0 ! tmp%18#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%19#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%21#0 @@ -129,9 +129,9 @@ __puya_arc4_router___asset_transfer_route@6: // @arc4.abimethod txn OnCompletion tmp%22#0 ! tmp%23#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%24#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%26#0 @@ -154,9 +154,9 @@ __puya_arc4_router___asset_freeze_route@7: // @arc4.abimethod txn OnCompletion tmp%27#0 ! tmp%28#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%29#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%31#0 @@ -179,9 +179,9 @@ __puya_arc4_router___application_call_route@8: // @arc4.abimethod txn OnCompletion tmp%32#0 ! tmp%33#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%34#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%36#0 @@ -204,9 +204,9 @@ __puya_arc4_router___multiple_txns_route@9: // @arc4.abimethod txn OnCompletion tmp%37#0 ! tmp%38#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%39#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%41#0 @@ -247,9 +247,9 @@ __puya_arc4_router___any_txn_route@10: // @arc4.abimethod txn OnCompletion tmp%44#0 ! tmp%45#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%46#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%48#0 @@ -275,9 +275,9 @@ __puya_arc4_router___group_init_route@11: // @arc4.abimethod txn OnCompletion tmp%51#0 ! tmp%52#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%53#0 - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex tmp%55#0 diff --git a/test_cases/transaction/out/TransactionContract.approval.teal b/test_cases/transaction/out/TransactionContract.approval.teal index 0cb2d2824a..a06a1e2bdb 100644 --- a/test_cases/transaction/out/TransactionContract.approval.teal +++ b/test_cases/transaction/out/TransactionContract.approval.teal @@ -24,10 +24,10 @@ __puya_arc4_router___create_route@2: // @arc4.abimethod(create="require") txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub @@ -36,9 +36,9 @@ __puya_arc4_router___pay_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -60,9 +60,9 @@ __puya_arc4_router___key_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -84,9 +84,9 @@ __puya_arc4_router___asset_config_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -108,9 +108,9 @@ __puya_arc4_router___asset_transfer_route@6: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -132,9 +132,9 @@ __puya_arc4_router___asset_freeze_route@7: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -156,9 +156,9 @@ __puya_arc4_router___application_call_route@8: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -180,9 +180,9 @@ __puya_arc4_router___multiple_txns_route@9: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -220,9 +220,9 @@ __puya_arc4_router___any_txn_route@10: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -245,9 +245,9 @@ __puya_arc4_router___group_init_route@11: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex diff --git a/test_cases/transaction/out/TransactionContract.arc32.json b/test_cases/transaction/out/TransactionContract.arc32.json index 64d2a17a20..6ceb35bcc4 100644 --- a/test_cases/transaction/out/TransactionContract.arc32.json +++ b/test_cases/transaction/out/TransactionContract.arc32.json @@ -52,7 +52,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMiAzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNQogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NmI2ODAzMTggMHgxNmM0YTMyZCAweDYzOTg3MmQ2IDB4NTBmOGYxYzMgMHg1YjNhMDBjZiAweGNkNjIyOTNkIDB4MDJlYTcyZTUgMHgzMDU2ODQwYiAweDk2ZWY5YTk1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJwYXkocGF5KXZvaWQiLCBtZXRob2QgImtleShrZXlyZWcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKGFjZmcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYXhmZXIpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZnJlZXplKGFmcnopdm9pZCIsIG1ldGhvZCAiYXBwbGljYXRpb25fY2FsbChhcHBsKXZvaWQiLCBtZXRob2QgIm11bHRpcGxlX3R4bnMoYXBwbCxhcHBsLGFwcGwpdm9pZCIsIG1ldGhvZCAiYW55X3R4bih0eG4sdHhuLHR4bil2b2lkIiwgbWV0aG9kICJncm91cF9pbml0KHR4bix0eG4sdHhuKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF9jb25maWdfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tdWx0aXBsZV90eG5zX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncm91cF9pbml0X3JvdXRlQDExCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcGF5X3JvdXRlQDM6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGtleXJlZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGtleXJlZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBrZXkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2NvbmZpZ19yb3V0ZUA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYXNzZXRfZnJlZXplX3JvdXRlQDc6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBhZnJ6CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWZyegogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9mcmVlemUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAODoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFwcGxpY2F0aW9uX2NhbGwKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX211bHRpcGxlX3R4bnNfcm91dGVAOToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18zIC8vIDMKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtdWx0aXBsZV90eG5zCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbnlfdHhuX3JvdXRlQDEwOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMwogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFueV90eG4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyb3VwX2luaXRfcm91dGVAMTE6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAzCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZ3JvdXBfaW5pdAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QucGF5KHR4bjogdWludDY0KSAtPiB2b2lkOgpwYXk6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5KHNlbGYsIHR4bjogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzUKICAgIC8vIHR4bi5yZWNlaXZlciA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHR4bi5yZWNlaXZlciA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBzaG91bGQgYmUgZm9yIHRoaXMgYXBwIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2hvdWxkIGJlIGZvciB0aGlzIGFwcAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCB0eG4uYW1vdW50ID4gMTAwMCwgIlBheW1lbnQgc2hvdWxkIGJlIGZvciA+MTAwMCBtaWNybyBhbGdvcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgPgogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2hvdWxkIGJlIGZvciA+MTAwMCBtaWNybyBhbGdvcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCB0eG4uY2xvc2VfcmVtYWluZGVyX3RvID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJjbG9zZV9yZW1haW5kZXJfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjbG9zZV9yZW1haW5kZXJfdG8KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5fY29tbW9uX2NoZWNrcyh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKX2NvbW1vbl9jaGVja3M6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNi0xNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY29tbW9uX2NoZWNrcyhzZWxmLCB0eG46IGd0eG4uVHJhbnNhY3Rpb25CYXNlKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxOAogICAgLy8gYXNzZXJ0IHR4bi50eG5faWQsICJ0eG5faWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR4SUQKICAgIGxlbgogICAgYXNzZXJ0IC8vIHR4bl9pZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIGFzc2VydCB0eG4uc2VuZGVyID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJzZW5kZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCB0eG4uZmVlLCAiZmVlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGZWUKICAgIGFzc2VydCAvLyBmZWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBhc3NlcnQgdHhuLnR5cGUsICJ0eXBlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlRW51bQogICAgYXNzZXJ0IC8vIHR5cGUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhc3NlcnQgdHhuLnR5cGVfYnl0ZXMsICJ0eXBlX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlCiAgICBsZW4KICAgIGFzc2VydCAvLyB0eXBlX2J5dGVzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyMwogICAgLy8gYXNzZXJ0IHR4bi5ub3RlID09IEJ5dGVzKGIiIiksICJub3RlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOb3RlCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQgLy8gbm90ZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCB0eG4uZ3JvdXBfaW5kZXggPT0gMCwgImdyb3VwX2luZGV4IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQgLy8gZ3JvdXBfaW5kZXgKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgdHhuLmZpcnN0X3ZhbGlkLCAiZmlyc3RfdmFsaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZpcnN0VmFsaWQKICAgIGFzc2VydCAvLyBmaXJzdF92YWxpZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjYtMjcKICAgIC8vICMgYXNzZXJ0IHR4bi5maXJzdF92YWxpZF90aW1lLCAiZmlyc3RfdmFsaWRfdGltZSIgIyB0aGlzIHZhbHVlIGNhbiBiZSBmbGFreSBpbiB0ZXN0cwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X3ZhbGlkLCAibGFzdF92YWxpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGFzdFZhbGlkCiAgICBhc3NlcnQgLy8gbGFzdF92YWxpZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCB0eG4ubGVhc2UsICJsZWFzZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGVhc2UKICAgIGxlbgogICAgYXNzZXJ0IC8vIGxlYXNlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IHR4bi5yZWtleV90byA9PSBvcC5HbG9iYWwuemVyb19hZGRyZXNzLCAicmVrZXlfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleV90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmtleSh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKa2V5OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAtNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGtleShzZWxmLCB0eG46IGd0eG4uS2V5UmVnaXN0cmF0aW9uVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCB0eG4udm90ZV9rZXksICJ2b3RlX2tleSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZVBLCiAgICBsZW4KICAgIGFzc2VydCAvLyB2b3RlX2tleQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB0eG4uc2VsZWN0aW9uX2tleSwgInNlbGVjdGlvbl9rZXkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbGVjdGlvblBLCiAgICBsZW4KICAgIGFzc2VydCAvLyBzZWxlY3Rpb25fa2V5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NQogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2tleV9kaWx1dGlvbiwgInZvdGVfa2V5X2RpbHV0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlS2V5RGlsdXRpb24KICAgIGFzc2VydCAvLyB2b3RlX2tleV9kaWx1dGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDYKICAgIC8vIGFzc2VydCB0eG4udm90ZV9maXJzdCwgInZvdGVfZmlyc3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFZvdGVGaXJzdAogICAgYXNzZXJ0IC8vIHZvdGVfZmlyc3QKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgdHhuLnZvdGVfbGFzdCwgInZvdGVfbGFzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZUxhc3QKICAgIGFzc2VydCAvLyB2b3RlX2xhc3QKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgdHhuLm5vbl9wYXJ0aWNpcGF0aW9uLCAibm9uX3BhcnRpY2lwYXRpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE5vbnBhcnRpY2lwYXRpb24KICAgIGFzc2VydCAvLyBub25fcGFydGljaXBhdGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCB0eG4uc3RhdGVfcHJvb2Zfa2V5LCAic3RhdGVfcHJvb2Zfa2V5IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTdGF0ZVByb29mUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHN0YXRlX3Byb29mX2tleQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X2NvbmZpZyh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEtNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZyhzZWxmLCB0eG46IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHR4bi5jb25maWdfYXNzZXQsICJjb25maWdfYXNzZXQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0CiAgICBhc3NlcnQgLy8gY29uZmlnX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IHR4bi50b3RhbCwgInRvdGFsIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gdG90YWwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBhc3NlcnQgdHhuLmRlY2ltYWxzLCAiZGVjaW1hbHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBkZWNpbWFscwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCB0eG4uZGVmYXVsdF9mcm96ZW4sICJkZWZhdWx0X2Zyb3plbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICBhc3NlcnQgLy8gZGVmYXVsdF9mcm96ZW4KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdHhuLnVuaXRfbmFtZSwgInVuaXRfbmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgbGVuCiAgICBhc3NlcnQgLy8gdW5pdF9uYW1lCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9uYW1lLCAiYXNzZXRfbmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXROYW1lCiAgICBsZW4KICAgIGFzc2VydCAvLyBhc3NldF9uYW1lCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHR4bi51cmwsICJ1cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0VVJMCiAgICBsZW4KICAgIGFzc2VydCAvLyB1cmwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhc3NlcnQgdHhuLm1ldGFkYXRhX2hhc2gsICJtZXRhZGF0YV9oYXNoIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldE1ldGFkYXRhSGFzaAogICAgbGVuCiAgICBhc3NlcnQgLy8gbWV0YWRhdGFfaGFzaAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjMKICAgIC8vIGFzc2VydCB0eG4ubWFuYWdlciwgIm1hbmFnZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1hbmFnZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgdHhuLnJlc2VydmUsICJyZXNlcnZlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFJlc2VydmUKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZXNlcnZlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2NQogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemUsICJmcmVlemUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0RnJlZXplCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZnJlZXplCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gYXNzZXJ0IHR4bi5jbGF3YmFjaywgImNsYXdiYWNrIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldENsYXdiYWNrCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gY2xhd2JhY2sKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5hc3NldF90cmFuc2Zlcih0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoc2VsZiwgdHhuOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHR4bi54ZmVyX2Fzc2V0LCAieGZlcl9hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBhc3NlcnQgLy8geGZlcl9hc3NldAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfYW1vdW50LCAiYXNzZXRfYW1vdW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYXNzZXJ0IC8vIGFzc2V0X2Ftb3VudAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfc2VuZGVyLCAiYXNzZXRfc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFNlbmRlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X3NlbmRlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfcmVjZWl2ZXIsICJhc3NldF9yZWNlaXZlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X3JlY2VpdmVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9jbG9zZV90bywgImFzc2V0X2Nsb3NlX3RvIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhc3NldF9jbG9zZV90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X2ZyZWV6ZSh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfZnJlZXplOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2ZyZWV6ZShzZWxmLCB0eG46IGd0eG4uQXNzZXRGcmVlemVUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzkKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemVfYXNzZXQsICJmcmVlemVfYXNzZXQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0CiAgICBhc3NlcnQgLy8gZnJlZXplX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemVfYWNjb3VudCwgImZyZWV6ZV9hY2NvdW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGcmVlemVBc3NldEFjY291bnQKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmcmVlemVfYWNjb3VudAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODMKICAgIC8vIGFzc2VydCB0eG4uZnJvemVuLCAiZnJvemVuIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGcmVlemVBc3NldEZyb3plbgogICAgYXNzZXJ0IC8vIGZyb3plbgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFwcGxpY2F0aW9uX2NhbGwodHhuOiB1aW50NjQpIC0+IHZvaWQ6CmFwcGxpY2F0aW9uX2NhbGw6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXBwbGljYXRpb25fY2FsbChzZWxmLCB0eG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCB0eG4uYXBwX2lkLCAiYXBwX2lkIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gYXBwX2lkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4OQogICAgLy8gYXNzZXJ0IHR4bi5vbl9jb21wbGV0aW9uLCAib25fY29tcGxldGlvbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICBhc3NlcnQgLy8gb25fY29tcGxldGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTAKICAgIC8vIGFzc2VydCB0eG4ubnVtX2FwcF9hcmdzLCAibnVtX2FwcF9hcmdzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHBBcmdzCiAgICBhc3NlcnQgLy8gbnVtX2FwcF9hcmdzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHR4bi5udW1fYWNjb3VudHMsICJudW1fYWNjb3VudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFjY291bnRzCiAgICBhc3NlcnQgLy8gbnVtX2FjY291bnRzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IHR4bi5hcHByb3ZhbF9wcm9ncmFtLCAiYXBwcm92YWxfcHJvZ3JhbSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXBwcm92YWxQcm9ncmFtCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHByb3ZhbF9wcm9ncmFtCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MwogICAgLy8gYXNzZXJ0IHR4bi5jbGVhcl9zdGF0ZV9wcm9ncmFtLCAiY2xlYXJfc3RhdGVfcHJvZ3JhbSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGxlbgogICAgYXNzZXJ0IC8vIGNsZWFyX3N0YXRlX3Byb2dyYW0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgdHhuLm51bV9hc3NldHMsICJudW1fYXNzZXRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1Bc3NldHMKICAgIGFzc2VydCAvLyBudW1fYXNzZXRzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwcywgIm51bV9hcHBzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHBsaWNhdGlvbnMKICAgIGFzc2VydCAvLyBudW1fYXBwcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTYKICAgIC8vIGFzc2VydCB0eG4uZ2xvYmFsX251bV91aW50LCAiZ2xvYmFsX251bV91aW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHbG9iYWxOdW1VaW50CiAgICBhc3NlcnQgLy8gZ2xvYmFsX251bV91aW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHR4bi5nbG9iYWxfbnVtX2J5dGVzLCAiZ2xvYmFsX251bV9ieXRlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBhc3NlcnQgLy8gZ2xvYmFsX251bV9ieXRlcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTgKICAgIC8vIGFzc2VydCB0eG4ubG9jYWxfbnVtX3VpbnQsICJsb2NhbF9udW1fdWludCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTG9jYWxOdW1VaW50CiAgICBhc3NlcnQgLy8gbG9jYWxfbnVtX3VpbnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdHhuLmxvY2FsX251bV9ieXRlcywgImxvY2FsX251bV9ieXRlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBsb2NhbF9udW1fYnl0ZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYXNzZXJ0IHR4bi5leHRyYV9wcm9ncmFtX3BhZ2VzLCAiZXh0cmFfcHJvZ3JhbV9wYWdlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGFzc2VydCAvLyBleHRyYV9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDEKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2csICJsYXN0X2xvZyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGFzdExvZwogICAgbGVuCiAgICBhc3NlcnQgLy8gbGFzdF9sb2cKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwcm92YWxfcHJvZ3JhbV9wYWdlcywgIm51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIG51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDMKICAgIC8vIGFzc2VydCB0eG4ubnVtX2NsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMsICJudW1fY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIG51bV9jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCB0eG4uYXBwX2FyZ3MoMCksICJhcHBfYXJncygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHBfYXJncygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA1CiAgICAvLyBhc3NlcnQgdHhuLmFjY291bnRzKDApLCAiYWNjb3VudHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFjY291bnRzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWNjb3VudHMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gYXNzZXJ0IHR4bi5hc3NldHMoMCksICJhc3NldHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFzc2V0cwogICAgYXNzZXJ0IC8vIGFzc2V0cygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgdHhuLmFwcHMoMCksICJhcHBzKDApIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbnMKICAgIGFzc2VydCAvLyBhcHBzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDgKICAgIC8vIGFzc2VydCB0eG4uYXBwcm92YWxfcHJvZ3JhbV9wYWdlcygwKSwgImFwcHJvdmFsX3Byb2dyYW1fcGFnZXMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCB0eG4uY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKSwgImNsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGxlbgogICAgYXNzZXJ0IC8vIGNsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMoMCkKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5tdWx0aXBsZV90eG5zKHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6Cm11bHRpcGxlX3R4bnM6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMTEtMTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtdWx0aXBsZV90eG5zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCm11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IGFwcC5ncm91cF9pbmRleCA9PSBpbmRleAogICAgc3dhcAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGluZGV4LCBhcHAgaW4gdWVudW1lcmF0ZSgodHhuMSwgdHhuMiwgdHhuMykpOgogICAgc3dpdGNoIG11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8xQDMgbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzJANAogICAgcmV0c3ViCgptdWx0aXBsZV90eG5zX2Zvcl9oZWFkZXJfMUAzOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMQogICAgYiBtdWx0aXBsZV90eG5zX2Zvcl9ib2R5QDEKCm11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8yQDQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBiIG11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMQoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5hbnlfdHhuKHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6CmFueV90eG46CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMjEtMTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhbnlfdHhuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCmFueV90eG5fZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBpbmRleAogICAgc3dhcAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gZm9yIGluZGV4LCB0eG4gaW4gdWVudW1lcmF0ZSgodHhuMSwgdHhuMiwgdHhuMykpOgogICAgc3dpdGNoIGFueV90eG5fZm9yX2hlYWRlcl8xQDMgYW55X3R4bl9mb3JfaGVhZGVyXzJANAogICAgcmV0c3ViCgphbnlfdHhuX2Zvcl9oZWFkZXJfMUAzOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMQogICAgYiBhbnlfdHhuX2Zvcl9ib2R5QDEKCmFueV90eG5fZm9yX2hlYWRlcl8yQDQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBiIGFueV90eG5fZm9yX2JvZHlAMQoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5ncm91cF9pbml0KHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6Cmdyb3VwX2luaXQ6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEtMTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBncm91cF9pbml0KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCmdyb3VwX2luaXRfZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gdHhuX2Zyb21faW5kZXggPSBndHhuLlRyYW5zYWN0aW9uKHR4bi5ncm91cF9pbmRleCkKICAgIHN3YXAKICAgIGR1cAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTQwCiAgICAvLyBhc3NlcnQgdHhuLnR4bl9pZCA9PSB0eG5fZnJvbV9pbmRleC50eG5faWQKICAgIHN3YXAKICAgIGd0eG5zIFR4SUQKICAgIHN3YXAKICAgIGd0eG5zIFR4SUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gZm9yIHR4biBpbiAodHhuMSwgdHhuMiwgdHhuMyk6CiAgICBzd2l0Y2ggZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzFAMyBncm91cF9pbml0X2Zvcl9oZWFkZXJfMkA0CiAgICBiIGdyb3VwX2luaXRfYWZ0ZXJfZm9yQDUKCmdyb3VwX2luaXRfZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIGdyb3VwX2luaXRfZm9yX2JvZHlAMQoKZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgZ3JvdXBfaW5pdF9mb3JfYm9keUAxCgpncm91cF9pbml0X2FmdGVyX2ZvckA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdHhuMS50eG5faWQgPT0gZ3R4bi5UcmFuc2FjdGlvbigwKS50eG5faWQKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgVHhJRAogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zIFR4SUQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMiAzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNQogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NmI2ODAzMTggMHgxNmM0YTMyZCAweDYzOTg3MmQ2IDB4NTBmOGYxYzMgMHg1YjNhMDBjZiAweGNkNjIyOTNkIDB4MDJlYTcyZTUgMHgzMDU2ODQwYiAweDk2ZWY5YTk1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJwYXkocGF5KXZvaWQiLCBtZXRob2QgImtleShrZXlyZWcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKGFjZmcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYXhmZXIpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZnJlZXplKGFmcnopdm9pZCIsIG1ldGhvZCAiYXBwbGljYXRpb25fY2FsbChhcHBsKXZvaWQiLCBtZXRob2QgIm11bHRpcGxlX3R4bnMoYXBwbCxhcHBsLGFwcGwpdm9pZCIsIG1ldGhvZCAiYW55X3R4bih0eG4sdHhuLHR4bil2b2lkIiwgbWV0aG9kICJncm91cF9pbml0KHR4bix0eG4sdHhuKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF9jb25maWdfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tdWx0aXBsZV90eG5zX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncm91cF9pbml0X3JvdXRlQDExCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMzoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fa2V5X3JvdXRlQDQ6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGtleXJlZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGtleXJlZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBrZXkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2NvbmZpZ19yb3V0ZUA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDY6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBhZnJ6CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWZyegogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9mcmVlemUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAODoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXBwbGljYXRpb25fY2FsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbXVsdGlwbGVfdHhuc19yb3V0ZUA5OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAzCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbXVsdGlwbGVfdHhucwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMwogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFueV90eG4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyb3VwX2luaXRfcm91dGVAMTE6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18zIC8vIDMKICAgIC0KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBncm91cF9pbml0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5wYXkodHhuOiB1aW50NjQpIC0+IHZvaWQ6CnBheToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXkoc2VsZiwgdHhuOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzMKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozNQogICAgLy8gdHhuLnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzQtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdHhuLnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IHNob3VsZCBiZSBmb3IgdGhpcyBhcHAiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBzaG91bGQgYmUgZm9yIHRoaXMgYXBwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHR4bi5hbW91bnQgPiAxMDAwLCAiUGF5bWVudCBzaG91bGQgYmUgZm9yID4xMDAwIG1pY3JvIGFsZ29zIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMTAwMCAvLyAxMDAwCiAgICA+CiAgICBhc3NlcnQgLy8gUGF5bWVudCBzaG91bGQgYmUgZm9yID4xMDAwIG1pY3JvIGFsZ29zCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IHR4bi5jbG9zZV9yZW1haW5kZXJfdG8gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgImNsb3NlX3JlbWFpbmRlcl90byIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNsb3NlX3JlbWFpbmRlcl90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Ll9jb21tb25fY2hlY2tzKHR4bjogdWludDY0KSAtPiB2b2lkOgpfY29tbW9uX2NoZWNrczoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjE2LTE3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jb21tb25fY2hlY2tzKHNlbGYsIHR4bjogZ3R4bi5UcmFuc2FjdGlvbkJhc2UpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBhc3NlcnQgdHhuLnR4bl9pZCwgInR4bl9pZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVHhJRAogICAgbGVuCiAgICBhc3NlcnQgLy8gdHhuX2lkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxOQogICAgLy8gYXNzZXJ0IHR4bi5zZW5kZXIgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgInNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyMAogICAgLy8gYXNzZXJ0IHR4bi5mZWUsICJmZWUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZlZQogICAgYXNzZXJ0IC8vIGZlZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCB0eG4udHlwZSwgInR5cGUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBhc3NlcnQgLy8gdHlwZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjIKICAgIC8vIGFzc2VydCB0eG4udHlwZV9ieXRlcywgInR5cGVfYnl0ZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR5cGUKICAgIGxlbgogICAgYXNzZXJ0IC8vIHR5cGVfYnl0ZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgdHhuLm5vdGUgPT0gQnl0ZXMoYiIiKSwgIm5vdGUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE5vdGUKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydCAvLyBub3RlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSAwLCAiZ3JvdXBfaW5kZXgiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydCAvLyBncm91cF9pbmRleAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCB0eG4uZmlyc3RfdmFsaWQsICJmaXJzdF92YWxpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRmlyc3RWYWxpZAogICAgYXNzZXJ0IC8vIGZpcnN0X3ZhbGlkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyNi0yNwogICAgLy8gIyBhc3NlcnQgdHhuLmZpcnN0X3ZhbGlkX3RpbWUsICJmaXJzdF92YWxpZF90aW1lIiAjIHRoaXMgdmFsdWUgY2FuIGJlIGZsYWt5IGluIHRlc3RzCiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfdmFsaWQsICJsYXN0X3ZhbGlkIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0VmFsaWQKICAgIGFzc2VydCAvLyBsYXN0X3ZhbGlkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyOAogICAgLy8gYXNzZXJ0IHR4bi5sZWFzZSwgImxlYXNlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMZWFzZQogICAgbGVuCiAgICBhc3NlcnQgLy8gbGVhc2UKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdHhuLnJla2V5X3RvID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJyZWtleV90byIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5X3RvCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3Qua2V5KHR4bjogdWludDY0KSAtPiB2b2lkOgprZXk6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYga2V5KHNlbGYsIHR4bjogZ3R4bi5LZXlSZWdpc3RyYXRpb25UcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDIKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MwogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2tleSwgInZvdGVfa2V5IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHZvdGVfa2V5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NAogICAgLy8gYXNzZXJ0IHR4bi5zZWxlY3Rpb25fa2V5LCAic2VsZWN0aW9uX2tleSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VsZWN0aW9uUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHNlbGVjdGlvbl9rZXkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdHhuLnZvdGVfa2V5X2RpbHV0aW9uLCAidm90ZV9rZXlfZGlsdXRpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFZvdGVLZXlEaWx1dGlvbgogICAgYXNzZXJ0IC8vIHZvdGVfa2V5X2RpbHV0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2ZpcnN0LCAidm90ZV9maXJzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZUZpcnN0CiAgICBhc3NlcnQgLy8gdm90ZV9maXJzdAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCB0eG4udm90ZV9sYXN0LCAidm90ZV9sYXN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlTGFzdAogICAgYXNzZXJ0IC8vIHZvdGVfbGFzdAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCB0eG4ubm9uX3BhcnRpY2lwYXRpb24sICJub25fcGFydGljaXBhdGlvbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTm9ucGFydGljaXBhdGlvbgogICAgYXNzZXJ0IC8vIG5vbl9wYXJ0aWNpcGF0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0OQogICAgLy8gYXNzZXJ0IHR4bi5zdGF0ZV9wcm9vZl9rZXksICJzdGF0ZV9wcm9vZl9rZXkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFN0YXRlUHJvb2ZQSwogICAgbGVuCiAgICBhc3NlcnQgLy8gc3RhdGVfcHJvb2Zfa2V5CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXNzZXRfY29uZmlnKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKHNlbGYsIHR4bjogZ3R4bi5Bc3NldENvbmZpZ1RyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhc3NlcnQgdHhuLmNvbmZpZ19hc3NldCwgImNvbmZpZ19hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXQKICAgIGFzc2VydCAvLyBjb25maWdfYXNzZXQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhc3NlcnQgdHhuLnRvdGFsLCAidG90YWwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0VG90YWwKICAgIGFzc2VydCAvLyB0b3RhbAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTcKICAgIC8vIGFzc2VydCB0eG4uZGVjaW1hbHMsICJkZWNpbWFscyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGRlY2ltYWxzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IHR4bi5kZWZhdWx0X2Zyb3plbiwgImRlZmF1bHRfZnJvemVuIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIGFzc2VydCAvLyBkZWZhdWx0X2Zyb3plbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCB0eG4udW5pdF9uYW1lLCAidW5pdF9uYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFVuaXROYW1lCiAgICBsZW4KICAgIGFzc2VydCAvLyB1bml0X25hbWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0X25hbWUsICJhc3NldF9uYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldE5hbWUKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFzc2V0X25hbWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBhc3NlcnQgdHhuLnVybCwgInVybCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRVUkwKICAgIGxlbgogICAgYXNzZXJ0IC8vIHVybAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjIKICAgIC8vIGFzc2VydCB0eG4ubWV0YWRhdGFfaGFzaCwgIm1ldGFkYXRhX2hhc2giCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCiAgICBsZW4KICAgIGFzc2VydCAvLyBtZXRhZGF0YV9oYXNoCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IHR4bi5tYW5hZ2VyLCAibWFuYWdlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gbWFuYWdlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjQKICAgIC8vIGFzc2VydCB0eG4ucmVzZXJ2ZSwgInJlc2VydmUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIHJlc2VydmUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZSwgImZyZWV6ZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRGcmVlemUKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmcmVlemUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgdHhuLmNsYXdiYWNrLCAiY2xhd2JhY2siCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBjbGF3YmFjawogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X3RyYW5zZmVyKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcihzZWxmLCB0eG46IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgdHhuLnhmZXJfYXNzZXQsICJ4ZmVyX2Fzc2V0IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGFzc2VydCAvLyB4ZmVyX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9hbW91bnQsICJhc3NldF9hbW91bnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBhc3NlcnQgLy8gYXNzZXRfYW1vdW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9zZW5kZXIsICJhc3NldF9zZW5kZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0U2VuZGVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXRfc2VuZGVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9yZWNlaXZlciwgImFzc2V0X3JlY2VpdmVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXRfcmVjZWl2ZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0X2Nsb3NlX3RvLCAiYXNzZXRfY2xvc2VfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X2Nsb3NlX3RvCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXNzZXRfZnJlZXplKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF9mcmVlemU6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfZnJlZXplKHNlbGYsIHR4bjogZ3R4bi5Bc3NldEZyZWV6ZVRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3OQogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZV9hc3NldCwgImZyZWV6ZV9hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRnJlZXplQXNzZXQKICAgIGFzc2VydCAvLyBmcmVlemVfYXNzZXQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZV9hY2NvdW50LCAiZnJlZXplX2FjY291bnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0QWNjb3VudAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGZyZWV6ZV9hY2NvdW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHR4bi5mcm96ZW4sICJmcm96ZW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0RnJvemVuCiAgICBhc3NlcnQgLy8gZnJvemVuCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwbGljYXRpb25fY2FsbCh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXBwbGljYXRpb25fY2FsbDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhcHBsaWNhdGlvbl9jYWxsKHNlbGYsIHR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IHR4bi5hcHBfaWQsICJhcHBfaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBhcHBfaWQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBhc3NlcnQgdHhuLm9uX2NvbXBsZXRpb24sICJvbl9jb21wbGV0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIGFzc2VydCAvLyBvbl9jb21wbGV0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MAogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwX2FyZ3MsICJudW1fYXBwX2FyZ3MiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIGFzc2VydCAvLyBudW1fYXBwX2FyZ3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdHhuLm51bV9hY2NvdW50cywgIm51bV9hY2NvdW50cyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQWNjb3VudHMKICAgIGFzc2VydCAvLyBudW1fYWNjb3VudHMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBhc3NlcnQgdHhuLmFwcHJvdmFsX3Byb2dyYW0sICJhcHByb3ZhbF9wcm9ncmFtIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBcHByb3ZhbFByb2dyYW0KICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcHJvdmFsX3Byb2dyYW0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBhc3NlcnQgdHhuLmNsZWFyX3N0YXRlX3Byb2dyYW0sICJjbGVhcl9zdGF0ZV9wcm9ncmFtIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDbGVhclN0YXRlUHJvZ3JhbQogICAgbGVuCiAgICBhc3NlcnQgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCB0eG4ubnVtX2Fzc2V0cywgIm51bV9hc3NldHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFzc2V0cwogICAgYXNzZXJ0IC8vIG51bV9hc3NldHMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBhc3NlcnQgdHhuLm51bV9hcHBzLCAibnVtX2FwcHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcGxpY2F0aW9ucwogICAgYXNzZXJ0IC8vIG51bV9hcHBzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NgogICAgLy8gYXNzZXJ0IHR4bi5nbG9iYWxfbnVtX3VpbnQsICJnbG9iYWxfbnVtX3VpbnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEdsb2JhbE51bVVpbnQKICAgIGFzc2VydCAvLyBnbG9iYWxfbnVtX3VpbnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBhc3NlcnQgdHhuLmdsb2JhbF9udW1fYnl0ZXMsICJnbG9iYWxfbnVtX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBnbG9iYWxfbnVtX2J5dGVzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHR4bi5sb2NhbF9udW1fdWludCwgImxvY2FsX251bV91aW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMb2NhbE51bVVpbnQKICAgIGFzc2VydCAvLyBsb2NhbF9udW1fdWludAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIGFzc2VydCB0eG4ubG9jYWxfbnVtX2J5dGVzLCAibG9jYWxfbnVtX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMb2NhbE51bUJ5dGVTbGljZQogICAgYXNzZXJ0IC8vIGxvY2FsX251bV9ieXRlcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTAwCiAgICAvLyBhc3NlcnQgdHhuLmV4dHJhX3Byb2dyYW1fcGFnZXMsICJleHRyYV9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBFeHRyYVByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIGV4dHJhX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZywgImxhc3RfbG9nIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0TG9nCiAgICBsZW4KICAgIGFzc2VydCAvLyBsYXN0X2xvZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTAyCiAgICAvLyBhc3NlcnQgdHhuLm51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzLCAibnVtX2FwcHJvdmFsX3Byb2dyYW1fcGFnZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBhc3NlcnQgLy8gbnVtX2FwcHJvdmFsX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXJ0IHR4bi5udW1fY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcywgIm51bV9jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1DbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBhc3NlcnQgLy8gbnVtX2NsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHR4bi5hcHBfYXJncygwKSwgImFwcF9hcmdzKDApIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcF9hcmdzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCB0eG4uYWNjb3VudHMoMCksICJhY2NvdW50cygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQWNjb3VudHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhY2NvdW50cygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0cygwKSwgImFzc2V0cygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXNzZXRzCiAgICBhc3NlcnQgLy8gYXNzZXRzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCB0eG4uYXBwcygwKSwgImFwcHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgYXNzZXJ0IC8vIGFwcHMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHR4bi5hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKDApLCAiYXBwcm92YWxfcHJvZ3JhbV9wYWdlcygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcHJvdmFsX3Byb2dyYW1fcGFnZXMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHR4bi5jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzKDApLCAiY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgbGVuCiAgICBhc3NlcnQgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Lm11bHRpcGxlX3R4bnModHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKbXVsdGlwbGVfdHhuczoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExMS0xMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG11bHRpcGxlX3R4bnMoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKbXVsdGlwbGVfdHhuc19mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgYXBwLmdyb3VwX2luZGV4ID09IGluZGV4CiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTE4CiAgICAvLyBmb3IgaW5kZXgsIGFwcCBpbiB1ZW51bWVyYXRlKCh0eG4xLCB0eG4yLCB0eG4zKSk6CiAgICBzd2l0Y2ggbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzFAMyBtdWx0aXBsZV90eG5zX2Zvcl9oZWFkZXJfMkA0CiAgICByZXRzdWIKCm11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIG11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMQoKbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgbXVsdGlwbGVfdHhuc19mb3JfYm9keUAxCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFueV90eG4odHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKYW55X3R4bjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMS0xMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFueV90eG4oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKYW55X3R4bl9mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTI5CiAgICAvLyBhc3NlcnQgdHhuLmdyb3VwX2luZGV4ID09IGluZGV4CiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTI4CiAgICAvLyBmb3IgaW5kZXgsIHR4biBpbiB1ZW51bWVyYXRlKCh0eG4xLCB0eG4yLCB0eG4zKSk6CiAgICBzd2l0Y2ggYW55X3R4bl9mb3JfaGVhZGVyXzFAMyBhbnlfdHhuX2Zvcl9oZWFkZXJfMkA0CiAgICByZXRzdWIKCmFueV90eG5fZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIGFueV90eG5fZm9yX2JvZHlAMQoKYW55X3R4bl9mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgYW55X3R4bl9mb3JfYm9keUAxCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Lmdyb3VwX2luaXQodHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKZ3JvdXBfaW5pdDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzMS0xMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGdyb3VwX2luaXQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKZ3JvdXBfaW5pdF9mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTM5CiAgICAvLyB0eG5fZnJvbV9pbmRleCA9IGd0eG4uVHJhbnNhY3Rpb24odHhuLmdyb3VwX2luZGV4KQogICAgc3dhcAogICAgZHVwCiAgICBndHhucyBHcm91cEluZGV4CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNDAKICAgIC8vIGFzc2VydCB0eG4udHhuX2lkID09IHR4bl9mcm9tX2luZGV4LnR4bl9pZAogICAgc3dhcAogICAgZ3R4bnMgVHhJRAogICAgc3dhcAogICAgZ3R4bnMgVHhJRAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTM4CiAgICAvLyBmb3IgdHhuIGluICh0eG4xLCB0eG4yLCB0eG4zKToKICAgIHN3aXRjaCBncm91cF9pbml0X2Zvcl9oZWFkZXJfMUAzIGdyb3VwX2luaXRfZm9yX2hlYWRlcl8yQDQKICAgIGIgZ3JvdXBfaW5pdF9hZnRlcl9mb3JANQoKZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzFAMzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDEKICAgIGIgZ3JvdXBfaW5pdF9mb3JfYm9keUAxCgpncm91cF9pbml0X2Zvcl9oZWFkZXJfMkA0OgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgYiBncm91cF9pbml0X2Zvcl9ib2R5QDEKCmdyb3VwX2luaXRfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB0eG4xLnR4bl9pZCA9PSBndHhuLlRyYW5zYWN0aW9uKDApLnR4bl9pZAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBUeElECiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHhJRAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/transaction/out/TransactionContract.arc56.json b/test_cases/transaction/out/TransactionContract.arc56.json new file mode 100644 index 0000000000..83688daaa3 --- /dev/null +++ b/test_cases/transaction/out/TransactionContract.arc56.json @@ -0,0 +1,747 @@ +{ + "name": "TransactionContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "pay", + "args": [ + { + "type": "pay", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "key", + "args": [ + { + "type": "keyreg", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "acfg", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_transfer", + "args": [ + { + "type": "axfer", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_freeze", + "args": [ + { + "type": "afrz", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "application_call", + "args": [ + { + "type": "appl", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "multiple_txns", + "args": [ + { + "type": "appl", + "name": "txn1" + }, + { + "type": "appl", + "name": "txn2" + }, + { + "type": "appl", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "any_txn", + "args": [ + { + "type": "txn", + "name": "txn1" + }, + { + "type": "txn", + "name": "txn2" + }, + { + "type": "txn", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "group_init", + "args": [ + { + "type": "txn", + "name": "txn1" + }, + { + "type": "txn", + "name": "txn2" + }, + { + "type": "txn", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 101, + 111, + 133, + 155, + 177, + 200, + 223, + 246, + 291, + 315 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 362 + ], + "errorMessage": "Payment should be for >1000 micro algos" + }, + { + "pc": [ + 353 + ], + "errorMessage": "Payment should be for this app" + }, + { + "pc": [ + 752 + ], + "errorMessage": "accounts(0)" + }, + { + "pc": [ + 743 + ], + "errorMessage": "app_args(0)" + }, + { + "pc": [ + 658 + ], + "errorMessage": "app_id" + }, + { + "pc": [ + 679 + ], + "errorMessage": "approval_program" + }, + { + "pc": [ + 771 + ], + "errorMessage": "approval_program_pages(0)" + }, + { + "pc": [ + 764 + ], + "errorMessage": "apps(0)" + }, + { + "pc": [ + 593 + ], + "errorMessage": "asset_amount" + }, + { + "pc": [ + 617 + ], + "errorMessage": "asset_close_to" + }, + { + "pc": [ + 530 + ], + "errorMessage": "asset_name" + }, + { + "pc": [ + 609 + ], + "errorMessage": "asset_receiver" + }, + { + "pc": [ + 601 + ], + "errorMessage": "asset_sender" + }, + { + "pc": [ + 758 + ], + "errorMessage": "assets(0)" + }, + { + "pc": [ + 105 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 114, + 136, + 158, + 180, + 203, + 226, + 249, + 294, + 318 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 574 + ], + "errorMessage": "clawback" + }, + { + "pc": [ + 685 + ], + "errorMessage": "clear_state_program" + }, + { + "pc": [ + 778 + ], + "errorMessage": "clear_state_program_pages(0)" + }, + { + "pc": [ + 370 + ], + "errorMessage": "close_remainder_to" + }, + { + "pc": [ + 503 + ], + "errorMessage": "config_asset" + }, + { + "pc": [ + 513 + ], + "errorMessage": "decimals" + }, + { + "pc": [ + 518 + ], + "errorMessage": "default_frozen" + }, + { + "pc": [ + 720 + ], + "errorMessage": "extra_program_pages" + }, + { + "pc": [ + 393 + ], + "errorMessage": "fee" + }, + { + "pc": [ + 423 + ], + "errorMessage": "first_valid" + }, + { + "pc": [ + 566 + ], + "errorMessage": "freeze" + }, + { + "pc": [ + 639 + ], + "errorMessage": "freeze_account" + }, + { + "pc": [ + 631 + ], + "errorMessage": "freeze_asset" + }, + { + "pc": [ + 644 + ], + "errorMessage": "frozen" + }, + { + "pc": [ + 705 + ], + "errorMessage": "global_num_bytes" + }, + { + "pc": [ + 700 + ], + "errorMessage": "global_num_uint" + }, + { + "pc": [ + 418 + ], + "errorMessage": "group_index" + }, + { + "pc": [ + 726 + ], + "errorMessage": "last_log" + }, + { + "pc": [ + 428 + ], + "errorMessage": "last_valid" + }, + { + "pc": [ + 434 + ], + "errorMessage": "lease" + }, + { + "pc": [ + 715 + ], + "errorMessage": "local_num_bytes" + }, + { + "pc": [ + 710 + ], + "errorMessage": "local_num_uint" + }, + { + "pc": [ + 550 + ], + "errorMessage": "manager" + }, + { + "pc": [ + 542 + ], + "errorMessage": "metadata_hash" + }, + { + "pc": [ + 483 + ], + "errorMessage": "non_participation" + }, + { + "pc": [ + 412 + ], + "errorMessage": "note" + }, + { + "pc": [ + 673 + ], + "errorMessage": "num_accounts" + }, + { + "pc": [ + 668 + ], + "errorMessage": "num_app_args" + }, + { + "pc": [ + 731 + ], + "errorMessage": "num_approval_program_pages" + }, + { + "pc": [ + 695 + ], + "errorMessage": "num_apps" + }, + { + "pc": [ + 690 + ], + "errorMessage": "num_assets" + }, + { + "pc": [ + 736 + ], + "errorMessage": "num_clear_state_program_pages" + }, + { + "pc": [ + 663 + ], + "errorMessage": "on_completion" + }, + { + "pc": [ + 442 + ], + "errorMessage": "rekey_to" + }, + { + "pc": [ + 558 + ], + "errorMessage": "reserve" + }, + { + "pc": [ + 463 + ], + "errorMessage": "selection_key" + }, + { + "pc": [ + 388 + ], + "errorMessage": "sender" + }, + { + "pc": [ + 489 + ], + "errorMessage": "state_proof_key" + }, + { + "pc": [ + 508 + ], + "errorMessage": "total" + }, + { + "pc": [ + 168 + ], + "errorMessage": "transaction type is acfg" + }, + { + "pc": [ + 214 + ], + "errorMessage": "transaction type is afrz" + }, + { + "pc": [ + 237, + 260, + 271, + 282 + ], + "errorMessage": "transaction type is appl" + }, + { + "pc": [ + 191 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 146 + ], + "errorMessage": "transaction type is keyreg" + }, + { + "pc": [ + 124 + ], + "errorMessage": "transaction type is pay" + }, + { + "pc": [ + 380 + ], + "errorMessage": "txn_id" + }, + { + "pc": [ + 398 + ], + "errorMessage": "type" + }, + { + "pc": [ + 404 + ], + "errorMessage": "type_bytes" + }, + { + "pc": [ + 524 + ], + "errorMessage": "unit_name" + }, + { + "pc": [ + 536 + ], + "errorMessage": "url" + }, + { + "pc": [ + 473 + ], + "errorMessage": "vote_first" + }, + { + "pc": [ + 457 + ], + "errorMessage": "vote_key" + }, + { + "pc": [ + 468 + ], + "errorMessage": "vote_key_dilution" + }, + { + "pc": [ + 478 + ], + "errorMessage": "vote_last" + }, + { + "pc": [ + 588 + ], + "errorMessage": "xfer_asset" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMiAzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNQogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NmI2ODAzMTggMHgxNmM0YTMyZCAweDYzOTg3MmQ2IDB4NTBmOGYxYzMgMHg1YjNhMDBjZiAweGNkNjIyOTNkIDB4MDJlYTcyZTUgMHgzMDU2ODQwYiAweDk2ZWY5YTk1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJwYXkocGF5KXZvaWQiLCBtZXRob2QgImtleShrZXlyZWcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKGFjZmcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYXhmZXIpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZnJlZXplKGFmcnopdm9pZCIsIG1ldGhvZCAiYXBwbGljYXRpb25fY2FsbChhcHBsKXZvaWQiLCBtZXRob2QgIm11bHRpcGxlX3R4bnMoYXBwbCxhcHBsLGFwcGwpdm9pZCIsIG1ldGhvZCAiYW55X3R4bih0eG4sdHhuLHR4bil2b2lkIiwgbWV0aG9kICJncm91cF9pbml0KHR4bix0eG4sdHhuKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF9jb25maWdfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tdWx0aXBsZV90eG5zX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncm91cF9pbml0X3JvdXRlQDExCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMzoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fa2V5X3JvdXRlQDQ6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGtleXJlZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGtleXJlZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBrZXkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2NvbmZpZ19yb3V0ZUA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDY6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBhZnJ6CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWZyegogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9mcmVlemUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAODoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXBwbGljYXRpb25fY2FsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbXVsdGlwbGVfdHhuc19yb3V0ZUA5OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAzCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbXVsdGlwbGVfdHhucwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMwogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFueV90eG4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyb3VwX2luaXRfcm91dGVAMTE6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18zIC8vIDMKICAgIC0KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBncm91cF9pbml0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5wYXkodHhuOiB1aW50NjQpIC0+IHZvaWQ6CnBheToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXkoc2VsZiwgdHhuOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzMKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozNQogICAgLy8gdHhuLnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzQtMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdHhuLnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IHNob3VsZCBiZSBmb3IgdGhpcyBhcHAiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBzaG91bGQgYmUgZm9yIHRoaXMgYXBwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHR4bi5hbW91bnQgPiAxMDAwLCAiUGF5bWVudCBzaG91bGQgYmUgZm9yID4xMDAwIG1pY3JvIGFsZ29zIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMTAwMCAvLyAxMDAwCiAgICA+CiAgICBhc3NlcnQgLy8gUGF5bWVudCBzaG91bGQgYmUgZm9yID4xMDAwIG1pY3JvIGFsZ29zCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IHR4bi5jbG9zZV9yZW1haW5kZXJfdG8gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgImNsb3NlX3JlbWFpbmRlcl90byIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNsb3NlX3JlbWFpbmRlcl90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Ll9jb21tb25fY2hlY2tzKHR4bjogdWludDY0KSAtPiB2b2lkOgpfY29tbW9uX2NoZWNrczoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjE2LTE3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jb21tb25fY2hlY2tzKHNlbGYsIHR4bjogZ3R4bi5UcmFuc2FjdGlvbkJhc2UpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBhc3NlcnQgdHhuLnR4bl9pZCwgInR4bl9pZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVHhJRAogICAgbGVuCiAgICBhc3NlcnQgLy8gdHhuX2lkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxOQogICAgLy8gYXNzZXJ0IHR4bi5zZW5kZXIgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgInNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyMAogICAgLy8gYXNzZXJ0IHR4bi5mZWUsICJmZWUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZlZQogICAgYXNzZXJ0IC8vIGZlZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCB0eG4udHlwZSwgInR5cGUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBhc3NlcnQgLy8gdHlwZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjIKICAgIC8vIGFzc2VydCB0eG4udHlwZV9ieXRlcywgInR5cGVfYnl0ZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR5cGUKICAgIGxlbgogICAgYXNzZXJ0IC8vIHR5cGVfYnl0ZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgdHhuLm5vdGUgPT0gQnl0ZXMoYiIiKSwgIm5vdGUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE5vdGUKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydCAvLyBub3RlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSAwLCAiZ3JvdXBfaW5kZXgiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydCAvLyBncm91cF9pbmRleAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCB0eG4uZmlyc3RfdmFsaWQsICJmaXJzdF92YWxpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRmlyc3RWYWxpZAogICAgYXNzZXJ0IC8vIGZpcnN0X3ZhbGlkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyNi0yNwogICAgLy8gIyBhc3NlcnQgdHhuLmZpcnN0X3ZhbGlkX3RpbWUsICJmaXJzdF92YWxpZF90aW1lIiAjIHRoaXMgdmFsdWUgY2FuIGJlIGZsYWt5IGluIHRlc3RzCiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfdmFsaWQsICJsYXN0X3ZhbGlkIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0VmFsaWQKICAgIGFzc2VydCAvLyBsYXN0X3ZhbGlkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyOAogICAgLy8gYXNzZXJ0IHR4bi5sZWFzZSwgImxlYXNlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMZWFzZQogICAgbGVuCiAgICBhc3NlcnQgLy8gbGVhc2UKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdHhuLnJla2V5X3RvID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJyZWtleV90byIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5X3RvCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3Qua2V5KHR4bjogdWludDY0KSAtPiB2b2lkOgprZXk6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYga2V5KHNlbGYsIHR4bjogZ3R4bi5LZXlSZWdpc3RyYXRpb25UcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDIKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0MwogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2tleSwgInZvdGVfa2V5IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHZvdGVfa2V5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NAogICAgLy8gYXNzZXJ0IHR4bi5zZWxlY3Rpb25fa2V5LCAic2VsZWN0aW9uX2tleSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VsZWN0aW9uUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHNlbGVjdGlvbl9rZXkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdHhuLnZvdGVfa2V5X2RpbHV0aW9uLCAidm90ZV9rZXlfZGlsdXRpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFZvdGVLZXlEaWx1dGlvbgogICAgYXNzZXJ0IC8vIHZvdGVfa2V5X2RpbHV0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2ZpcnN0LCAidm90ZV9maXJzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZUZpcnN0CiAgICBhc3NlcnQgLy8gdm90ZV9maXJzdAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCB0eG4udm90ZV9sYXN0LCAidm90ZV9sYXN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlTGFzdAogICAgYXNzZXJ0IC8vIHZvdGVfbGFzdAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCB0eG4ubm9uX3BhcnRpY2lwYXRpb24sICJub25fcGFydGljaXBhdGlvbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTm9ucGFydGljaXBhdGlvbgogICAgYXNzZXJ0IC8vIG5vbl9wYXJ0aWNpcGF0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0OQogICAgLy8gYXNzZXJ0IHR4bi5zdGF0ZV9wcm9vZl9rZXksICJzdGF0ZV9wcm9vZl9rZXkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFN0YXRlUHJvb2ZQSwogICAgbGVuCiAgICBhc3NlcnQgLy8gc3RhdGVfcHJvb2Zfa2V5CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXNzZXRfY29uZmlnKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKHNlbGYsIHR4bjogZ3R4bi5Bc3NldENvbmZpZ1RyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhc3NlcnQgdHhuLmNvbmZpZ19hc3NldCwgImNvbmZpZ19hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXQKICAgIGFzc2VydCAvLyBjb25maWdfYXNzZXQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhc3NlcnQgdHhuLnRvdGFsLCAidG90YWwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0VG90YWwKICAgIGFzc2VydCAvLyB0b3RhbAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTcKICAgIC8vIGFzc2VydCB0eG4uZGVjaW1hbHMsICJkZWNpbWFscyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGRlY2ltYWxzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IHR4bi5kZWZhdWx0X2Zyb3plbiwgImRlZmF1bHRfZnJvemVuIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIGFzc2VydCAvLyBkZWZhdWx0X2Zyb3plbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCB0eG4udW5pdF9uYW1lLCAidW5pdF9uYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFVuaXROYW1lCiAgICBsZW4KICAgIGFzc2VydCAvLyB1bml0X25hbWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0X25hbWUsICJhc3NldF9uYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldE5hbWUKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFzc2V0X25hbWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBhc3NlcnQgdHhuLnVybCwgInVybCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRVUkwKICAgIGxlbgogICAgYXNzZXJ0IC8vIHVybAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjIKICAgIC8vIGFzc2VydCB0eG4ubWV0YWRhdGFfaGFzaCwgIm1ldGFkYXRhX2hhc2giCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCiAgICBsZW4KICAgIGFzc2VydCAvLyBtZXRhZGF0YV9oYXNoCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IHR4bi5tYW5hZ2VyLCAibWFuYWdlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gbWFuYWdlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjQKICAgIC8vIGFzc2VydCB0eG4ucmVzZXJ2ZSwgInJlc2VydmUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIHJlc2VydmUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZSwgImZyZWV6ZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRGcmVlemUKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmcmVlemUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgdHhuLmNsYXdiYWNrLCAiY2xhd2JhY2siCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBjbGF3YmFjawogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X3RyYW5zZmVyKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcihzZWxmLCB0eG46IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgdHhuLnhmZXJfYXNzZXQsICJ4ZmVyX2Fzc2V0IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGFzc2VydCAvLyB4ZmVyX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9hbW91bnQsICJhc3NldF9hbW91bnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBhc3NlcnQgLy8gYXNzZXRfYW1vdW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9zZW5kZXIsICJhc3NldF9zZW5kZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0U2VuZGVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXRfc2VuZGVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9yZWNlaXZlciwgImFzc2V0X3JlY2VpdmVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXRfcmVjZWl2ZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0X2Nsb3NlX3RvLCAiYXNzZXRfY2xvc2VfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X2Nsb3NlX3RvCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXNzZXRfZnJlZXplKHR4bjogdWludDY0KSAtPiB2b2lkOgphc3NldF9mcmVlemU6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfZnJlZXplKHNlbGYsIHR4bjogZ3R4bi5Bc3NldEZyZWV6ZVRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3OQogICAgLy8gc2VsZi5fY29tbW9uX2NoZWNrcyh0eG4pCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbW1vbl9jaGVja3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZV9hc3NldCwgImZyZWV6ZV9hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRnJlZXplQXNzZXQKICAgIGFzc2VydCAvLyBmcmVlemVfYXNzZXQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgdHhuLmZyZWV6ZV9hY2NvdW50LCAiZnJlZXplX2FjY291bnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0QWNjb3VudAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGZyZWV6ZV9hY2NvdW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHR4bi5mcm96ZW4sICJmcm96ZW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0RnJvemVuCiAgICBhc3NlcnQgLy8gZnJvemVuCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwbGljYXRpb25fY2FsbCh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXBwbGljYXRpb25fY2FsbDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhcHBsaWNhdGlvbl9jYWxsKHNlbGYsIHR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IHR4bi5hcHBfaWQsICJhcHBfaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBhcHBfaWQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBhc3NlcnQgdHhuLm9uX2NvbXBsZXRpb24sICJvbl9jb21wbGV0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIGFzc2VydCAvLyBvbl9jb21wbGV0aW9uCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MAogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwX2FyZ3MsICJudW1fYXBwX2FyZ3MiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIGFzc2VydCAvLyBudW1fYXBwX2FyZ3MKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdHhuLm51bV9hY2NvdW50cywgIm51bV9hY2NvdW50cyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQWNjb3VudHMKICAgIGFzc2VydCAvLyBudW1fYWNjb3VudHMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBhc3NlcnQgdHhuLmFwcHJvdmFsX3Byb2dyYW0sICJhcHByb3ZhbF9wcm9ncmFtIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBcHByb3ZhbFByb2dyYW0KICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcHJvdmFsX3Byb2dyYW0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBhc3NlcnQgdHhuLmNsZWFyX3N0YXRlX3Byb2dyYW0sICJjbGVhcl9zdGF0ZV9wcm9ncmFtIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDbGVhclN0YXRlUHJvZ3JhbQogICAgbGVuCiAgICBhc3NlcnQgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCB0eG4ubnVtX2Fzc2V0cywgIm51bV9hc3NldHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFzc2V0cwogICAgYXNzZXJ0IC8vIG51bV9hc3NldHMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBhc3NlcnQgdHhuLm51bV9hcHBzLCAibnVtX2FwcHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcGxpY2F0aW9ucwogICAgYXNzZXJ0IC8vIG51bV9hcHBzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NgogICAgLy8gYXNzZXJ0IHR4bi5nbG9iYWxfbnVtX3VpbnQsICJnbG9iYWxfbnVtX3VpbnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEdsb2JhbE51bVVpbnQKICAgIGFzc2VydCAvLyBnbG9iYWxfbnVtX3VpbnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBhc3NlcnQgdHhuLmdsb2JhbF9udW1fYnl0ZXMsICJnbG9iYWxfbnVtX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBnbG9iYWxfbnVtX2J5dGVzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHR4bi5sb2NhbF9udW1fdWludCwgImxvY2FsX251bV91aW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMb2NhbE51bVVpbnQKICAgIGFzc2VydCAvLyBsb2NhbF9udW1fdWludAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIGFzc2VydCB0eG4ubG9jYWxfbnVtX2J5dGVzLCAibG9jYWxfbnVtX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMb2NhbE51bUJ5dGVTbGljZQogICAgYXNzZXJ0IC8vIGxvY2FsX251bV9ieXRlcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTAwCiAgICAvLyBhc3NlcnQgdHhuLmV4dHJhX3Byb2dyYW1fcGFnZXMsICJleHRyYV9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBFeHRyYVByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIGV4dHJhX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZywgImxhc3RfbG9nIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0TG9nCiAgICBsZW4KICAgIGFzc2VydCAvLyBsYXN0X2xvZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTAyCiAgICAvLyBhc3NlcnQgdHhuLm51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzLCAibnVtX2FwcHJvdmFsX3Byb2dyYW1fcGFnZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBhc3NlcnQgLy8gbnVtX2FwcHJvdmFsX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXJ0IHR4bi5udW1fY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcywgIm51bV9jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1DbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBhc3NlcnQgLy8gbnVtX2NsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHR4bi5hcHBfYXJncygwKSwgImFwcF9hcmdzKDApIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcF9hcmdzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCB0eG4uYWNjb3VudHMoMCksICJhY2NvdW50cygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQWNjb3VudHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhY2NvdW50cygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgdHhuLmFzc2V0cygwKSwgImFzc2V0cygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXNzZXRzCiAgICBhc3NlcnQgLy8gYXNzZXRzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCB0eG4uYXBwcygwKSwgImFwcHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgYXNzZXJ0IC8vIGFwcHMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHR4bi5hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKDApLCAiYXBwcm92YWxfcHJvZ3JhbV9wYWdlcygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGxlbgogICAgYXNzZXJ0IC8vIGFwcHJvdmFsX3Byb2dyYW1fcGFnZXMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHR4bi5jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzKDApLCAiY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgbGVuCiAgICBhc3NlcnQgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Lm11bHRpcGxlX3R4bnModHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKbXVsdGlwbGVfdHhuczoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExMS0xMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG11bHRpcGxlX3R4bnMoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKbXVsdGlwbGVfdHhuc19mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgYXBwLmdyb3VwX2luZGV4ID09IGluZGV4CiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTE4CiAgICAvLyBmb3IgaW5kZXgsIGFwcCBpbiB1ZW51bWVyYXRlKCh0eG4xLCB0eG4yLCB0eG4zKSk6CiAgICBzd2l0Y2ggbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzFAMyBtdWx0aXBsZV90eG5zX2Zvcl9oZWFkZXJfMkA0CiAgICByZXRzdWIKCm11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIG11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMQoKbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgbXVsdGlwbGVfdHhuc19mb3JfYm9keUAxCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFueV90eG4odHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKYW55X3R4bjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMS0xMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFueV90eG4oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKYW55X3R4bl9mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTI5CiAgICAvLyBhc3NlcnQgdHhuLmdyb3VwX2luZGV4ID09IGluZGV4CiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTI4CiAgICAvLyBmb3IgaW5kZXgsIHR4biBpbiB1ZW51bWVyYXRlKCh0eG4xLCB0eG4yLCB0eG4zKSk6CiAgICBzd2l0Y2ggYW55X3R4bl9mb3JfaGVhZGVyXzFAMyBhbnlfdHhuX2Zvcl9oZWFkZXJfMkA0CiAgICByZXRzdWIKCmFueV90eG5fZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIGFueV90eG5fZm9yX2JvZHlAMQoKYW55X3R4bl9mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgYW55X3R4bl9mb3JfYm9keUAxCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0Lmdyb3VwX2luaXQodHhuMTogdWludDY0LCB0eG4yOiB1aW50NjQsIHR4bjM6IHVpbnQ2NCkgLT4gdm9pZDoKZ3JvdXBfaW5pdDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzMS0xMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGdyb3VwX2luaXQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB0eG4xOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjI6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdHhuMzogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAoKZ3JvdXBfaW5pdF9mb3JfYm9keUAxOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTM5CiAgICAvLyB0eG5fZnJvbV9pbmRleCA9IGd0eG4uVHJhbnNhY3Rpb24odHhuLmdyb3VwX2luZGV4KQogICAgc3dhcAogICAgZHVwCiAgICBndHhucyBHcm91cEluZGV4CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNDAKICAgIC8vIGFzc2VydCB0eG4udHhuX2lkID09IHR4bl9mcm9tX2luZGV4LnR4bl9pZAogICAgc3dhcAogICAgZ3R4bnMgVHhJRAogICAgc3dhcAogICAgZ3R4bnMgVHhJRAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTM4CiAgICAvLyBmb3IgdHhuIGluICh0eG4xLCB0eG4yLCB0eG4zKToKICAgIHN3aXRjaCBncm91cF9pbml0X2Zvcl9oZWFkZXJfMUAzIGdyb3VwX2luaXRfZm9yX2hlYWRlcl8yQDQKICAgIGIgZ3JvdXBfaW5pdF9hZnRlcl9mb3JANQoKZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzFAMzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDEKICAgIGIgZ3JvdXBfaW5pdF9mb3JfYm9keUAxCgpncm91cF9pbml0X2Zvcl9oZWFkZXJfMkA0OgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgYiBncm91cF9pbml0X2Zvcl9ib2R5QDEKCmdyb3VwX2luaXRfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB0eG4xLnR4bl9pZCA9PSBndHhuLlRyYW5zYWN0aW9uKDApLnR4bl9pZAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBUeElECiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHhJRAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQACA4gAAUOKAAExG0EBPYIKBExcYboEa2gDGAQWxKMtBGOYctYEUPjxwwRbOgDPBM1iKT0EAupy5QQwVoQLBJbvmpU2GgCOCgACAAwAIgA4AE4AZQB8AJMAwADYI4kxGRREMRgURCKJMRkURDEYRDEWIglJOBAiEkSIANIiiTEZFEQxGEQxFiIJSTgQJBJEiAEmIokxGRREMRhEMRYiCUk4ECUSRIgBPyKJMRkURDEYRDEWIglJOBCBBBJEiAF9IokxGRREMRhEMRYiCUk4EIEFEkSIAZEiiTEZFEQxGEQxFiIJSTgQgQYSRIgBlSKJMRkURDEYRDEWJQlJOBCBBhJEMRYkCUk4EIEGEkQxFiIJSTgQgQYSRIgB7iKJMRkURDEYRDEWJQkxFiQJMRYiCYgB9iKJMRkURDEYRDEWJQkxFiQJMRYiCYgB/iKJI4mKAQCL/4gAGov/OAcyChJEi/84CIHoBw1Ei/84CTIDEkSJigEAi/84FxVEi/84ADIJEkSL/zgBRIv/OBBEi/84DxVEi/84BYAAEkSL/zgWFESL/zgCRIv/OAREi/84BhVEi/84IDIDEkSJigEAi/+I/7CL/zgKFUSL/zgLFUSL/zgORIv/OAxEi/84DUSL/zg5RIv/OD8VRImKAQCL/4j/gYv/OCFEi/84IkSL/zgjRIv/OCREi/84JRVEi/84JhVEi/84JxVEi/84KBVEi/84KTIDE0SL/zgqMgMTRIv/OCsyAxNEi/84LDIDE0SJigEAi/+I/yyL/zgRRIv/OBJEi/84EzIDE0SL/zgUMgMTRIv/OBUyAxNEiYoBAIv/iP8Bi/84LUSL/zguMgMTRIv/OC9EiYoBAIv/iP7mi/84GESL/zgZRIv/OBtEi/84HUSL/zgeFUSL/zgfFUSL/zgxRIv/ODNEi/84NESL/zg1RIv/ODZEi/84N0SL/zg4RIv/OD4VRIv/OEFEi/84Q0SL/yPCGhVEi/8jwhwyAxNEi/8jwjBEi/8jwjJEi/8jwkAVRIv/I8JCFUSJigMAi/0jTDgWSwESRI0CAAEAB4mL/iJC/+yL/yRC/+aKAwCL/SNMOBZLARJEjQIAAQAHiYv+IkL/7Iv/JEL/5ooDAIv9I0xJOBZMOBdMOBcSRI0CAAMACUIADIv+IkL/5Yv/JEL/34v9OBcjOBcSRIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/transaction/out/TransactionContract.destructured.ir b/test_cases/transaction/out/TransactionContract.destructured.ir index bc95dd4593..6b11d1affc 100644 --- a/test_cases/transaction/out/TransactionContract.destructured.ir +++ b/test_cases/transaction/out/TransactionContract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.transaction.contract.TransactionContract: block@2: // create_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // pay_route_L31 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%11#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -36,9 +36,9 @@ contract test_cases.transaction.contract.TransactionContract: block@4: // key_route_L40 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%16#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -49,9 +49,9 @@ contract test_cases.transaction.contract.TransactionContract: block@5: // asset_config_route_L51 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%21#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -62,9 +62,9 @@ contract test_cases.transaction.contract.TransactionContract: block@6: // asset_transfer_route_L68 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%26#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -75,9 +75,9 @@ contract test_cases.transaction.contract.TransactionContract: block@7: // asset_freeze_route_L77 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating let tmp%31#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%31#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -88,9 +88,9 @@ contract test_cases.transaction.contract.TransactionContract: block@8: // application_call_route_L85 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: uint64 = (txn GroupIndex) let gtxn_idx%5#0: uint64 = (- tmp%36#0 1u) let gtxn_type%5#0: uint64 = ((gtxns TypeEnum) gtxn_idx%5#0) @@ -101,9 +101,9 @@ contract test_cases.transaction.contract.TransactionContract: block@9: // multiple_txns_route_L111 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%6#0: uint64 = (- tmp%41#0 3u) let gtxn_type%6#0: uint64 = ((gtxns TypeEnum) gtxn_idx%6#0) @@ -124,9 +124,9 @@ contract test_cases.transaction.contract.TransactionContract: block@10: // any_txn_route_L121 let tmp%44#0: uint64 = (txn OnCompletion) let tmp%45#0: bool = (! tmp%44#0) - (assert tmp%45#0) // OnCompletion is NoOp + (assert tmp%45#0) // OnCompletion is not NoOp let tmp%46#0: uint64 = (txn ApplicationID) - (assert tmp%46#0) // is not creating + (assert tmp%46#0) // can only call when not creating let tmp%48#0: uint64 = (txn GroupIndex) let gtxn_idx%9#0: uint64 = (- tmp%48#0 3u) let tmp%49#0: uint64 = (txn GroupIndex) @@ -138,9 +138,9 @@ contract test_cases.transaction.contract.TransactionContract: block@11: // group_init_route_L131 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%12#0: uint64 = (- tmp%55#0 3u) let tmp%56#0: uint64 = (txn GroupIndex) diff --git a/test_cases/transaction/out/TransactionContract.ssa.ir b/test_cases/transaction/out/TransactionContract.ssa.ir index 8962dd419a..bae9cb5843 100644 --- a/test_cases/transaction/out/TransactionContract.ssa.ir +++ b/test_cases/transaction/out/TransactionContract.ssa.ir @@ -16,19 +16,19 @@ contract test_cases.transaction.contract.TransactionContract: block@2: // create_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.transaction.contract.TransactionContract.create() return 1u block@3: // pay_route_L31 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%11#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%11#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -39,10 +39,10 @@ contract test_cases.transaction.contract.TransactionContract: block@4: // key_route_L40 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (== tmp%12#0 NoOp) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (!= tmp%14#0 0u) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%16#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%16#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -53,10 +53,10 @@ contract test_cases.transaction.contract.TransactionContract: block@5: // asset_config_route_L51 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%21#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%21#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -67,10 +67,10 @@ contract test_cases.transaction.contract.TransactionContract: block@6: // asset_transfer_route_L68 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%26#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -81,10 +81,10 @@ contract test_cases.transaction.contract.TransactionContract: block@7: // asset_freeze_route_L77 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 NoOp) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%31#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%31#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -95,10 +95,10 @@ contract test_cases.transaction.contract.TransactionContract: block@8: // application_call_route_L85 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (== tmp%32#0 NoOp) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) let tmp%35#0: bool = (!= tmp%34#0 0u) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%36#0: uint64 = (txn GroupIndex) let gtxn_idx%5#0: uint64 = (- tmp%36#0 1u) let gtxn_type%5#0: uint64 = ((gtxns TypeEnum) gtxn_idx%5#0) @@ -109,10 +109,10 @@ contract test_cases.transaction.contract.TransactionContract: block@9: // multiple_txns_route_L111 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%6#0: uint64 = (- tmp%41#0 3u) let gtxn_type%6#0: uint64 = ((gtxns TypeEnum) gtxn_idx%6#0) @@ -133,10 +133,10 @@ contract test_cases.transaction.contract.TransactionContract: block@10: // any_txn_route_L121 let tmp%44#0: uint64 = (txn OnCompletion) let tmp%45#0: bool = (== tmp%44#0 NoOp) - (assert tmp%45#0) // OnCompletion is NoOp + (assert tmp%45#0) // OnCompletion is not NoOp let tmp%46#0: uint64 = (txn ApplicationID) let tmp%47#0: bool = (!= tmp%46#0 0u) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%48#0: uint64 = (txn GroupIndex) let gtxn_idx%9#0: uint64 = (- tmp%48#0 3u) let tmp%49#0: uint64 = (txn GroupIndex) @@ -148,10 +148,10 @@ contract test_cases.transaction.contract.TransactionContract: block@11: // group_init_route_L131 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (== tmp%51#0 NoOp) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) let tmp%54#0: bool = (!= tmp%53#0 0u) - (assert tmp%54#0) // is not creating + (assert tmp%54#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%12#0: uint64 = (- tmp%55#0 3u) let tmp%56#0: uint64 = (txn GroupIndex) diff --git a/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir b/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir index f2e55a1cd0..6fae4ff8a7 100644 --- a/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir +++ b/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir @@ -15,17 +15,17 @@ contract test_cases.transaction.contract.TransactionContract: block@2: // create_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // pay_route_L31 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%11#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -36,9 +36,9 @@ contract test_cases.transaction.contract.TransactionContract: block@4: // key_route_L40 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%16#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -49,9 +49,9 @@ contract test_cases.transaction.contract.TransactionContract: block@5: // asset_config_route_L51 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%21#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -62,9 +62,9 @@ contract test_cases.transaction.contract.TransactionContract: block@6: // asset_transfer_route_L68 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%26#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -75,9 +75,9 @@ contract test_cases.transaction.contract.TransactionContract: block@7: // asset_freeze_route_L77 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating let tmp%31#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%31#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -88,9 +88,9 @@ contract test_cases.transaction.contract.TransactionContract: block@8: // application_call_route_L85 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: uint64 = (txn GroupIndex) let gtxn_idx%5#0: uint64 = (- tmp%36#0 1u) let gtxn_type%5#0: uint64 = ((gtxns TypeEnum) gtxn_idx%5#0) @@ -101,9 +101,9 @@ contract test_cases.transaction.contract.TransactionContract: block@9: // multiple_txns_route_L111 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%6#0: uint64 = (- tmp%41#0 3u) let gtxn_type%6#0: uint64 = ((gtxns TypeEnum) gtxn_idx%6#0) @@ -124,9 +124,9 @@ contract test_cases.transaction.contract.TransactionContract: block@10: // any_txn_route_L121 let tmp%44#0: uint64 = (txn OnCompletion) let tmp%45#0: bool = (! tmp%44#0) - (assert tmp%45#0) // OnCompletion is NoOp + (assert tmp%45#0) // OnCompletion is not NoOp let tmp%46#0: uint64 = (txn ApplicationID) - (assert tmp%46#0) // is not creating + (assert tmp%46#0) // can only call when not creating let tmp%48#0: uint64 = (txn GroupIndex) let gtxn_idx%9#0: uint64 = (- tmp%48#0 3u) let tmp%49#0: uint64 = (txn GroupIndex) @@ -138,9 +138,9 @@ contract test_cases.transaction.contract.TransactionContract: block@11: // group_init_route_L131 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%12#0: uint64 = (- tmp%55#0 3u) let tmp%56#0: uint64 = (txn GroupIndex) diff --git a/test_cases/transaction/out_O2/TransactionContract.approval.teal b/test_cases/transaction/out_O2/TransactionContract.approval.teal index 4aea27079c..cadb2a827c 100644 --- a/test_cases/transaction/out_O2/TransactionContract.approval.teal +++ b/test_cases/transaction/out_O2/TransactionContract.approval.teal @@ -20,19 +20,19 @@ __puya_arc4_router__: __puya_arc4_router___create_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub __puya_arc4_router___pay_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -48,9 +48,9 @@ __puya_arc4_router___pay_route@3: __puya_arc4_router___key_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -66,9 +66,9 @@ __puya_arc4_router___key_route@4: __puya_arc4_router___asset_config_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -84,9 +84,9 @@ __puya_arc4_router___asset_config_route@5: __puya_arc4_router___asset_transfer_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -102,9 +102,9 @@ __puya_arc4_router___asset_transfer_route@6: __puya_arc4_router___asset_freeze_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -120,9 +120,9 @@ __puya_arc4_router___asset_freeze_route@7: __puya_arc4_router___application_call_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_0 // 1 - @@ -138,9 +138,9 @@ __puya_arc4_router___application_call_route@8: __puya_arc4_router___multiple_txns_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_3 // 3 - @@ -172,9 +172,9 @@ __puya_arc4_router___multiple_txns_route@9: __puya_arc4_router___any_txn_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_3 // 3 - @@ -191,9 +191,9 @@ __puya_arc4_router___any_txn_route@10: __puya_arc4_router___group_init_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txn GroupIndex intc_3 // 3 - diff --git a/test_cases/transaction/out_O2/TransactionContract.destructured.ir b/test_cases/transaction/out_O2/TransactionContract.destructured.ir index bc95dd4593..6b11d1affc 100644 --- a/test_cases/transaction/out_O2/TransactionContract.destructured.ir +++ b/test_cases/transaction/out_O2/TransactionContract.destructured.ir @@ -15,17 +15,17 @@ contract test_cases.transaction.contract.TransactionContract: block@2: // create_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (! tmp%5#0) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating return 1u block@3: // pay_route_L31 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating let tmp%11#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%11#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -36,9 +36,9 @@ contract test_cases.transaction.contract.TransactionContract: block@4: // key_route_L40 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (! tmp%12#0) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%16#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%16#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -49,9 +49,9 @@ contract test_cases.transaction.contract.TransactionContract: block@5: // asset_config_route_L51 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (! tmp%17#0) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) - (assert tmp%19#0) // is not creating + (assert tmp%19#0) // can only call when not creating let tmp%21#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%21#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -62,9 +62,9 @@ contract test_cases.transaction.contract.TransactionContract: block@6: // asset_transfer_route_L68 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (! tmp%22#0) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%26#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -75,9 +75,9 @@ contract test_cases.transaction.contract.TransactionContract: block@7: // asset_freeze_route_L77 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) - (assert tmp%29#0) // is not creating + (assert tmp%29#0) // can only call when not creating let tmp%31#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%31#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -88,9 +88,9 @@ contract test_cases.transaction.contract.TransactionContract: block@8: // application_call_route_L85 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (! tmp%32#0) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) - (assert tmp%34#0) // is not creating + (assert tmp%34#0) // can only call when not creating let tmp%36#0: uint64 = (txn GroupIndex) let gtxn_idx%5#0: uint64 = (- tmp%36#0 1u) let gtxn_type%5#0: uint64 = ((gtxns TypeEnum) gtxn_idx%5#0) @@ -101,9 +101,9 @@ contract test_cases.transaction.contract.TransactionContract: block@9: // multiple_txns_route_L111 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (! tmp%37#0) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%6#0: uint64 = (- tmp%41#0 3u) let gtxn_type%6#0: uint64 = ((gtxns TypeEnum) gtxn_idx%6#0) @@ -124,9 +124,9 @@ contract test_cases.transaction.contract.TransactionContract: block@10: // any_txn_route_L121 let tmp%44#0: uint64 = (txn OnCompletion) let tmp%45#0: bool = (! tmp%44#0) - (assert tmp%45#0) // OnCompletion is NoOp + (assert tmp%45#0) // OnCompletion is not NoOp let tmp%46#0: uint64 = (txn ApplicationID) - (assert tmp%46#0) // is not creating + (assert tmp%46#0) // can only call when not creating let tmp%48#0: uint64 = (txn GroupIndex) let gtxn_idx%9#0: uint64 = (- tmp%48#0 3u) let tmp%49#0: uint64 = (txn GroupIndex) @@ -138,9 +138,9 @@ contract test_cases.transaction.contract.TransactionContract: block@11: // group_init_route_L131 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (! tmp%51#0) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) - (assert tmp%53#0) // is not creating + (assert tmp%53#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%12#0: uint64 = (- tmp%55#0 3u) let tmp%56#0: uint64 = (txn GroupIndex) diff --git a/test_cases/transaction/out_unoptimized/TransactionContract.approval.teal b/test_cases/transaction/out_unoptimized/TransactionContract.approval.teal index c85d792a08..f2a1b037de 100644 --- a/test_cases/transaction/out_unoptimized/TransactionContract.approval.teal +++ b/test_cases/transaction/out_unoptimized/TransactionContract.approval.teal @@ -36,11 +36,11 @@ __puya_arc4_router___create_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub create intc_1 // 1 retsub @@ -51,11 +51,11 @@ __puya_arc4_router___pay_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -78,11 +78,11 @@ __puya_arc4_router___key_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -105,11 +105,11 @@ __puya_arc4_router___asset_config_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -132,11 +132,11 @@ __puya_arc4_router___asset_transfer_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -159,11 +159,11 @@ __puya_arc4_router___asset_freeze_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -186,11 +186,11 @@ __puya_arc4_router___application_call_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -213,11 +213,11 @@ __puya_arc4_router___multiple_txns_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -259,11 +259,11 @@ __puya_arc4_router___any_txn_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex @@ -290,11 +290,11 @@ __puya_arc4_router___group_init_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // transaction/contract.py:11 // class TransactionContract(arc4.ARC4Contract): txn GroupIndex diff --git a/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir b/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir index e5f779c9af..0f622f83cc 100644 --- a/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir +++ b/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir @@ -16,19 +16,19 @@ contract test_cases.transaction.contract.TransactionContract: block@2: // create_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (== tmp%5#0 0u) - (assert tmp%6#0) // is creating + (assert tmp%6#0) // can only call when creating test_cases.transaction.contract.TransactionContract.create() return 1u block@3: // pay_route_L31 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%11#0: uint64 = (txn GroupIndex) let gtxn_idx%0#0: uint64 = (- tmp%11#0 1u) let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0) @@ -39,10 +39,10 @@ contract test_cases.transaction.contract.TransactionContract: block@4: // key_route_L40 let tmp%12#0: uint64 = (txn OnCompletion) let tmp%13#0: bool = (== tmp%12#0 NoOp) - (assert tmp%13#0) // OnCompletion is NoOp + (assert tmp%13#0) // OnCompletion is not NoOp let tmp%14#0: uint64 = (txn ApplicationID) let tmp%15#0: bool = (!= tmp%14#0 0u) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%16#0: uint64 = (txn GroupIndex) let gtxn_idx%1#0: uint64 = (- tmp%16#0 1u) let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0) @@ -53,10 +53,10 @@ contract test_cases.transaction.contract.TransactionContract: block@5: // asset_config_route_L51 let tmp%17#0: uint64 = (txn OnCompletion) let tmp%18#0: bool = (== tmp%17#0 NoOp) - (assert tmp%18#0) // OnCompletion is NoOp + (assert tmp%18#0) // OnCompletion is not NoOp let tmp%19#0: uint64 = (txn ApplicationID) let tmp%20#0: bool = (!= tmp%19#0 0u) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let tmp%21#0: uint64 = (txn GroupIndex) let gtxn_idx%2#0: uint64 = (- tmp%21#0 1u) let gtxn_type%2#0: uint64 = ((gtxns TypeEnum) gtxn_idx%2#0) @@ -67,10 +67,10 @@ contract test_cases.transaction.contract.TransactionContract: block@6: // asset_transfer_route_L68 let tmp%22#0: uint64 = (txn OnCompletion) let tmp%23#0: bool = (== tmp%22#0 NoOp) - (assert tmp%23#0) // OnCompletion is NoOp + (assert tmp%23#0) // OnCompletion is not NoOp let tmp%24#0: uint64 = (txn ApplicationID) let tmp%25#0: bool = (!= tmp%24#0 0u) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%26#0: uint64 = (txn GroupIndex) let gtxn_idx%3#0: uint64 = (- tmp%26#0 1u) let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0) @@ -81,10 +81,10 @@ contract test_cases.transaction.contract.TransactionContract: block@7: // asset_freeze_route_L77 let tmp%27#0: uint64 = (txn OnCompletion) let tmp%28#0: bool = (== tmp%27#0 NoOp) - (assert tmp%28#0) // OnCompletion is NoOp + (assert tmp%28#0) // OnCompletion is not NoOp let tmp%29#0: uint64 = (txn ApplicationID) let tmp%30#0: bool = (!= tmp%29#0 0u) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%31#0: uint64 = (txn GroupIndex) let gtxn_idx%4#0: uint64 = (- tmp%31#0 1u) let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0) @@ -95,10 +95,10 @@ contract test_cases.transaction.contract.TransactionContract: block@8: // application_call_route_L85 let tmp%32#0: uint64 = (txn OnCompletion) let tmp%33#0: bool = (== tmp%32#0 NoOp) - (assert tmp%33#0) // OnCompletion is NoOp + (assert tmp%33#0) // OnCompletion is not NoOp let tmp%34#0: uint64 = (txn ApplicationID) let tmp%35#0: bool = (!= tmp%34#0 0u) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%36#0: uint64 = (txn GroupIndex) let gtxn_idx%5#0: uint64 = (- tmp%36#0 1u) let gtxn_type%5#0: uint64 = ((gtxns TypeEnum) gtxn_idx%5#0) @@ -109,10 +109,10 @@ contract test_cases.transaction.contract.TransactionContract: block@9: // multiple_txns_route_L111 let tmp%37#0: uint64 = (txn OnCompletion) let tmp%38#0: bool = (== tmp%37#0 NoOp) - (assert tmp%38#0) // OnCompletion is NoOp + (assert tmp%38#0) // OnCompletion is not NoOp let tmp%39#0: uint64 = (txn ApplicationID) let tmp%40#0: bool = (!= tmp%39#0 0u) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%41#0: uint64 = (txn GroupIndex) let gtxn_idx%6#0: uint64 = (- tmp%41#0 3u) let gtxn_type%6#0: uint64 = ((gtxns TypeEnum) gtxn_idx%6#0) @@ -133,10 +133,10 @@ contract test_cases.transaction.contract.TransactionContract: block@10: // any_txn_route_L121 let tmp%44#0: uint64 = (txn OnCompletion) let tmp%45#0: bool = (== tmp%44#0 NoOp) - (assert tmp%45#0) // OnCompletion is NoOp + (assert tmp%45#0) // OnCompletion is not NoOp let tmp%46#0: uint64 = (txn ApplicationID) let tmp%47#0: bool = (!= tmp%46#0 0u) - (assert tmp%47#0) // is not creating + (assert tmp%47#0) // can only call when not creating let tmp%48#0: uint64 = (txn GroupIndex) let gtxn_idx%9#0: uint64 = (- tmp%48#0 3u) let tmp%49#0: uint64 = (txn GroupIndex) @@ -148,10 +148,10 @@ contract test_cases.transaction.contract.TransactionContract: block@11: // group_init_route_L131 let tmp%51#0: uint64 = (txn OnCompletion) let tmp%52#0: bool = (== tmp%51#0 NoOp) - (assert tmp%52#0) // OnCompletion is NoOp + (assert tmp%52#0) // OnCompletion is not NoOp let tmp%53#0: uint64 = (txn ApplicationID) let tmp%54#0: bool = (!= tmp%53#0 0u) - (assert tmp%54#0) // is not creating + (assert tmp%54#0) // can only call when not creating let tmp%55#0: uint64 = (txn GroupIndex) let gtxn_idx%12#0: uint64 = (- tmp%55#0 3u) let tmp%56#0: uint64 = (txn GroupIndex) diff --git a/test_cases/transaction/puya.log b/test_cases/transaction/puya.log index cf1ce113aa..dd395c4a8f 100644 --- a/test_cases/transaction/puya.log +++ b/test_cases/transaction/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['transaction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['transaction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing transaction/out/module.awst debug: Sealing block@0: // L12 @@ -1553,6 +1553,7 @@ debug: shared x-stack for group_init_block@0 -> group_init_for_body@1: txn#1, lo debug: shared x-stack for group_init_for_header_1@3 -> group_init_for_body@1: txn#1, loop_counter%0#0 debug: shared x-stack for group_init_for_header_2@4 -> group_init_for_body@1: txn#1, loop_counter%0#0 info: Writing transaction/out/TransactionContract.arc32.json +info: Writing transaction/out/TransactionContract.arc56.json info: Writing transaction/out/TransactionContract.approval.teal info: Writing transaction/out/TransactionContract.clear.teal info: Writing transaction/out/TransactionContract.approval.bin diff --git a/test_cases/tuple_support/out/NestedTuples.approval.mir b/test_cases/tuple_support/out/NestedTuples.approval.mir index 08e11819f8..9f900bb8b6 100644 --- a/test_cases/tuple_support/out/NestedTuples.approval.mir +++ b/test_cases/tuple_support/out/NestedTuples.approval.mir @@ -60,9 +60,9 @@ __puya_arc4_router___run_tests_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub run_tests to_encode%0#0 byte 0x00 to_encode%0#0,0x00 int 0 to_encode%0#0,0x00,0 @@ -80,9 +80,9 @@ __puya_arc4_router___nested_tuple_params_route@3: // @arc4.abimethod() txn OnCompletion tmp%8#0 ! tmp%9#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%10#0 - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 tmp%12#0 @@ -168,9 +168,9 @@ __puya_arc4_router___named_tuple_route@4: // @arc4.abimethod() txn OnCompletion tmp%14#0 ! tmp%15#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%16#0 - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 tmp%18#0 @@ -244,9 +244,9 @@ __puya_arc4_router___nested_named_tuple_params_route@5: // @arc4.abimethod() txn OnCompletion tmp%20#0 ! tmp%21#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%22#0 - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 tmp%24#0 @@ -350,7 +350,7 @@ __puya_arc4_router___bare_routing@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID tmp%27#0 ! tmp%28#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/tuple_support/out/NestedTuples.approval.teal b/test_cases/tuple_support/out/NestedTuples.approval.teal index e8dcececdb..ebf00e9ca0 100644 --- a/test_cases/tuple_support/out/NestedTuples.approval.teal +++ b/test_cases/tuple_support/out/NestedTuples.approval.teal @@ -43,9 +43,9 @@ __puya_arc4_router___run_tests_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub run_tests pushbytes 0x00 intc_2 // 0 @@ -63,9 +63,9 @@ __puya_arc4_router___nested_tuple_params_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -146,9 +146,9 @@ __puya_arc4_router___named_tuple_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -216,9 +216,9 @@ __puya_arc4_router___nested_named_tuple_params_route@5: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -310,7 +310,7 @@ __puya_arc4_router___bare_routing@8: bnz __puya_arc4_router___after_if_else@12 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/tuple_support/out/NestedTuples.arc32.json b/test_cases/tuple_support/out/NestedTuples.arc32.json index 6e45eeeda7..adbb1a50e9 100644 --- a/test_cases/tuple_support/out/NestedTuples.arc32.json +++ b/test_cases/tuple_support/out/NestedTuples.arc32.json @@ -94,7 +94,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDIgMCAzCiAgICBieXRlY2Jsb2NrICJidWlsZF9uZXN0ZWRfY2FsbF9jb3VudCIgIkhpIiAweDE1MWY3Yzc1ICJUaGVyZSIgMHgwMDBjICJoaSIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTkKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A4CiAgICBwdXNoYnl0ZXNzIDB4OWU1YTNiYTcgMHhjZWEwNTIxYiAweDM3M2Y1YjI0IDB4ZWM1OTMwOTYgLy8gbWV0aG9kICJydW5fdGVzdHMoKWJvb2wiLCBtZXRob2QgIm5lc3RlZF90dXBsZV9wYXJhbXMoKHN0cmluZywoYnl0ZVtdLCh1aW50NjQpKSkpKGJ5dGVbXSwoc3RyaW5nLHVpbnQ2NCkpIiwgbWV0aG9kICJuYW1lZF90dXBsZSgodWludDY0LGJ5dGVbXSxzdHJpbmcpKSh1aW50NjQsYnl0ZVtdLHN0cmluZykiLCBtZXRob2QgIm5lc3RlZF9uYW1lZF90dXBsZV9wYXJhbXMoKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ydW5fdGVzdHNfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbmFtZWRfdHVwbGVfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDUKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3J1bl90ZXN0c19yb3V0ZUAyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBydW5fdGVzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25lc3RlZF90dXBsZV9wYXJhbXNfcm91dGVAMzoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxOAogICAgLy8gY2xhc3MgTmVzdGVkVHVwbGVzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBuZXN0ZWRfdHVwbGVfcGFyYW1zCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDBhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25hbWVkX3R1cGxlX3JvdXRlQDQ6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBuYW1lZF90dXBsZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAwYwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDU6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIG5lc3RlZF9uYW1lZF90dXBsZV9wYXJhbXMKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAwYwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A4OgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMucnVuX3Rlc3RzKCkgLT4gdWludDY0OgpydW5fdGVzdHM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcnVuX3Rlc3RzKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjUKICAgIC8vIGFzc2VydCB0ZXN0X3N3YXAoeCkgPT0gKFN0cmluZygiVGhlcmUiKSwgU3RyaW5nKCJIaSIpKQogICAgY2FsbHN1YiB0ZXN0X3N3YXAKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gIlRoZXJlIgogICAgPT0KICAgIHN3YXAKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjI3CiAgICAvLyB6ID0gKFVJbnQ2NCgwKSwgVUludDY0KDIpLCB5KQogICAgaW50Y18yIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjYKICAgIC8vIHkgPSAoVUludDY0KDEpLCB4KQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICBkdXAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozMwogICAgLy8gKGEsIGIsIChjLCBkLCAoZSwpKSkgPSB0ZXN0X3JlYXJyYW5nZSh4WzBdLCBfYj14WzFdLCBhcmdzPXopCiAgICBjYWxsc3ViIHRlc3RfcmVhcnJhbmdlCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzQKICAgIC8vIGFzc2VydCAoYSwgYikgPT0gKFN0cmluZygiSGkiKSwgVUludDY0KDApKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18xIC8vICJIaSIKICAgID09CiAgICB1bmNvdmVyIDQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNQogICAgLy8gYXNzZXJ0IChjLCBkKSA9PSAoVUludDY0KDIpLCBVSW50NjQoMSkpCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICA9PQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNgogICAgLy8gYXNzZXJ0IGUgPT0gU3RyaW5nKCJUaGVyZSIpCiAgICBieXRlY18zIC8vICJUaGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozOAogICAgLy8gdGVzdF9pbnRyaW5zaWNzKFVJbnQ2NCgxKSwgVUludDY0KDIpKQogICAgaW50Y18wIC8vIDEKICAgIGludGNfMSAvLyAyCiAgICBjYWxsc3ViIHRlc3RfaW50cmluc2ljcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQwCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249VHJ1ZSkKICAgIGludGNfMCAvLyAxCiAgICBkdXAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQxCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249RmFsc2UpCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18yIC8vIDAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQ2CiAgICAvLyB0ZXN0X25lc3RlZF9pdGVyYXRpb24oKQogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF9pdGVyYXRpb24KICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0OAogICAgLy8gc2VsZi50ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZCgpCiAgICBjYWxsc3ViIHRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NDkKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9zd2FwKGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdGVzdF9zd2FwOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkwLTkxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3Rfc3dhcChhcmdzOiB0dXBsZVtTdHJpbmcsIFN0cmluZ10pIC0+IHR1cGxlW1N0cmluZywgU3RyaW5nXToKICAgIHByb3RvIDIgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkzCiAgICAvLyByZXR1cm4gYiwgYQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfcmVhcnJhbmdlKF9hOiBieXRlcywgYXJncy4wOiB1aW50NjQsIGFyZ3MuMTogdWludDY0LCBhcmdzLjIuMDogdWludDY0LCBhcmdzLjIuMS4wOiBieXRlcywgYXJncy4yLjEuMTogYnl0ZXMsIF9iOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIGJ5dGVzOgp0ZXN0X3JlYXJyYW5nZToKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo4MS04NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3JlYXJyYW5nZSgKICAgIC8vICAgICBfYTogU3RyaW5nLCBhcmdzOiB0dXBsZVtVSW50NjQsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCB0dXBsZVtTdHJpbmcsIFN0cmluZ11dXSwgX2I6IFN0cmluZwogICAgLy8gKSAtPiB0dXBsZVtTdHJpbmcsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCBVSW50NjQsIHR1cGxlW1N0cmluZ11dXToKICAgIHByb3RvIDcgNQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojg3CiAgICAvLyByZXR1cm4gZCwgYSwgKGIsIGMsIChlLCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9pbnRyaW5zaWNzKG51bTE6IHVpbnQ2NCwgbnVtMjogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2ludHJpbnNpY3M6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTYtOTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9pbnRyaW5zaWNzKG51bTE6IFVJbnQ2NCwgbnVtMjogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTgKICAgIC8vIG50ID0gKFVJbnQ2NCgxKSwgb3AuYWRkdyhudW0xLCBudW0yKSwgVUludDY0KDQyKSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhZGR3CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAxCiAgICAvLyBhc3NlcnQgbnRbMV0gPT0gKDAsIG51bTEgKyBudW0yKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgIQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGR1cDIKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMDIKICAgIC8vIGFzc2VydCBudFsxXVs6MV0gPT0gKDAsKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAzCiAgICAvLyBhc3NlcnQgbnRbMV1bMTpdID09IChudW0xICsgbnVtMiwpCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfbmVzdGVkX3NpbmdsZXMob25lOiB1aW50NjQsIHJlYXNzaWduOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3NpbmdsZXM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTMxLTEzMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF9zaW5nbGVzKG9uZTogVUludDY0LCAqLCByZWFzc2lnbjogYm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEzNAogICAgLy8gKFVJbnQ2NCgwKSwpLAogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMzYKICAgIC8vIChVSW50NjQoMiksKSwKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQwCiAgICAvLyBhc3NlcnQgc1sxXVswXSA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDUKICAgIC8vIGlmIHJlYXNzaWduOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiB0ZXN0X25lc3RlZF9zaW5nbGVzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0NwogICAgLy8gKFVJbnQ2NCgzKSwpLAogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDYtMTUwCiAgICAvLyBzID0gKAogICAgLy8gICAgIChVSW50NjQoMyksKSwKICAgIC8vICAgICAoVUludDY0KDQpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg1KSwpLAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ4CiAgICAvLyAoVUludDY0KDQpLCksCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0Ni0xNTAKICAgIC8vIHMgPSAoCiAgICAvLyAgICAgKFVJbnQ2NCgzKSwpLAogICAgLy8gICAgIChVSW50NjQoNCksKSwKICAgIC8vICAgICAoVUludDY0KDUpLCksCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDkKICAgIC8vIChVSW50NjQoNSksKSwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ2LTE1MAogICAgLy8gcyA9ICgKICAgIC8vICAgICAoVUludDY0KDMpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg0KSwpLAogICAgLy8gICAgIChVSW50NjQoNSksKSwKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMQoKdGVzdF9uZXN0ZWRfc2luZ2xlc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUxCiAgICAvLyBhc3NlcnQgc1swXVswXSA9PSAoMyBpZiByZWFzc2lnbiBlbHNlIDApCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyAzCiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8gYXNzZXJ0IHRtcCA9PSAoNSBpZiByZWFzc2lnbiBlbHNlIDIpCiAgICBpbnRjXzEgLy8gMgogICAgcHVzaGludCA1IC8vIDUKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIHMxICs9IG9uZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU4CiAgICAvLyBhc3NlcnQgczEgPT0gKDUgaWYgcmVhc3NpZ24gZWxzZSAyKQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1OQogICAgLy8gYXNzZXJ0IHNbMV1bMF0gPT0gKDQgaWYgcmVhc3NpZ24gZWxzZSAxKQogICAgaW50Y18wIC8vIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NS0xNzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc5CiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgaW50Y18yIC8vIDAKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4MwogICAgLy8gdG90YWwgKz0gYSArIGIKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dpdGNoIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzFAMyB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDQgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1CiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JANgoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUAzOgogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMkA0OgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1OgogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2FmdGVyX2ZvckA2OgogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDc6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg2CiAgICAvLyB0b3RhbCArPSBhICsgYgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2l0Y2ggdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUA5IHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzJAMTAgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMQogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDEyCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8xQDk6CiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc3CiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUA3Cgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDEwOgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlANwoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMToKICAgIGludGNfMyAvLyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIHN3YXAKICAgIGIgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDcKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg4CiAgICAvLyBhc3NlcnQgdG90YWwgLy8gOCA9PSAzCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIC8KICAgIGludGNfMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMudGVzdF9zaW5nbGVfZXZhbHVhdGlvbl9uZXN0ZWQoKSAtPiB2b2lkOgp0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZDoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3My03NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzUKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzYKICAgIC8vIHJlc3VsdCA9IHNlbGYuYnVpbGRfbmVzdGVkKCkgb3Igc2VsZi5idWlsZF9uZXN0ZWQoKQogICAgY2FsbHN1YiBidWlsZF9uZXN0ZWQKICAgIHBvcG4gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc3CiAgICAvLyBhc3NlcnQgcmVzdWx0WzBdWzBdID09ICJoaSIKICAgIGJ5dGVjIDUgLy8gImhpIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCA9PSAxCiAgICBpbnRjXzIgLy8gMAogICAgYnl0ZWNfMCAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLmJ1aWxkX25lc3RlZCgpIC0+IGJ5dGVzLCB1aW50NjQsIGJ5dGVzOgpidWlsZF9uZXN0ZWQ6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjgtNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfbmVzdGVkKHNlbGYpIC0+IHR1cGxlW3R1cGxlW1N0cmluZywgVUludDY0XSwgQnl0ZXNdOgogICAgcHJvdG8gMCAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgKz0gMQogICAgaW50Y18yIC8vIDAKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3MQogICAgLy8gcmV0dXJuIChTdHJpbmcoImhpIiksIFVJbnQ2NCgxKSksIEJ5dGVzKGIiaG1tbSIpCiAgICBieXRlYyA1IC8vICJoaSIKICAgIGludGNfMCAvLyAxCiAgICBwdXNoYnl0ZXMgMHg2ODZkNmQ2ZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLm5lc3RlZF90dXBsZV9wYXJhbXMoYXJncy4wOiBieXRlcywgYXJncy4xLjA6IGJ5dGVzLCBhcmdzLjEuMS4wOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlcywgdWludDY0OgpuZXN0ZWRfdHVwbGVfcGFyYW1zOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxLTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5lc3RlZF90dXBsZV9wYXJhbXMoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbU3RyaW5nLCB0dXBsZVtCeXRlcywgdHVwbGVbVUludDY0XV1dCiAgICAvLyApIC0+IHR1cGxlW0J5dGVzLCB0dXBsZVtTdHJpbmcsIFVJbnQ2NF1dOgogICAgcHJvdG8gMyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTYKICAgIC8vIHJldHVybiBiLCAocywgdSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uYW1lZF90dXBsZShhcmdzLmE6IHVpbnQ2NCwgYXJncy5iOiBieXRlcywgYXJncy5jOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cm5hbWVkX3R1cGxlOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4LTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5hbWVkX3R1cGxlKHNlbGYsIGFyZ3M6IENoaWxkKSAtPiBDaGlsZDoKICAgIHByb3RvIDMgMwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjYxCiAgICAvLyByZXR1cm4gQ2hpbGQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKGFyZ3MuZm9vOiB1aW50NjQsIGFyZ3MuZm9vX2FyYzogYnl0ZXMsIGFyZ3MuY2hpbGQuYTogdWludDY0LCBhcmdzLmNoaWxkLmI6IGJ5dGVzLCBhcmdzLmNoaWxkLmM6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCB1aW50NjQsIGJ5dGVzLCBieXRlczoKbmVzdGVkX25hbWVkX3R1cGxlX3BhcmFtczoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBuZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKHNlbGYsIGFyZ3M6IFBhcmVudCkgLT4gUGFyZW50OgogICAgcHJvdG8gNSA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjYKICAgIC8vIHJldHVybiBQYXJlbnQoZm9vLCBmb29fYXJjLCBDaGlsZChhLCBiLCBjKSkKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDIgMCAzCiAgICBieXRlY2Jsb2NrICJidWlsZF9uZXN0ZWRfY2FsbF9jb3VudCIgIkhpIiAweDE1MWY3Yzc1ICJUaGVyZSIgMHgwMDBjICJoaSIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTkKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A4CiAgICBwdXNoYnl0ZXNzIDB4OWU1YTNiYTcgMHhjZWEwNTIxYiAweDM3M2Y1YjI0IDB4ZWM1OTMwOTYgLy8gbWV0aG9kICJydW5fdGVzdHMoKWJvb2wiLCBtZXRob2QgIm5lc3RlZF90dXBsZV9wYXJhbXMoKHN0cmluZywoYnl0ZVtdLCh1aW50NjQpKSkpKGJ5dGVbXSwoc3RyaW5nLHVpbnQ2NCkpIiwgbWV0aG9kICJuYW1lZF90dXBsZSgodWludDY0LGJ5dGVbXSxzdHJpbmcpKSh1aW50NjQsYnl0ZVtdLHN0cmluZykiLCBtZXRob2QgIm5lc3RlZF9uYW1lZF90dXBsZV9wYXJhbXMoKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ydW5fdGVzdHNfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbmFtZWRfdHVwbGVfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDUKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3J1bl90ZXN0c19yb3V0ZUAyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHJ1bl90ZXN0cwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbmVzdGVkX3R1cGxlX3BhcmFtc19yb3V0ZUAzOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbmVzdGVkX3R1cGxlX3BhcmFtcwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwYQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uYW1lZF90dXBsZV9yb3V0ZUA0OgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBuYW1lZF90dXBsZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAwYwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDU6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxOAogICAgLy8gY2xhc3MgTmVzdGVkVHVwbGVzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbmVzdGVkX25hbWVkX3R1cGxlX3BhcmFtcwogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDQgLy8gMHgwMDBjCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMucnVuX3Rlc3RzKCkgLT4gdWludDY0OgpydW5fdGVzdHM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcnVuX3Rlc3RzKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjUKICAgIC8vIGFzc2VydCB0ZXN0X3N3YXAoeCkgPT0gKFN0cmluZygiVGhlcmUiKSwgU3RyaW5nKCJIaSIpKQogICAgY2FsbHN1YiB0ZXN0X3N3YXAKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gIlRoZXJlIgogICAgPT0KICAgIHN3YXAKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjI3CiAgICAvLyB6ID0gKFVJbnQ2NCgwKSwgVUludDY0KDIpLCB5KQogICAgaW50Y18yIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjYKICAgIC8vIHkgPSAoVUludDY0KDEpLCB4KQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICBkdXAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozMwogICAgLy8gKGEsIGIsIChjLCBkLCAoZSwpKSkgPSB0ZXN0X3JlYXJyYW5nZSh4WzBdLCBfYj14WzFdLCBhcmdzPXopCiAgICBjYWxsc3ViIHRlc3RfcmVhcnJhbmdlCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzQKICAgIC8vIGFzc2VydCAoYSwgYikgPT0gKFN0cmluZygiSGkiKSwgVUludDY0KDApKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18xIC8vICJIaSIKICAgID09CiAgICB1bmNvdmVyIDQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNQogICAgLy8gYXNzZXJ0IChjLCBkKSA9PSAoVUludDY0KDIpLCBVSW50NjQoMSkpCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICA9PQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNgogICAgLy8gYXNzZXJ0IGUgPT0gU3RyaW5nKCJUaGVyZSIpCiAgICBieXRlY18zIC8vICJUaGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozOAogICAgLy8gdGVzdF9pbnRyaW5zaWNzKFVJbnQ2NCgxKSwgVUludDY0KDIpKQogICAgaW50Y18wIC8vIDEKICAgIGludGNfMSAvLyAyCiAgICBjYWxsc3ViIHRlc3RfaW50cmluc2ljcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQwCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249VHJ1ZSkKICAgIGludGNfMCAvLyAxCiAgICBkdXAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQxCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249RmFsc2UpCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18yIC8vIDAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQ2CiAgICAvLyB0ZXN0X25lc3RlZF9pdGVyYXRpb24oKQogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF9pdGVyYXRpb24KICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0OAogICAgLy8gc2VsZi50ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZCgpCiAgICBjYWxsc3ViIHRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NDkKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9zd2FwKGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdGVzdF9zd2FwOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkwLTkxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3Rfc3dhcChhcmdzOiB0dXBsZVtTdHJpbmcsIFN0cmluZ10pIC0+IHR1cGxlW1N0cmluZywgU3RyaW5nXToKICAgIHByb3RvIDIgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkzCiAgICAvLyByZXR1cm4gYiwgYQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfcmVhcnJhbmdlKF9hOiBieXRlcywgYXJncy4wOiB1aW50NjQsIGFyZ3MuMTogdWludDY0LCBhcmdzLjIuMDogdWludDY0LCBhcmdzLjIuMS4wOiBieXRlcywgYXJncy4yLjEuMTogYnl0ZXMsIF9iOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIGJ5dGVzOgp0ZXN0X3JlYXJyYW5nZToKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo4MS04NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3JlYXJyYW5nZSgKICAgIC8vICAgICBfYTogU3RyaW5nLCBhcmdzOiB0dXBsZVtVSW50NjQsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCB0dXBsZVtTdHJpbmcsIFN0cmluZ11dXSwgX2I6IFN0cmluZwogICAgLy8gKSAtPiB0dXBsZVtTdHJpbmcsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCBVSW50NjQsIHR1cGxlW1N0cmluZ11dXToKICAgIHByb3RvIDcgNQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojg3CiAgICAvLyByZXR1cm4gZCwgYSwgKGIsIGMsIChlLCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9pbnRyaW5zaWNzKG51bTE6IHVpbnQ2NCwgbnVtMjogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2ludHJpbnNpY3M6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTYtOTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9pbnRyaW5zaWNzKG51bTE6IFVJbnQ2NCwgbnVtMjogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTgKICAgIC8vIG50ID0gKFVJbnQ2NCgxKSwgb3AuYWRkdyhudW0xLCBudW0yKSwgVUludDY0KDQyKSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhZGR3CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAxCiAgICAvLyBhc3NlcnQgbnRbMV0gPT0gKDAsIG51bTEgKyBudW0yKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgIQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGR1cDIKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMDIKICAgIC8vIGFzc2VydCBudFsxXVs6MV0gPT0gKDAsKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAzCiAgICAvLyBhc3NlcnQgbnRbMV1bMTpdID09IChudW0xICsgbnVtMiwpCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfbmVzdGVkX3NpbmdsZXMob25lOiB1aW50NjQsIHJlYXNzaWduOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3NpbmdsZXM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTMxLTEzMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF9zaW5nbGVzKG9uZTogVUludDY0LCAqLCByZWFzc2lnbjogYm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEzNAogICAgLy8gKFVJbnQ2NCgwKSwpLAogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMzYKICAgIC8vIChVSW50NjQoMiksKSwKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQwCiAgICAvLyBhc3NlcnQgc1sxXVswXSA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDUKICAgIC8vIGlmIHJlYXNzaWduOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiB0ZXN0X25lc3RlZF9zaW5nbGVzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0NwogICAgLy8gKFVJbnQ2NCgzKSwpLAogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDYtMTUwCiAgICAvLyBzID0gKAogICAgLy8gICAgIChVSW50NjQoMyksKSwKICAgIC8vICAgICAoVUludDY0KDQpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg1KSwpLAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ4CiAgICAvLyAoVUludDY0KDQpLCksCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0Ni0xNTAKICAgIC8vIHMgPSAoCiAgICAvLyAgICAgKFVJbnQ2NCgzKSwpLAogICAgLy8gICAgIChVSW50NjQoNCksKSwKICAgIC8vICAgICAoVUludDY0KDUpLCksCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDkKICAgIC8vIChVSW50NjQoNSksKSwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ2LTE1MAogICAgLy8gcyA9ICgKICAgIC8vICAgICAoVUludDY0KDMpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg0KSwpLAogICAgLy8gICAgIChVSW50NjQoNSksKSwKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMQoKdGVzdF9uZXN0ZWRfc2luZ2xlc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUxCiAgICAvLyBhc3NlcnQgc1swXVswXSA9PSAoMyBpZiByZWFzc2lnbiBlbHNlIDApCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyAzCiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8gYXNzZXJ0IHRtcCA9PSAoNSBpZiByZWFzc2lnbiBlbHNlIDIpCiAgICBpbnRjXzEgLy8gMgogICAgcHVzaGludCA1IC8vIDUKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIHMxICs9IG9uZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU4CiAgICAvLyBhc3NlcnQgczEgPT0gKDUgaWYgcmVhc3NpZ24gZWxzZSAyKQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1OQogICAgLy8gYXNzZXJ0IHNbMV1bMF0gPT0gKDQgaWYgcmVhc3NpZ24gZWxzZSAxKQogICAgaW50Y18wIC8vIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NS0xNzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc5CiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgaW50Y18yIC8vIDAKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4MwogICAgLy8gdG90YWwgKz0gYSArIGIKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dpdGNoIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzFAMyB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDQgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1CiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JANgoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUAzOgogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMkA0OgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1OgogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2FmdGVyX2ZvckA2OgogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDc6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg2CiAgICAvLyB0b3RhbCArPSBhICsgYgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2l0Y2ggdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUA5IHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzJAMTAgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMQogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDEyCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8xQDk6CiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc3CiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUA3Cgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDEwOgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlANwoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMToKICAgIGludGNfMyAvLyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIHN3YXAKICAgIGIgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDcKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg4CiAgICAvLyBhc3NlcnQgdG90YWwgLy8gOCA9PSAzCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIC8KICAgIGludGNfMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMudGVzdF9zaW5nbGVfZXZhbHVhdGlvbl9uZXN0ZWQoKSAtPiB2b2lkOgp0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZDoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3My03NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzUKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzYKICAgIC8vIHJlc3VsdCA9IHNlbGYuYnVpbGRfbmVzdGVkKCkgb3Igc2VsZi5idWlsZF9uZXN0ZWQoKQogICAgY2FsbHN1YiBidWlsZF9uZXN0ZWQKICAgIHBvcG4gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc3CiAgICAvLyBhc3NlcnQgcmVzdWx0WzBdWzBdID09ICJoaSIKICAgIGJ5dGVjIDUgLy8gImhpIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCA9PSAxCiAgICBpbnRjXzIgLy8gMAogICAgYnl0ZWNfMCAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLmJ1aWxkX25lc3RlZCgpIC0+IGJ5dGVzLCB1aW50NjQsIGJ5dGVzOgpidWlsZF9uZXN0ZWQ6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjgtNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfbmVzdGVkKHNlbGYpIC0+IHR1cGxlW3R1cGxlW1N0cmluZywgVUludDY0XSwgQnl0ZXNdOgogICAgcHJvdG8gMCAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgKz0gMQogICAgaW50Y18yIC8vIDAKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3MQogICAgLy8gcmV0dXJuIChTdHJpbmcoImhpIiksIFVJbnQ2NCgxKSksIEJ5dGVzKGIiaG1tbSIpCiAgICBieXRlYyA1IC8vICJoaSIKICAgIGludGNfMCAvLyAxCiAgICBwdXNoYnl0ZXMgMHg2ODZkNmQ2ZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLm5lc3RlZF90dXBsZV9wYXJhbXMoYXJncy4wOiBieXRlcywgYXJncy4xLjA6IGJ5dGVzLCBhcmdzLjEuMS4wOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlcywgdWludDY0OgpuZXN0ZWRfdHVwbGVfcGFyYW1zOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxLTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5lc3RlZF90dXBsZV9wYXJhbXMoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbU3RyaW5nLCB0dXBsZVtCeXRlcywgdHVwbGVbVUludDY0XV1dCiAgICAvLyApIC0+IHR1cGxlW0J5dGVzLCB0dXBsZVtTdHJpbmcsIFVJbnQ2NF1dOgogICAgcHJvdG8gMyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTYKICAgIC8vIHJldHVybiBiLCAocywgdSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uYW1lZF90dXBsZShhcmdzLmE6IHVpbnQ2NCwgYXJncy5iOiBieXRlcywgYXJncy5jOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cm5hbWVkX3R1cGxlOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4LTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5hbWVkX3R1cGxlKHNlbGYsIGFyZ3M6IENoaWxkKSAtPiBDaGlsZDoKICAgIHByb3RvIDMgMwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjYxCiAgICAvLyByZXR1cm4gQ2hpbGQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKGFyZ3MuZm9vOiB1aW50NjQsIGFyZ3MuZm9vX2FyYzogYnl0ZXMsIGFyZ3MuY2hpbGQuYTogdWludDY0LCBhcmdzLmNoaWxkLmI6IGJ5dGVzLCBhcmdzLmNoaWxkLmM6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCB1aW50NjQsIGJ5dGVzLCBieXRlczoKbmVzdGVkX25hbWVkX3R1cGxlX3BhcmFtczoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBuZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKHNlbGYsIGFyZ3M6IFBhcmVudCkgLT4gUGFyZW50OgogICAgcHJvdG8gNSA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjYKICAgIC8vIHJldHVybiBQYXJlbnQoZm9vLCBmb29fYXJjLCBDaGlsZChhLCBiLCBjKSkKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/tuple_support/out/NestedTuples.arc56.json b/test_cases/tuple_support/out/NestedTuples.arc56.json new file mode 100644 index 0000000000..e17506d344 --- /dev/null +++ b/test_cases/tuple_support/out/NestedTuples.arc56.json @@ -0,0 +1,217 @@ +{ + "name": "NestedTuples", + "structs": { + "Child": [ + { + "name": "a", + "type": "uint64" + }, + { + "name": "b", + "type": "byte[]" + }, + { + "name": "c", + "type": "string" + } + ], + "Parent": [ + { + "name": "foo", + "type": "uint64" + }, + { + "name": "foo_arc", + "type": "uint64" + }, + { + "name": "child", + "type": "Child" + } + ] + }, + "methods": [ + { + "name": "run_tests", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "nested_tuple_params", + "args": [ + { + "type": "(string,(byte[],(uint64)))", + "name": "args" + } + ], + "returns": { + "type": "(byte[],(string,uint64))" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "named_tuple", + "args": [ + { + "type": "(uint64,byte[],string)", + "struct": "Child", + "name": "args" + } + ], + "returns": { + "type": "(uint64,byte[],string)", + "struct": "Child" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "nested_named_tuple_params", + "args": [ + { + "type": "(uint64,uint64,(uint64,byte[],string))", + "struct": "Parent", + "name": "args" + } + ], + "returns": { + "type": "(uint64,uint64,(uint64,byte[],string))", + "struct": "Parent" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "build_nested_call_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YnVpbGRfbmVzdGVkX2NhbGxfY291bnQ=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 120, + 143, + 263, + 364 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 507 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 123, + 146, + 266, + 367 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 835, + 846 + ], + "errorMessage": "check self.build_nested_call_count exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDIgMCAzCiAgICBieXRlY2Jsb2NrICJidWlsZF9uZXN0ZWRfY2FsbF9jb3VudCIgIkhpIiAweDE1MWY3Yzc1ICJUaGVyZSIgMHgwMDBjICJoaSIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTkKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A4CiAgICBwdXNoYnl0ZXNzIDB4OWU1YTNiYTcgMHhjZWEwNTIxYiAweDM3M2Y1YjI0IDB4ZWM1OTMwOTYgLy8gbWV0aG9kICJydW5fdGVzdHMoKWJvb2wiLCBtZXRob2QgIm5lc3RlZF90dXBsZV9wYXJhbXMoKHN0cmluZywoYnl0ZVtdLCh1aW50NjQpKSkpKGJ5dGVbXSwoc3RyaW5nLHVpbnQ2NCkpIiwgbWV0aG9kICJuYW1lZF90dXBsZSgodWludDY0LGJ5dGVbXSxzdHJpbmcpKSh1aW50NjQsYnl0ZVtdLHN0cmluZykiLCBtZXRob2QgIm5lc3RlZF9uYW1lZF90dXBsZV9wYXJhbXMoKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10sc3RyaW5nKSkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ydW5fdGVzdHNfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbmFtZWRfdHVwbGVfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDUKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3J1bl90ZXN0c19yb3V0ZUAyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHJ1bl90ZXN0cwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbmVzdGVkX3R1cGxlX3BhcmFtc19yb3V0ZUAzOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbmVzdGVkX3R1cGxlX3BhcmFtcwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwYQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uYW1lZF90dXBsZV9yb3V0ZUA0OgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBuYW1lZF90dXBsZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAwYwogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDU6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxOAogICAgLy8gY2xhc3MgTmVzdGVkVHVwbGVzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgbmVzdGVkX25hbWVkX3R1cGxlX3BhcmFtcwogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDQgLy8gMHgwMDBjCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4CiAgICAvLyBjbGFzcyBOZXN0ZWRUdXBsZXMoQVJDNENvbnRyYWN0KToKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMucnVuX3Rlc3RzKCkgLT4gdWludDY0OgpydW5fdGVzdHM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjItMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcnVuX3Rlc3RzKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjUKICAgIC8vIGFzc2VydCB0ZXN0X3N3YXAoeCkgPT0gKFN0cmluZygiVGhlcmUiKSwgU3RyaW5nKCJIaSIpKQogICAgY2FsbHN1YiB0ZXN0X3N3YXAKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gIlRoZXJlIgogICAgPT0KICAgIHN3YXAKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjI3CiAgICAvLyB6ID0gKFVJbnQ2NCgwKSwgVUludDY0KDIpLCB5KQogICAgaW50Y18yIC8vIDAKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjYKICAgIC8vIHkgPSAoVUludDY0KDEpLCB4KQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyNAogICAgLy8geCA9IChTdHJpbmcoIkhpIiksIFN0cmluZygiVGhlcmUiKSkKICAgIGJ5dGVjXzEgLy8gIkhpIgogICAgYnl0ZWNfMyAvLyAiVGhlcmUiCiAgICBkdXAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozMwogICAgLy8gKGEsIGIsIChjLCBkLCAoZSwpKSkgPSB0ZXN0X3JlYXJyYW5nZSh4WzBdLCBfYj14WzFdLCBhcmdzPXopCiAgICBjYWxsc3ViIHRlc3RfcmVhcnJhbmdlCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzQKICAgIC8vIGFzc2VydCAoYSwgYikgPT0gKFN0cmluZygiSGkiKSwgVUludDY0KDApKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18xIC8vICJIaSIKICAgID09CiAgICB1bmNvdmVyIDQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNQogICAgLy8gYXNzZXJ0IChjLCBkKSA9PSAoVUludDY0KDIpLCBVSW50NjQoMSkpCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICA9PQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNgogICAgLy8gYXNzZXJ0IGUgPT0gU3RyaW5nKCJUaGVyZSIpCiAgICBieXRlY18zIC8vICJUaGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozOAogICAgLy8gdGVzdF9pbnRyaW5zaWNzKFVJbnQ2NCgxKSwgVUludDY0KDIpKQogICAgaW50Y18wIC8vIDEKICAgIGludGNfMSAvLyAyCiAgICBjYWxsc3ViIHRlc3RfaW50cmluc2ljcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQwCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249VHJ1ZSkKICAgIGludGNfMCAvLyAxCiAgICBkdXAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQxCiAgICAvLyB0ZXN0X25lc3RlZF9zaW5nbGVzKFVJbnQ2NCgxKSwgcmVhc3NpZ249RmFsc2UpCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18yIC8vIDAKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc2luZ2xlcwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQ2CiAgICAvLyB0ZXN0X25lc3RlZF9pdGVyYXRpb24oKQogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF9pdGVyYXRpb24KICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0OAogICAgLy8gc2VsZi50ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZCgpCiAgICBjYWxsc3ViIHRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NDkKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9zd2FwKGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdGVzdF9zd2FwOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkwLTkxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3Rfc3dhcChhcmdzOiB0dXBsZVtTdHJpbmcsIFN0cmluZ10pIC0+IHR1cGxlW1N0cmluZywgU3RyaW5nXToKICAgIHByb3RvIDIgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjkzCiAgICAvLyByZXR1cm4gYiwgYQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfcmVhcnJhbmdlKF9hOiBieXRlcywgYXJncy4wOiB1aW50NjQsIGFyZ3MuMTogdWludDY0LCBhcmdzLjIuMDogdWludDY0LCBhcmdzLjIuMS4wOiBieXRlcywgYXJncy4yLjEuMTogYnl0ZXMsIF9iOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NCwgdWludDY0LCB1aW50NjQsIGJ5dGVzOgp0ZXN0X3JlYXJyYW5nZToKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo4MS04NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3JlYXJyYW5nZSgKICAgIC8vICAgICBfYTogU3RyaW5nLCBhcmdzOiB0dXBsZVtVSW50NjQsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCB0dXBsZVtTdHJpbmcsIFN0cmluZ11dXSwgX2I6IFN0cmluZwogICAgLy8gKSAtPiB0dXBsZVtTdHJpbmcsIFVJbnQ2NCwgdHVwbGVbVUludDY0LCBVSW50NjQsIHR1cGxlW1N0cmluZ11dXToKICAgIHByb3RvIDcgNQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojg3CiAgICAvLyByZXR1cm4gZCwgYSwgKGIsIGMsIChlLCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9pbnRyaW5zaWNzKG51bTE6IHVpbnQ2NCwgbnVtMjogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2ludHJpbnNpY3M6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTYtOTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9pbnRyaW5zaWNzKG51bTE6IFVJbnQ2NCwgbnVtMjogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OTgKICAgIC8vIG50ID0gKFVJbnQ2NCgxKSwgb3AuYWRkdyhudW0xLCBudW0yKSwgVUludDY0KDQyKSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhZGR3CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAxCiAgICAvLyBhc3NlcnQgbnRbMV0gPT0gKDAsIG51bTEgKyBudW0yKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgIQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGR1cDIKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMDIKICAgIC8vIGFzc2VydCBudFsxXVs6MV0gPT0gKDAsKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTAzCiAgICAvLyBhc3NlcnQgbnRbMV1bMTpdID09IChudW0xICsgbnVtMiwpCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLnRlc3RfbmVzdGVkX3NpbmdsZXMob25lOiB1aW50NjQsIHJlYXNzaWduOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3NpbmdsZXM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTMxLTEzMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF9zaW5nbGVzKG9uZTogVUludDY0LCAqLCByZWFzc2lnbjogYm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEzNAogICAgLy8gKFVJbnQ2NCgwKSwpLAogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMzYKICAgIC8vIChVSW50NjQoMiksKSwKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQwCiAgICAvLyBhc3NlcnQgc1sxXVswXSA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDUKICAgIC8vIGlmIHJlYXNzaWduOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiB0ZXN0X25lc3RlZF9zaW5nbGVzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0NwogICAgLy8gKFVJbnQ2NCgzKSwpLAogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDYtMTUwCiAgICAvLyBzID0gKAogICAgLy8gICAgIChVSW50NjQoMyksKSwKICAgIC8vICAgICAoVUludDY0KDQpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg1KSwpLAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ4CiAgICAvLyAoVUludDY0KDQpLCksCiAgICBwdXNoaW50IDQgLy8gNAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE0Ni0xNTAKICAgIC8vIHMgPSAoCiAgICAvLyAgICAgKFVJbnQ2NCgzKSwpLAogICAgLy8gICAgIChVSW50NjQoNCksKSwKICAgIC8vICAgICAoVUludDY0KDUpLCksCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNDkKICAgIC8vIChVSW50NjQoNSksKSwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTQ2LTE1MAogICAgLy8gcyA9ICgKICAgIC8vICAgICAoVUludDY0KDMpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg0KSwpLAogICAgLy8gICAgIChVSW50NjQoNSksKSwKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMQoKdGVzdF9uZXN0ZWRfc2luZ2xlc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUxCiAgICAvLyBhc3NlcnQgc1swXVswXSA9PSAoMyBpZiByZWFzc2lnbiBlbHNlIDApCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyAzCiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8gYXNzZXJ0IHRtcCA9PSAoNSBpZiByZWFzc2lnbiBlbHNlIDIpCiAgICBpbnRjXzEgLy8gMgogICAgcHVzaGludCA1IC8vIDUKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIHMxICs9IG9uZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU4CiAgICAvLyBhc3NlcnQgczEgPT0gKDUgaWYgcmVhc3NpZ24gZWxzZSAyKQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1OQogICAgLy8gYXNzZXJ0IHNbMV1bMF0gPT0gKDQgaWYgcmVhc3NpZ24gZWxzZSAxKQogICAgaW50Y18wIC8vIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NS0xNzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uKCkgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc5CiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgaW50Y18yIC8vIDAKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4MwogICAgLy8gdG90YWwgKz0gYSArIGIKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dpdGNoIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzFAMyB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDQgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1CiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JANgoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUAzOgogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMkA0OgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0A1OgogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTgxCiAgICAvLyBmb3IgdCBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODEKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlAMQoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2FmdGVyX2ZvckA2OgogICAgaW50Y18yIC8vIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDc6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg2CiAgICAvLyB0b3RhbCArPSBhICsgYgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2l0Y2ggdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUA5IHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzJAMTAgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMQogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDEyCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8xQDk6CiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3OAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc3CiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUA3Cgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDEwOgogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzcKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE3NwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxODUKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlANwoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfM0AxMToKICAgIGludGNfMyAvLyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTc4CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE4NQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNzgKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg1CiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIHN3YXAKICAgIGIgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDcKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTg4CiAgICAvLyBhc3NlcnQgdG90YWwgLy8gOCA9PSAzCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIC8KICAgIGludGNfMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMudGVzdF9zaW5nbGVfZXZhbHVhdGlvbl9uZXN0ZWQoKSAtPiB2b2lkOgp0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZDoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3My03NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzUKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgaW50Y18yIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzYKICAgIC8vIHJlc3VsdCA9IHNlbGYuYnVpbGRfbmVzdGVkKCkgb3Igc2VsZi5idWlsZF9uZXN0ZWQoKQogICAgY2FsbHN1YiBidWlsZF9uZXN0ZWQKICAgIHBvcG4gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc3CiAgICAvLyBhc3NlcnQgcmVzdWx0WzBdWzBdID09ICJoaSIKICAgIGJ5dGVjIDUgLy8gImhpIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCA9PSAxCiAgICBpbnRjXzIgLy8gMAogICAgYnl0ZWNfMCAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLmJ1aWxkX25lc3RlZCgpIC0+IGJ5dGVzLCB1aW50NjQsIGJ5dGVzOgpidWlsZF9uZXN0ZWQ6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjgtNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYnVpbGRfbmVzdGVkKHNlbGYpIC0+IHR1cGxlW3R1cGxlW1N0cmluZywgVUludDY0XSwgQnl0ZXNdOgogICAgcHJvdG8gMCAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzAKICAgIC8vIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgKz0gMQogICAgaW50Y18yIC8vIDAKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3MQogICAgLy8gcmV0dXJuIChTdHJpbmcoImhpIiksIFVJbnQ2NCgxKSksIEJ5dGVzKGIiaG1tbSIpCiAgICBieXRlYyA1IC8vICJoaSIKICAgIGludGNfMCAvLyAxCiAgICBwdXNoYnl0ZXMgMHg2ODZkNmQ2ZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLm5lc3RlZF90dXBsZV9wYXJhbXMoYXJncy4wOiBieXRlcywgYXJncy4xLjA6IGJ5dGVzLCBhcmdzLjEuMS4wOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlcywgdWludDY0OgpuZXN0ZWRfdHVwbGVfcGFyYW1zOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjUxLTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5lc3RlZF90dXBsZV9wYXJhbXMoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbU3RyaW5nLCB0dXBsZVtCeXRlcywgdHVwbGVbVUludDY0XV1dCiAgICAvLyApIC0+IHR1cGxlW0J5dGVzLCB0dXBsZVtTdHJpbmcsIFVJbnQ2NF1dOgogICAgcHJvdG8gMyAzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTYKICAgIC8vIHJldHVybiBiLCAocywgdSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uYW1lZF90dXBsZShhcmdzLmE6IHVpbnQ2NCwgYXJncy5iOiBieXRlcywgYXJncy5jOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cm5hbWVkX3R1cGxlOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU4LTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIG5hbWVkX3R1cGxlKHNlbGYsIGFyZ3M6IENoaWxkKSAtPiBDaGlsZDoKICAgIHByb3RvIDMgMwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjYxCiAgICAvLyByZXR1cm4gQ2hpbGQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy5uZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKGFyZ3MuZm9vOiB1aW50NjQsIGFyZ3MuZm9vX2FyYzogYnl0ZXMsIGFyZ3MuY2hpbGQuYTogdWludDY0LCBhcmdzLmNoaWxkLmI6IGJ5dGVzLCBhcmdzLmNoaWxkLmM6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCB1aW50NjQsIGJ5dGVzLCBieXRlczoKbmVzdGVkX25hbWVkX3R1cGxlX3BhcmFtczoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBuZXN0ZWRfbmFtZWRfdHVwbGVfcGFyYW1zKHNlbGYsIGFyZ3M6IFBhcmVudCkgLT4gUGFyZW50OgogICAgcHJvdG8gNSA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjYKICAgIC8vIHJldHVybiBQYXJlbnQoZm9vLCBmb29fYXJjLCBDaGlsZChhLCBiLCBjKSkKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQIAAyYGF2J1aWxkX25lc3RlZF9jYWxsX2NvdW50AkhpBBUffHUFVGhlcmUCAAwCaGkxGEAAA4gABIgACEOKAAAoJGeJigABMRtBAaOCBASeWjunBM6gUhsENz9bJATsWTCWNhoAjgQAAgAZAJEA9iSJMRkURDEYRIgBgYABACRPAlQqTFCwIokxGRREMRhENhoBSSRZSwEjWUsCTwJLAlJXAgBLAhVPA08DTwJSSSRZSwEVSwJOAlJXAgBMVwIIVwAIF4gClEsCFRZXBgJPA1BLAhUWVwYCTwNQTwIWgAIACkxQTFBLARWBBAgWVwYCgAIABExQTwJQTFAqTFCwIokxGRREMRhENhoBSVcACBdLAYEIWUsCgQpZSwNPAksCUlcCAEsDFU8ETwNPAlJXAgCIAjFPAhZLAhUWVwYCTwNQSwIVFlcGAk8DUE8CJwRQSwIVgQwIFlcGAlBPAlBMUCpMULAiiTEZFEQxGEQ2GgFJVwAIF0sBVwgISwKBEFlLAxVPBE4CUklXAAgXSwGBCFlLAoEKWUsDTwJLAlJXAgBLAxVPBE8DTwJSVwIAiAG/TwQWTwMWSwMVFlcGAk8EUEsDFRZXBgJPBFBPAicEUEsCFYEMCBZXBgJQTwJQTFBMTwJQgAIAElBMUCpMULAiiTEZQAAGMRgURCKJJImKAAEpK4gAP0wrEkwpEhBEKSQjIikrSYgANU8EKRJPBBQQRE8CIxJPAiISEEQrEkQiI4gAKCJJiAA8IiSIADeIAHeIAOwiiYoCAov/i/6JigcFi/2L+ov7i/yL/omKAgCL/ov/HkwUi/6L/whPAhJKEERMRESJigIAJCOL/iISRIv+i/9BAAsljACBBIwCgQWMAYv/JQuLABJEI4EFi/9NiwFLARJEiwJJTgKL/ggSRCKBBIv/TRJEiYoAAIAAJCIjJIsCTwIIiwEIjAGNAwADAAwAFUIAGyIjjAIiTEL/4iMijAIiTEL/2SUjjAIjTEL/0CQijAAjTIsATwIIiwEIjAGNAwADAAwAFUIAGyIjjAAiTEL/4iMijAAiTEL/2SUjjAAjTEL/0IsBgQgKJRJEiYoAACgkZ4gADkYCJwUSRCQoZUQiEkSJigADJChlRCIIKExnJwUigARobW1tiYoDA4v+i/2L/4mKAwOL/Yv+i/+JigUFi/uL/Iv9i/6L/4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/tuple_support/out/NestedTuples.destructured.ir b/test_cases/tuple_support/out/NestedTuples.destructured.ir index b81f44d643..f0636b0ee2 100644 --- a/test_cases/tuple_support/out/NestedTuples.destructured.ir +++ b/test_cases/tuple_support/out/NestedTuples.destructured.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.ir b/test_cases/tuple_support/out/NestedTuples.ssa.ir index 2f84b6df56..1b76b01d2a 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.ir @@ -27,10 +27,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -39,10 +39,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -97,10 +97,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = (extract3 tmp%18#0 0u 8u) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -143,10 +143,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (== tmp%20#0 NoOp) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) let tmp%23#0: bool = (!= tmp%22#0 0u) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = (extract3 tmp%24#0 0u 8u) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -213,7 +213,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (== tmp%27#0 0u) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating test_cases.tuple_support.nested_tuples.NestedTuples.__algopy_default_create() return 1u block@10: // switch_case_default_L18 diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_1.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_1.ir index dfc49ffe6e..4a9e3f83f6 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_1.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_1.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -83,9 +83,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -122,9 +122,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -176,7 +176,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_10.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_10.ir index 5cb7b87ccb..922996dc73 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_10.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_10.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_11.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_11.ir index c3ded45c2d..128036f4b4 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_11.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_11.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_12.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_12.ir index e228ee1c48..6eab615d2d 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_12.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_12.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_2.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_2.ir index c0d262c2ce..e846947a03 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_2.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_2.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_3.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_3.ir index af8bb1be69..ee80750aca 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_3.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_3.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_4.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_4.ir index 6c9e9a1522..d2e0ad821d 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_4.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_4.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_5.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_5.ir index 875a80080d..7c8b1fa483 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_5.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_5.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_6.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_6.ir index 65c6072f42..ff88031a63 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_6.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_6.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_7.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_7.ir index 20cfd336ff..890230f528 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_7.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_7.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_8.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_8.ir index 0d45768b77..d10d211022 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_8.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_8.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_9.ir b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_9.ir index 4b75664ec4..031ec95baf 100644 --- a/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_9.ir +++ b/test_cases/tuple_support/out/NestedTuples.ssa.opt_pass_9.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out/client_NestedTuples.py b/test_cases/tuple_support/out/client_NestedTuples.py index 6f8f9c9a3b..966fcffedf 100644 --- a/test_cases/tuple_support/out/client_NestedTuples.py +++ b/test_cases/tuple_support/out/client_NestedTuples.py @@ -9,10 +9,11 @@ class Child(algopy.arc4.Struct): a: algopy.arc4.UIntN[typing.Literal[64]] b: algopy.arc4.DynamicBytes c: algopy.arc4.String + class Parent(algopy.arc4.Struct): foo: algopy.arc4.UIntN[typing.Literal[64]] foo_arc: algopy.arc4.UIntN[typing.Literal[64]] - child: algopy.arc4.Tuple[algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.DynamicBytes, algopy.arc4.String] + child: Child class NestedTuples(algopy.arc4.ARC4Client, typing.Protocol): @algopy.arc4.abimethod diff --git a/test_cases/tuple_support/out_O2/NestedTuples.approval.teal b/test_cases/tuple_support/out_O2/NestedTuples.approval.teal index 7ffc86a40d..781196e441 100644 --- a/test_cases/tuple_support/out_O2/NestedTuples.approval.teal +++ b/test_cases/tuple_support/out_O2/NestedTuples.approval.teal @@ -35,9 +35,9 @@ __puya_arc4_router__: __puya_arc4_router___run_tests_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub run_tests pushbytes 0x00 intc_2 // 0 @@ -53,9 +53,9 @@ __puya_arc4_router___run_tests_route@2: __puya_arc4_router___nested_tuple_params_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup intc_2 // 0 @@ -129,9 +129,9 @@ __puya_arc4_router___nested_tuple_params_route@3: __puya_arc4_router___named_tuple_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -193,9 +193,9 @@ __puya_arc4_router___named_tuple_route@4: __puya_arc4_router___nested_named_tuple_params_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -281,7 +281,7 @@ __puya_arc4_router___bare_routing@8: bnz __puya_arc4_router___after_if_else@12 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/tuple_support/out_O2/NestedTuples.destructured.ir b/test_cases/tuple_support/out_O2/NestedTuples.destructured.ir index b81f44d643..f0636b0ee2 100644 --- a/test_cases/tuple_support/out_O2/NestedTuples.destructured.ir +++ b/test_cases/tuple_support/out_O2/NestedTuples.destructured.ir @@ -26,9 +26,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -37,9 +37,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (! tmp%8#0) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -79,9 +79,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%18#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -116,9 +116,9 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (! tmp%20#0) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) - (assert tmp%22#0) // is not creating + (assert tmp%22#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = ((extract 0 8) tmp%24#0) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -166,7 +166,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (! tmp%27#0) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating return 1u block@12: // after_if_else_L18 return 0u diff --git a/test_cases/tuple_support/out_unoptimized/NestedTuples.approval.teal b/test_cases/tuple_support/out_unoptimized/NestedTuples.approval.teal index c2cb6fbc5c..7e54d37ff9 100644 --- a/test_cases/tuple_support/out_unoptimized/NestedTuples.approval.teal +++ b/test_cases/tuple_support/out_unoptimized/NestedTuples.approval.teal @@ -49,11 +49,11 @@ __puya_arc4_router___run_tests_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub run_tests pushbytes 0x00 intc_0 // 0 @@ -72,11 +72,11 @@ __puya_arc4_router___nested_tuple_params_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -186,11 +186,11 @@ __puya_arc4_router___named_tuple_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -279,11 +279,11 @@ __puya_arc4_router___nested_named_tuple_params_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // tuple_support/nested_tuples.py:18 // class NestedTuples(ARC4Contract): txna ApplicationArgs 1 @@ -420,7 +420,7 @@ __puya_arc4_router_____algopy_default_create@9: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/tuple_support/out_unoptimized/NestedTuples.destructured.ir b/test_cases/tuple_support/out_unoptimized/NestedTuples.destructured.ir index 10c4b846e4..81d2a88a3a 100644 --- a/test_cases/tuple_support/out_unoptimized/NestedTuples.destructured.ir +++ b/test_cases/tuple_support/out_unoptimized/NestedTuples.destructured.ir @@ -27,10 +27,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@2: // run_tests_route_L22 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let to_encode%0#0: bool = test_cases.tuple_support.nested_tuples.NestedTuples.run_tests() let encoded_bool%0#0: bytes = (setbit 0x00 0u to_encode%0#0) let tmp%7#0: bytes = (concat 0x151f7c75 encoded_bool%0#0) @@ -39,10 +39,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@3: // nested_tuple_params_route_L51 let tmp%8#0: uint64 = (txn OnCompletion) let tmp%9#0: bool = (== tmp%8#0 NoOp) - (assert tmp%9#0) // OnCompletion is NoOp + (assert tmp%9#0) // OnCompletion is not NoOp let tmp%10#0: uint64 = (txn ApplicationID) let tmp%11#0: bool = (!= tmp%10#0 0u) - (assert tmp%11#0) // is not creating + (assert tmp%11#0) // can only call when not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%12#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%12#0 2u) @@ -89,10 +89,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@4: // named_tuple_route_L58 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = (extract3 tmp%18#0 0u 8u) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -131,10 +131,10 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@5: // nested_named_tuple_params_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) let tmp%21#0: bool = (== tmp%20#0 NoOp) - (assert tmp%21#0) // OnCompletion is NoOp + (assert tmp%21#0) // OnCompletion is not NoOp let tmp%22#0: uint64 = (txn ApplicationID) let tmp%23#0: bool = (!= tmp%22#0 0u) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%24#0: bytes = (txna ApplicationArgs 1) let item0%4#0: bytes = (extract3 tmp%24#0 0u 8u) // on error: Index access is out of bounds let item0%4%0#0: uint64 = (btoi item0%4#0) @@ -193,7 +193,7 @@ contract test_cases.tuple_support.nested_tuples.NestedTuples: block@9: // __algopy_default_create_L1 let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (== tmp%27#0 0u) - (assert tmp%28#0) // is creating + (assert tmp%28#0) // can only call when creating test_cases.tuple_support.nested_tuples.NestedTuples.__algopy_default_create() return 1u block@10: // switch_case_default_L18 diff --git a/test_cases/tuple_support/puya.log b/test_cases/tuple_support/puya.log index 106ef8ecb3..07f6db9cea 100644 --- a/test_cases/tuple_support/puya.log +++ b/test_cases/tuple_support/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tuple_support'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tuple_support'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing tuple_support/out/module.awst debug: Sealing block@0: // L12 @@ -6305,6 +6305,7 @@ info: Writing tuple_support/out/TupleComparisons.clear.bin info: Writing tuple_support/out/TupleComparisons.approval.puya.map info: Writing tuple_support/out/TupleComparisons.clear.puya.map info: Writing tuple_support/out/NestedTuples.arc32.json +info: Writing tuple_support/out/NestedTuples.arc56.json info: Writing tuple_support/out/NestedTuples.approval.teal info: Writing tuple_support/out/NestedTuples.clear.teal info: Writing tuple_support/out/NestedTuples.approval.bin diff --git a/test_cases/typed_abi_call/out/Greeter.approval.mir b/test_cases/typed_abi_call/out/Greeter.approval.mir index f46f488922..eaa1a40c39 100644 --- a/test_cases/typed_abi_call/out/Greeter.approval.mir +++ b/test_cases/typed_abi_call/out/Greeter.approval.mir @@ -48,9 +48,9 @@ __puya_arc4_router___test_is_a_b_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -74,9 +74,9 @@ __puya_arc4_router___test_method_selector_kinds_route@3: // @arc4.abimethod() txn OnCompletion tmp%14#0 ! tmp%15#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%16#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%18#0 @@ -93,9 +93,9 @@ __puya_arc4_router___test_method_overload_route@4: // @arc4.abimethod() txn OnCompletion tmp%21#0 ! tmp%22#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%23#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%25#0 @@ -112,9 +112,9 @@ __puya_arc4_router___test_arg_conversion_route@5: // @arc4.abimethod() txn OnCompletion tmp%28#0 ! tmp%29#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%30#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%32#0 @@ -131,9 +131,9 @@ __puya_arc4_router___test_15plus_args_route@6: // @arc4.abimethod() txn OnCompletion tmp%35#0 ! tmp%36#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%37#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%39#0 @@ -150,9 +150,9 @@ __puya_arc4_router___test_void_route@7: // @arc4.abimethod() txn OnCompletion tmp%42#0 ! tmp%43#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%44#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%46#0 @@ -169,9 +169,9 @@ __puya_arc4_router___test_ref_types_route@8: // @arc4.abimethod() txn OnCompletion tmp%49#0 ! tmp%50#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%51#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%53#0 @@ -193,9 +193,9 @@ __puya_arc4_router___test_native_string_route@9: // @arc4.abimethod() txn OnCompletion tmp%59#0 ! tmp%60#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%61#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%63#0 @@ -212,9 +212,9 @@ __puya_arc4_router___test_native_bytes_route@10: // @arc4.abimethod() txn OnCompletion tmp%66#0 ! tmp%67#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%68#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%70#0 @@ -231,9 +231,9 @@ __puya_arc4_router___test_native_uint64_route@11: // @arc4.abimethod() txn OnCompletion tmp%73#0 ! tmp%74#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%75#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%77#0 @@ -250,9 +250,9 @@ __puya_arc4_router___test_native_biguint_route@12: // @arc4.abimethod() txn OnCompletion tmp%80#0 ! tmp%81#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%82#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%84#0 @@ -269,9 +269,9 @@ __puya_arc4_router___test_native_tuple_route@13: // @arc4.abimethod() txn OnCompletion tmp%87#0 ! tmp%88#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%89#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%91#0 @@ -288,9 +288,9 @@ __puya_arc4_router___test_native_tuple_method_ref_route@14: // @arc4.abimethod() txn OnCompletion tmp%94#0 ! tmp%95#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%96#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%98#0 @@ -307,9 +307,9 @@ __puya_arc4_router___test_nested_tuples_route@15: // @arc4.abimethod() txn OnCompletion tmp%101#0 ! tmp%102#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%103#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%105#0 @@ -326,9 +326,9 @@ __puya_arc4_router___test_no_args_route@16: // @arc4.abimethod() txn OnCompletion tmp%108#0 ! tmp%109#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%110#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%112#0 @@ -345,9 +345,9 @@ __puya_arc4_router___test_named_tuples_route@17: // @arc4.abimethod() txn OnCompletion tmp%115#0 ! tmp%116#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%117#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 tmp%119#0 @@ -369,7 +369,7 @@ __puya_arc4_router___bare_routing@20: __puya_arc4_router_____algopy_default_create@21: txn ApplicationID tmp%123#0 ! tmp%124#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/typed_abi_call/out/Greeter.approval.teal b/test_cases/typed_abi_call/out/Greeter.approval.teal index 9ecb582285..39af4e5b9d 100644 --- a/test_cases/typed_abi_call/out/Greeter.approval.teal +++ b/test_cases/typed_abi_call/out/Greeter.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_is_a_b_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -48,9 +48,9 @@ __puya_arc4_router___test_method_selector_kinds_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -67,9 +67,9 @@ __puya_arc4_router___test_method_overload_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -86,9 +86,9 @@ __puya_arc4_router___test_arg_conversion_route@5: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -105,9 +105,9 @@ __puya_arc4_router___test_15plus_args_route@6: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -124,9 +124,9 @@ __puya_arc4_router___test_void_route@7: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -143,9 +143,9 @@ __puya_arc4_router___test_ref_types_route@8: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -165,9 +165,9 @@ __puya_arc4_router___test_native_string_route@9: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -184,9 +184,9 @@ __puya_arc4_router___test_native_bytes_route@10: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -203,9 +203,9 @@ __puya_arc4_router___test_native_uint64_route@11: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -222,9 +222,9 @@ __puya_arc4_router___test_native_biguint_route@12: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -241,9 +241,9 @@ __puya_arc4_router___test_native_tuple_route@13: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -260,9 +260,9 @@ __puya_arc4_router___test_native_tuple_method_ref_route@14: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -279,9 +279,9 @@ __puya_arc4_router___test_nested_tuples_route@15: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -298,9 +298,9 @@ __puya_arc4_router___test_no_args_route@16: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -317,9 +317,9 @@ __puya_arc4_router___test_named_tuples_route@17: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -338,7 +338,7 @@ __puya_arc4_router___bare_routing@20: bnz __puya_arc4_router___after_if_else@24 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_2 // 1 retsub diff --git a/test_cases/typed_abi_call/out/Greeter.arc32.json b/test_cases/typed_abi_call/out/Greeter.arc32.json index f7d3e929ce..fa3eba2e48 100644 --- a/test_cases/typed_abi_call/out/Greeter.arc32.json +++ b/test_cases/typed_abi_call/out/Greeter.arc32.json @@ -82,7 +82,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCA2IDEgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgMHg5YmY4MTkxMyAweDAwMDAwMDAwMDAwMDAwMDEgMHgxNmUwMzkxOSAweDAwMDI3MzMxIDB4MDAwMjYyMzEgMHhiNGI0MzM0ZSAiZWNobzogczEiIDB4MDAwMDAwMDAwMDAwMDAwMyAweDRhNDQ0Yzc3IDB4MDAwMTczIDB4MjY1OWU4MTggMHgwMDAxNjIgMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MDMgMHhhYjI3MWNlNCAweGI4NjJlZTE5IDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMSAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1IDB4MDAwMDAwMDAwMDAwMDAwMiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzIDB4MGYxMDExMTJkZWFkYmVlZjE0IDB4NjU2MzY4NmYzYTIwNjIzMSAweDAwMDQwMDEwMDAwNDAwMDgwMDAyNzMzMTAwMDI3MzMyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDEyMDAwMTMzIDB4MDAwODY1NjM2ODZmM2EyMDczMzIgMHg2NTYzNjg2ZjNhMjAzMyAweDAwMDAwMDAwMDAwMDAwMmEgMHhkZGQwNzE4NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMAogICAgcHVzaGJ5dGVzcyAweDA3OTE2YmVhIDB4MTg1OWIwYmEgMHg0ZWIxMWIwZCAweDBkMTc2YTRhIDB4YjU0NzMwYzggMHg3ODU5ZWFmNyAweDI0NDc4YTNjIDB4N2E2MGMwMzUgMHg2YTU1OWNiMyAweDFiZTYwNzEyIDB4MTljYjc4YTQgMHhmMGVmNjg3MyAweDNkMmJmZTM3IDB4NTRlOThmNTYgMHhmNTViNzU2NyAweDg1OThiYjQzIC8vIG1ldGhvZCAidGVzdF9pc19hX2IoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9vdmVybG9hZChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyZ19jb252ZXJzaW9uKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfMTVwbHVzX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF92b2lkKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmX3R5cGVzKGFwcGxpY2F0aW9uLGFzc2V0KXZvaWQiLCBtZXRob2QgInRlc3RfbmF0aXZlX3N0cmluZyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV9ieXRlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV91aW50NjQoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfYmlndWludChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25vX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYW1lZF90dXBsZXMoYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHNfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21ldGhvZF9vdmVybG9hZF9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJnX2NvbnZlcnNpb25fcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0XzE1cGx1c19hcmdzX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yZWZfdHlwZXNfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9zdHJpbmdfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9ieXRlc19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV91aW50NjRfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYmlndWludF9yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmX3JvdXRlQDE0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlc19yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25vX2FyZ3Nfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTcKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9pc19hX2IKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWV0aG9kX3NlbGVjdG9yX2tpbmRzX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfb3ZlcmxvYWRfcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbWV0aG9kX292ZXJsb2FkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyZ19jb252ZXJzaW9uX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2FyZ19jb252ZXJzaW9uCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0XzE1cGx1c19hcmdzX3JvdXRlQDY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0XzE1cGx1c19hcmdzCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3ZvaWRfcm91dGVANzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF92b2lkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JlZl90eXBlc19yb3V0ZUA4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfcmVmX3R5cGVzCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9zdHJpbmdfcm91dGVAOToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfc3RyaW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9ieXRlc19yb3V0ZUAxMDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYnl0ZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3VpbnQ2NF9yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9iaWd1aW50X3JvdXRlQDEyOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X25hdGl2ZV9iaWd1aW50CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9yb3V0ZUAxMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdHVwbGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWZfcm91dGVAMTQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWYKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlc19yb3V0ZUAxNToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfdHVwbGVzCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25vX2FyZ3Nfcm91dGVAMTY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3Rfbm9fYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmFtZWRfdHVwbGVzCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMjA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X2lzX2FfYihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2lzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOC0xOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9pc19hX2Ioc2VsZiwgYTogQnl0ZXMsIGI6IEJ5dGVzLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjAtMjUKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzCiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMC0yNQogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjNzcyMTJiYyAvLyBtZXRob2QgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvLCBhcmM0LlN0cmluZygidGVzdDEiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0MSIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyQ2xpZW50LmVjaG8sICJ0ZXN0MiIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDIiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyIsICJ0ZXN0MyIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDMiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM1CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyhzdHJpbmcpIiwgInRlc3Q0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDM0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM2CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0NCIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDM0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzcKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidGVzdDUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NjU3Mzc0MzUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImVjaG86IHRlc3Q1IgogICAgcHVzaGJ5dGVzIDB4MDAwYjY1NjM2ODZmM2EyMDc0NjU3Mzc0MzUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9tZXRob2Rfb3ZlcmxvYWQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbWV0aG9kX292ZXJsb2FkOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWV0aG9kX292ZXJsb2FkKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MgogICAgLy8gYXJjNC5hYmlfY2FsbFthcmM0LlN0cmluZ10oImVjaG8oc3RyaW5nKXN0cmluZyIsICJ0eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDBlNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gImVjaG86IHR5cGVkICsgaWdub3JlIgogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBwdXNoYnl0ZXMgMHgwMDE0NjU2MzY4NmYzYTIwNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ1CiAgICAvLyBhcmM0LmFiaV9jYWxsKCJlY2hvKHN0cmluZylzdHJpbmciLCAidW50eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDEwNzU2ZTc0Nzk3MDY1NjQyMDJiMjA2OTY3NmU2ZjcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ2CiAgICAvLyBhc3NlcnQgYXJjNC5TdHJpbmcuZnJvbV9sb2cob3AuSVR4bi5sYXN0X2xvZygpKSA9PSAiZWNobzogdW50eXBlZCArIGlnbm9yZSIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAxNjY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0MjAyYjIwNjk2NzZlNmY3MjY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDgKICAgIC8vIHJlc3VsdCA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidHVwbGUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NzU3MDZjNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0OQogICAgLy8gYXNzZXJ0IHJlc3VsdFswXSA9PSAiZWNobzogdHVwbGUiCiAgICBzd2FwCiAgICBieXRlYyAyMCAvLyAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTAKICAgIC8vIGFzc2VydCBhcmM0LlN0cmluZy5mcm9tX2xvZyhyZXN1bHRbMV0ubGFzdF9sb2cpID09ICJlY2hvOiB0dXBsZSIKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ5dGVjIDIwIC8vIDB4MDAwYjY1NjM2ODZmM2EyMDc0NzU3MDZjNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MgogICAgLy8gdHhuX3Jlc3VsdCA9IGFyYzQuYWJpX2NhbGwoImVjaG8oc3RyaW5nKXN0cmluZyIsICJ1bnR5cGVkIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDc3NTZlNzQ3OTcwNjU2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKHR4bl9yZXN1bHQubGFzdF9sb2cpID09ICJlY2hvOiB1bnR5cGVkIgogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAwZDY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfYXJnX2NvbnZlcnNpb24oYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfYXJnX2NvbnZlcnNpb246CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUtNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmdfY29udmVyc2lvbihzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTcKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJjb252ZXJ0ZWQxIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMGE2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1OAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiImNvbnZlcnRlZDEiCiAgICBwdXNoYnl0ZXMgMHg2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYwCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDY0LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDNjMTA1OGQ5IC8vIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDIxIC8vIDB4MDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2MQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBvcC5pdG9iKDIpCiAgICBpbnRjXzMgLy8gMgogICAgaXRvYgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYzCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDUxMiwgMywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2YWY0NTkzMCAvLyBtZXRob2QgImxvZyh1aW50NTEyKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMjIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSAob3AuYnplcm8oNTYpICsgb3AuaXRvYigzKSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubG9nX2J5dGVzLCBiIjQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGI1MDBlMTExIC8vIG1ldGhvZCAibG9nKGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDEzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIjQiCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY5CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfYm9vbCwgVHJ1ZSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2ZWVkN2VjMyAvLyBtZXRob2QgImxvZyhib29sKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzAKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJUcnVlIgogICAgcHVzaGJ5dGVzIDB4NTQ3Mjc1NjUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF8xNXBsdXNfYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF8xNXBsdXNfYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3Mi03MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0XzE1cGx1c19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NC05NwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5yZXR1cm5fYXJnc19hZnRlcl8xNHRoLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICAzLAogICAgLy8gICAgIDQsCiAgICAvLyAgICAgNSwKICAgIC8vICAgICA2LAogICAgLy8gICAgIDcsCiAgICAvLyAgICAgOCwKICAgIC8vICAgICA5LAogICAgLy8gICAgIDEwLAogICAgLy8gICAgIDExLAogICAgLy8gICAgIDEyLAogICAgLy8gICAgIDEzLAogICAgLy8gICAgIDE0LAogICAgLy8gICAgIDE1LAogICAgLy8gICAgIDE2LAogICAgLy8gICAgIDE3LAogICAgLy8gICAgIDE4LAogICAgLy8gICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vICAgICAyMCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGJhMGI0MzgxIC8vIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NgogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc3CiAgICAvLyAyLAogICAgYnl0ZWMgMjEgLy8gMHgwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc4CiAgICAvLyAzLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzkKICAgIC8vIDQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgwCiAgICAvLyA1LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4MQogICAgLy8gNiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODIKICAgIC8vIDcsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgzCiAgICAvLyA4LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NAogICAgLy8gOSwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODUKICAgIC8vIDEwLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NgogICAgLy8gMTEsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg3CiAgICAvLyAxMiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODgKICAgIC8vIDEzLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwZAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4OQogICAgLy8gMTQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBlCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjkwLTk1CiAgICAvLyAxNSwKICAgIC8vIDE2LAogICAgLy8gMTcsCiAgICAvLyAxOCwKICAgIC8vIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vIDIwLAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzQtOTcKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIucmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgMywKICAgIC8vICAgICA0LAogICAgLy8gICAgIDUsCiAgICAvLyAgICAgNiwKICAgIC8vICAgICA3LAogICAgLy8gICAgIDgsCiAgICAvLyAgICAgOSwKICAgIC8vICAgICAxMCwKICAgIC8vICAgICAxMSwKICAgIC8vICAgICAxMiwKICAgIC8vICAgICAxMywKICAgIC8vICAgICAxNCwKICAgIC8vICAgICAxNSwKICAgIC8vICAgICAxNiwKICAgIC8vICAgICAxNywKICAgIC8vICAgICAxOCwKICAgIC8vICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ4KDB4REUpLCBhcmM0LlVJbnQ4KDB4QUQpLCBhcmM0LlVJbnQ4KDB4QkUpLCBhcmM0LlVJbnQ4KDB4RUYpKSksCiAgICAvLyAgICAgMjAsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo5OAogICAgLy8gYXNzZXJ0IHJlc3VsdC5uYXRpdmUgPT0gQnl0ZXMuZnJvbV9oZXgoIjBGMTAxMTEyREVBREJFRUYxNCIpCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF92b2lkKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X3ZvaWQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwLTEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3ZvaWQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZyl2b2lkIiwgIldvcmxkMSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImxvZyhzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA2NTc2ZjcyNmM2NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIldvcmxkMSIKICAgIHB1c2hieXRlcyAweDU3NmY3MjZjNjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwNQogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZykiLCAiV29ybGQyIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDY1NzZmNzI2YzY0MzIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA2CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiV29ybGQyIgogICAgcHVzaGJ5dGVzIDB4NTc2ZjcyNmM2NDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA4CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExPR19NRVRIT0RfTkFNRSwgYXJjNC5TdHJpbmcoIldvcmxkMyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDkKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDMiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTEKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJXb3JsZDQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTIKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDQiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9yZWZfdHlwZXMoYXBwOiB1aW50NjQsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfcmVmX3R5cGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNC0xMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9yZWZfdHlwZXMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25zCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjZDcyN2I3MSAvLyBtZXRob2QgImxvZyhhc3NldCxhY2NvdW50LGFwcGxpY2F0aW9uKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExOAogICAgLy8gYXNzZXQsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTkKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjAKICAgIC8vIGFwcCwKICAgIHB1c2hieXRlcyAweDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNi0xMjIKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcCwKICAgIC8vICAgICBhc3NldCwKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFwcCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyNQogICAgLy8gPT0gYXNzZXQubmFtZSArIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMgKyBhcHAuYWRkcmVzcy5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjQtMTI1CiAgICAvLyB0eG4ubGFzdF9sb2cKICAgIC8vID09IGFzc2V0Lm5hbWUgKyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJ5dGVzICsgYXBwLmFkZHJlc3MuYnl0ZXMKICAgID09CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTIzLTEyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0eG4ubGFzdF9sb2cKICAgIC8vICAgICA9PSBhc3NldC5uYW1lICsgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcyArIGFwcC5hZGRyZXNzLmJ5dGVzCiAgICAvLyApCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfc3RyaW5nKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9zdHJpbmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTI4LTEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9zdHJpbmcoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMAogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3N0cmluZywgInMiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMQogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gImVjaG86IHMiCiAgICBkdXAKICAgIHB1c2hieXRlcyAiZWNobzogcyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzMKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIFN0cmluZygicyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzNAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzYKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIGFyYzQuU3RyaW5nKCJzIiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDAwMDE3MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM3CiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2J5dGVzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzktMTQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX2J5dGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDEKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYiJiIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0MgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gYiJlY2hvOiBiIgogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjA2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBCeXRlcyhiImIiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDctMTQ5CiAgICAvLyByZXN1bHQzLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfYnl0ZXMsIGFyYzQuRHluYW1pY0J5dGVzKGIiYiIpLCBhcHBfaWQ9YXBwCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTIgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9ieXRlcyhieXRlW10pYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDgKICAgIC8vIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIGJ5dGVjIDEzIC8vIDB4MDAwMTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0Ny0xNDkKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUwCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX3VpbnQ2NChhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdWludDY0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1Mi0xNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uYXRpdmVfdWludDY0KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTQKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIDEsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTUKICAgIC8vIGFzc2VydCByZXN1bHQxID09IDIKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTcKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIFVJbnQ2NCgxKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1OAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjAKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIGFyYzQuVUludDY0KDEpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdWludDY0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYxCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2JpZ3VpbnQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmF0aXZlX2JpZ3VpbnQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzLTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9iaWd1aW50KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjUKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfYmlndWludCh1aW50NTEyKXVpbnQ1MTIiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2NgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gMwogICAgZHVwCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2OAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQsIEJpZ1VJbnQoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTY5CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzEKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCBhcmM0LlVJbnQ1MTIoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcyCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hdGl2ZV90dXBsZShhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV90dXBsZShzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc2LTE4NgogICAgLy8gIyBweXRob24gbGl0ZXJhbHMKICAgIC8vIHJlc3VsdDEsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgInMxIiwKICAgIC8vICAgICBiImIxIiwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MQogICAgLy8gInMxIiwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxODIKICAgIC8vIGIiYjEiLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MwogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NAogICAgLy8gMiwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzYtMTg2CiAgICAvLyAjIHB5dGhvbiBsaXRlcmFscwogICAgLy8gcmVzdWx0MSwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NwogICAgLy8gcywgYiwgdSwgYnUgPSByZXN1bHQxLm5hdGl2ZQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4OAogICAgLy8gYXNzZXJ0IHMubmF0aXZlID09ICJlY2hvOiBzMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZWNobzogczEiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg5CiAgICAvLyBhc3NlcnQgYi5uYXRpdmUgPT0gYiJlY2hvOiBiMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgMjQgLy8gMHg2NTYzNjg2ZjNhMjA2MjMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkwCiAgICAvLyBhc3NlcnQgdS5uYXRpdmUgPT0gMgogICAgdW5jb3ZlciAzCiAgICBidG9pCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkxCiAgICAvLyBhc3NlcnQgYnUubmF0aXZlID09IDMKICAgIGRpZyAzCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDAKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk4CiAgICAvLyBTdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk5CiAgICAvLyBCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwMQogICAgLy8gQmlnVUludCgyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTMtMjAzCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MiwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBTdHJpbmcoInMxIiksCiAgICAvLyAgICAgQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIFVJbnQ2NCgxKSwKICAgIC8vICAgICBCaWdVSW50KDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjA0CiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSByZXN1bHQyCiAgICBkaWcgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwNi0yMTYKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBhcmM0IHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MywgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTEKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTQKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDYtMjE2CiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgYXJjNCB0eXBlcyBpbiBhcmd1bWVudHMKICAgIC8vIHJlc3VsdDMsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxNwogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gcmVzdWx0MwogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjE5LTIyNwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSByZXN1bHQgdHlwZQogICAgLy8gcmVzdWx0X25hdGl2ZSwgdHhuID0gYXJjNC5hYmlfY2FsbFt0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyMgogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjIzCiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI0CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyNQogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxOS0yMjcKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI4CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMF0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMF0KICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI5CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMV0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMV0KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMl0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMl0KICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzEKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVszXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVszXQogICAgYj09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZihhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzMtMjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWYoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM4CiAgICAvLyAiczEiLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzOQogICAgLy8gYiJiMSIsCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQwCiAgICAvLyAxLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQxCiAgICAvLyAyLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NQogICAgLy8gYXNzZXJ0IHMgPT0gImVjaG86IHMxIgogICAgZGlnIDMKICAgIGJ5dGVjIDggLy8gImVjaG86IHMxIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NgogICAgLy8gYXNzZXJ0IGIgPT0gYiJlY2hvOiBiMSIKICAgIGRpZyAyCiAgICBieXRlYyAyNCAvLyAweDY1NjM2ODZmM2EyMDYyMzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNDcKICAgIC8vIGFzc2VydCB1ID09IDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0OAogICAgLy8gYXNzZXJ0IGJ1ID09IDMKICAgIGR1cAogICAgYnl0ZWMgMTYgLy8gMHgwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTAtMjU4CiAgICAvLyAjIHRlc3Qgd2l0aCBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0XzIsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTUKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTMKICAgIC8vIFN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTQKICAgIC8vIEJ5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjU2CiAgICAvLyBCaWdVSW50KDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1OQogICAgLy8gYXNzZXJ0IHJlc3VsdF8yID09IHJlc3VsdCwgImV4cGVjdGVkIG5hdGl2ZSBhcmd1bWVudHMgdG8gZ2l2ZSB0aGUgc2FtZSByZXN1bHQiCiAgICB1bmNvdmVyIDMKICAgIGRpZyA3CiAgICA9PQogICAgdW5jb3ZlciAzCiAgICBkaWcgNgogICAgPT0KICAgICYmCiAgICB1bmNvdmVyIDIKICAgIGRpZyA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIGRpZyAyCiAgICBiPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbmF0aXZlIGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NAogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY1CiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY2CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NwogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAxMiA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzAKICAgIC8vIGFzc2VydCByZXN1bHRfMyA9PSByZXN1bHQsICJleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdCIKICAgIHVuY292ZXIgMwogICAgZGlnIDcKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGRpZyA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZGlnIDQKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZGlnIDIKICAgIGI9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3Mi0yODAKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzUKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzgKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzItMjgwCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHJlc3VsdCB0eXBlCiAgICAvLyByZXN1bHRfbmF0aXZlLCB0eG4gPSBhcmM0LmFiaV9jYWxsW3R1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF1dKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MQogICAgLy8gYXNzZXJ0IHJlc3VsdF9uYXRpdmUgPT0gcmVzdWx0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNwogICAgPT0KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYj09CiAgICAmJgogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmVzdGVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfdHVwbGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4My0yODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODUtMjkwCiAgICAvLyAjIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKCJzMSIsICJzMiIpLCAoMSwgMiwgYiIzIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4OAogICAgLy8gKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjg1LTI5MAogICAgLy8gIyBsaXRlcmFsIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjkyCiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTMKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTQKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk1CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk2CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5OC0zMDMKICAgIC8vICMgbmF0aXZlIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKChTdHJpbmcoInMxIiksIGFyYzQuU3RyaW5nKCJzMiIpKSwgKFVJbnQ2NCgxKSwgYXJjNC5VSW50NjQoMiksIEJ5dGVzKGIiMyIpKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNyAvLyBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzAxCiAgICAvLyAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk4LTMwMwogICAgLy8gIyBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA1CiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDYKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDcKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA4CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA5CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxNC0zMTkKICAgIC8vIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlN0cmluZygiczFiIiksIGFyYzQuU3RyaW5nKCJzMmIiKSkpLAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgKQogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDAwMDQwMDEyMDAwNDAwMDkwMDAzNzMzMTYyMDAwMzczMzI2MjAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE1MDAxMjAwMDIzMzYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjMKICAgIC8vIGFzc2VydCBzMSA9PSAiZWNobzogczFiIgogICAgdW5jb3ZlciA0CiAgICBwdXNoYnl0ZXMgImVjaG86IHMxYiIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjQKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczJiIgogICAgdW5jb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMDA5NjU2MzY4NmYzYTIwNzMzMjYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI1CiAgICAvLyBhc3NlcnQgdTY0XzEgPT0gMTIKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMiAvLyAxMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNgogICAgLy8gYXNzZXJ0IHU2NF8yID09IDIyCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDE2CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNwogICAgLy8gYXNzZXJ0IGJ5dGV6ID09IGIiZWNobzogM2IiCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjAzMzYyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3Rfbm9fYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9ub19hcmdzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOS0zMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9ub19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MgogICAgcHVzaGludCA0MiAvLyA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMwogICAgLy8gYXJjNF9yZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuVUludDY0XSgibm9fYXJncygpdWludDY0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxOCAvLyBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJjNF9yZXN1bHQgPT0gNDIKICAgIGJ5dGVjIDI4IC8vIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzYKICAgIC8vIGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzNwogICAgLy8gYXNzZXJ0IGFyYzQuVUludDY0LmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gNDIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnl0ZWMgMjggLy8gMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hbWVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYW1lZF90dXBsZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5LTM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hbWVkX3R1cGxlcyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjkgLy8gbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM0MwogICAgLy8gKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIGJ5dGVjIDE5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDQKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ3CiAgICAvLyBhc3NlcnQgcmVzdWx0CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDgtMzUzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5sb2dzX2FyZV9lcXVhbCwKICAgIC8vICAgICAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgLy8gICAgIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyOSAvLyBtZXRob2QgImxvZ3NfYXJlX2VxdWFsKCh1aW50NjQsc3RyaW5nKSwodWludDY0LHN0cmluZykpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzUwCiAgICAvLyAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMjAwMGEwMDA1NmM2ZjY3MjAzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNTEKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ4LTM1MwogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgyKSwgU3RyaW5nKCJsb2cgMiIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzU0CiAgICAvLyBhc3NlcnQgbm90IHJlc3VsdAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCA2IDEgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgMHg5YmY4MTkxMyAweDAwMDAwMDAwMDAwMDAwMDEgMHgxNmUwMzkxOSAweDAwMDI3MzMxIDB4MDAwMjYyMzEgMHhiNGI0MzM0ZSAiZWNobzogczEiIDB4MDAwMDAwMDAwMDAwMDAwMyAweDRhNDQ0Yzc3IDB4MDAwMTczIDB4MjY1OWU4MTggMHgwMDAxNjIgMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MDMgMHhhYjI3MWNlNCAweGI4NjJlZTE5IDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMSAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1IDB4MDAwMDAwMDAwMDAwMDAwMiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzIDB4MGYxMDExMTJkZWFkYmVlZjE0IDB4NjU2MzY4NmYzYTIwNjIzMSAweDAwMDQwMDEwMDAwNDAwMDgwMDAyNzMzMTAwMDI3MzMyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDEyMDAwMTMzIDB4MDAwODY1NjM2ODZmM2EyMDczMzIgMHg2NTYzNjg2ZjNhMjAzMyAweDAwMDAwMDAwMDAwMDAwMmEgMHhkZGQwNzE4NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMAogICAgcHVzaGJ5dGVzcyAweDA3OTE2YmVhIDB4MTg1OWIwYmEgMHg0ZWIxMWIwZCAweDBkMTc2YTRhIDB4YjU0NzMwYzggMHg3ODU5ZWFmNyAweDI0NDc4YTNjIDB4N2E2MGMwMzUgMHg2YTU1OWNiMyAweDFiZTYwNzEyIDB4MTljYjc4YTQgMHhmMGVmNjg3MyAweDNkMmJmZTM3IDB4NTRlOThmNTYgMHhmNTViNzU2NyAweDg1OThiYjQzIC8vIG1ldGhvZCAidGVzdF9pc19hX2IoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9vdmVybG9hZChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyZ19jb252ZXJzaW9uKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfMTVwbHVzX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF92b2lkKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmX3R5cGVzKGFwcGxpY2F0aW9uLGFzc2V0KXZvaWQiLCBtZXRob2QgInRlc3RfbmF0aXZlX3N0cmluZyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV9ieXRlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV91aW50NjQoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfYmlndWludChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25vX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYW1lZF90dXBsZXMoYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHNfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21ldGhvZF9vdmVybG9hZF9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJnX2NvbnZlcnNpb25fcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0XzE1cGx1c19hcmdzX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yZWZfdHlwZXNfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9zdHJpbmdfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9ieXRlc19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV91aW50NjRfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYmlndWludF9yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmX3JvdXRlQDE0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlc19yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25vX2FyZ3Nfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTcKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2lzX2FfYgogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHNfcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWV0aG9kX292ZXJsb2FkX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbWV0aG9kX292ZXJsb2FkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyZ19jb252ZXJzaW9uX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfYXJnX2NvbnZlcnNpb24KICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfMTVwbHVzX2FyZ3Nfcm91dGVANjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF8xNXBsdXNfYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF92b2lkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JlZl90eXBlc19yb3V0ZUA4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9yZWZfdHlwZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3N0cmluZ19yb3V0ZUA5OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3N0cmluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYnl0ZXNfcm91dGVAMTA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYnl0ZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3VpbnQ2NF9yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X25hdGl2ZV91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYmlndWludAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdHVwbGVfcm91dGVAMTM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdHVwbGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWZfcm91dGVAMTQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZgogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVzX3JvdXRlQDE1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3R1cGxlcwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ub19hcmdzX3JvdXRlQDE2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3Rfbm9fYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYW1lZF90dXBsZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X2lzX2FfYihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2lzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOC0xOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9pc19hX2Ioc2VsZiwgYTogQnl0ZXMsIGI6IEJ5dGVzLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjAtMjUKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzCiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMC0yNQogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjNzcyMTJiYyAvLyBtZXRob2QgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvLCBhcmM0LlN0cmluZygidGVzdDEiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0MSIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyQ2xpZW50LmVjaG8sICJ0ZXN0MiIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDIiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyIsICJ0ZXN0MyIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDMiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM1CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyhzdHJpbmcpIiwgInRlc3Q0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDM0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM2CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0NCIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDM0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzcKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidGVzdDUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NjU3Mzc0MzUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImVjaG86IHRlc3Q1IgogICAgcHVzaGJ5dGVzIDB4MDAwYjY1NjM2ODZmM2EyMDc0NjU3Mzc0MzUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9tZXRob2Rfb3ZlcmxvYWQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbWV0aG9kX292ZXJsb2FkOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWV0aG9kX292ZXJsb2FkKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MgogICAgLy8gYXJjNC5hYmlfY2FsbFthcmM0LlN0cmluZ10oImVjaG8oc3RyaW5nKXN0cmluZyIsICJ0eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDBlNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gImVjaG86IHR5cGVkICsgaWdub3JlIgogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBwdXNoYnl0ZXMgMHgwMDE0NjU2MzY4NmYzYTIwNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ1CiAgICAvLyBhcmM0LmFiaV9jYWxsKCJlY2hvKHN0cmluZylzdHJpbmciLCAidW50eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDEwNzU2ZTc0Nzk3MDY1NjQyMDJiMjA2OTY3NmU2ZjcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ2CiAgICAvLyBhc3NlcnQgYXJjNC5TdHJpbmcuZnJvbV9sb2cob3AuSVR4bi5sYXN0X2xvZygpKSA9PSAiZWNobzogdW50eXBlZCArIGlnbm9yZSIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAxNjY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0MjAyYjIwNjk2NzZlNmY3MjY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDgKICAgIC8vIHJlc3VsdCA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidHVwbGUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NzU3MDZjNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0OQogICAgLy8gYXNzZXJ0IHJlc3VsdFswXSA9PSAiZWNobzogdHVwbGUiCiAgICBzd2FwCiAgICBieXRlYyAyMCAvLyAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTAKICAgIC8vIGFzc2VydCBhcmM0LlN0cmluZy5mcm9tX2xvZyhyZXN1bHRbMV0ubGFzdF9sb2cpID09ICJlY2hvOiB0dXBsZSIKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ5dGVjIDIwIC8vIDB4MDAwYjY1NjM2ODZmM2EyMDc0NzU3MDZjNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MgogICAgLy8gdHhuX3Jlc3VsdCA9IGFyYzQuYWJpX2NhbGwoImVjaG8oc3RyaW5nKXN0cmluZyIsICJ1bnR5cGVkIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDc3NTZlNzQ3OTcwNjU2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKHR4bl9yZXN1bHQubGFzdF9sb2cpID09ICJlY2hvOiB1bnR5cGVkIgogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAwZDY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfYXJnX2NvbnZlcnNpb24oYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfYXJnX2NvbnZlcnNpb246CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUtNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmdfY29udmVyc2lvbihzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTcKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJjb252ZXJ0ZWQxIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMGE2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1OAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiImNvbnZlcnRlZDEiCiAgICBwdXNoYnl0ZXMgMHg2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYwCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDY0LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDNjMTA1OGQ5IC8vIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDIxIC8vIDB4MDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2MQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBvcC5pdG9iKDIpCiAgICBpbnRjXzMgLy8gMgogICAgaXRvYgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYzCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDUxMiwgMywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2YWY0NTkzMCAvLyBtZXRob2QgImxvZyh1aW50NTEyKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMjIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSAob3AuYnplcm8oNTYpICsgb3AuaXRvYigzKSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubG9nX2J5dGVzLCBiIjQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGI1MDBlMTExIC8vIG1ldGhvZCAibG9nKGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDEzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIjQiCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY5CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfYm9vbCwgVHJ1ZSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2ZWVkN2VjMyAvLyBtZXRob2QgImxvZyhib29sKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzAKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJUcnVlIgogICAgcHVzaGJ5dGVzIDB4NTQ3Mjc1NjUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF8xNXBsdXNfYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF8xNXBsdXNfYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3Mi03MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0XzE1cGx1c19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NC05NwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5yZXR1cm5fYXJnc19hZnRlcl8xNHRoLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICAzLAogICAgLy8gICAgIDQsCiAgICAvLyAgICAgNSwKICAgIC8vICAgICA2LAogICAgLy8gICAgIDcsCiAgICAvLyAgICAgOCwKICAgIC8vICAgICA5LAogICAgLy8gICAgIDEwLAogICAgLy8gICAgIDExLAogICAgLy8gICAgIDEyLAogICAgLy8gICAgIDEzLAogICAgLy8gICAgIDE0LAogICAgLy8gICAgIDE1LAogICAgLy8gICAgIDE2LAogICAgLy8gICAgIDE3LAogICAgLy8gICAgIDE4LAogICAgLy8gICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vICAgICAyMCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGJhMGI0MzgxIC8vIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NgogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc3CiAgICAvLyAyLAogICAgYnl0ZWMgMjEgLy8gMHgwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc4CiAgICAvLyAzLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzkKICAgIC8vIDQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgwCiAgICAvLyA1LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4MQogICAgLy8gNiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODIKICAgIC8vIDcsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgzCiAgICAvLyA4LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NAogICAgLy8gOSwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODUKICAgIC8vIDEwLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NgogICAgLy8gMTEsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg3CiAgICAvLyAxMiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODgKICAgIC8vIDEzLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwZAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4OQogICAgLy8gMTQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBlCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjkwLTk1CiAgICAvLyAxNSwKICAgIC8vIDE2LAogICAgLy8gMTcsCiAgICAvLyAxOCwKICAgIC8vIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vIDIwLAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzQtOTcKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIucmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgMywKICAgIC8vICAgICA0LAogICAgLy8gICAgIDUsCiAgICAvLyAgICAgNiwKICAgIC8vICAgICA3LAogICAgLy8gICAgIDgsCiAgICAvLyAgICAgOSwKICAgIC8vICAgICAxMCwKICAgIC8vICAgICAxMSwKICAgIC8vICAgICAxMiwKICAgIC8vICAgICAxMywKICAgIC8vICAgICAxNCwKICAgIC8vICAgICAxNSwKICAgIC8vICAgICAxNiwKICAgIC8vICAgICAxNywKICAgIC8vICAgICAxOCwKICAgIC8vICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ4KDB4REUpLCBhcmM0LlVJbnQ4KDB4QUQpLCBhcmM0LlVJbnQ4KDB4QkUpLCBhcmM0LlVJbnQ4KDB4RUYpKSksCiAgICAvLyAgICAgMjAsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo5OAogICAgLy8gYXNzZXJ0IHJlc3VsdC5uYXRpdmUgPT0gQnl0ZXMuZnJvbV9oZXgoIjBGMTAxMTEyREVBREJFRUYxNCIpCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF92b2lkKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X3ZvaWQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwLTEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3ZvaWQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZyl2b2lkIiwgIldvcmxkMSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImxvZyhzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA2NTc2ZjcyNmM2NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIldvcmxkMSIKICAgIHB1c2hieXRlcyAweDU3NmY3MjZjNjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwNQogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZykiLCAiV29ybGQyIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDY1NzZmNzI2YzY0MzIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA2CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiV29ybGQyIgogICAgcHVzaGJ5dGVzIDB4NTc2ZjcyNmM2NDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA4CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExPR19NRVRIT0RfTkFNRSwgYXJjNC5TdHJpbmcoIldvcmxkMyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDkKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDMiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTEKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJXb3JsZDQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTIKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDQiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9yZWZfdHlwZXMoYXBwOiB1aW50NjQsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfcmVmX3R5cGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNC0xMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9yZWZfdHlwZXMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25zCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjZDcyN2I3MSAvLyBtZXRob2QgImxvZyhhc3NldCxhY2NvdW50LGFwcGxpY2F0aW9uKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExOAogICAgLy8gYXNzZXQsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTkKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjAKICAgIC8vIGFwcCwKICAgIHB1c2hieXRlcyAweDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNi0xMjIKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcCwKICAgIC8vICAgICBhc3NldCwKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFwcCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyNQogICAgLy8gPT0gYXNzZXQubmFtZSArIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMgKyBhcHAuYWRkcmVzcy5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjQtMTI1CiAgICAvLyB0eG4ubGFzdF9sb2cKICAgIC8vID09IGFzc2V0Lm5hbWUgKyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJ5dGVzICsgYXBwLmFkZHJlc3MuYnl0ZXMKICAgID09CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTIzLTEyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0eG4ubGFzdF9sb2cKICAgIC8vICAgICA9PSBhc3NldC5uYW1lICsgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcyArIGFwcC5hZGRyZXNzLmJ5dGVzCiAgICAvLyApCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfc3RyaW5nKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9zdHJpbmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTI4LTEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9zdHJpbmcoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMAogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3N0cmluZywgInMiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMQogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gImVjaG86IHMiCiAgICBkdXAKICAgIHB1c2hieXRlcyAiZWNobzogcyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzMKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIFN0cmluZygicyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzNAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzYKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIGFyYzQuU3RyaW5nKCJzIiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDAwMDE3MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM3CiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2J5dGVzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzktMTQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX2J5dGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDEKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYiJiIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0MgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gYiJlY2hvOiBiIgogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjA2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBCeXRlcyhiImIiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDctMTQ5CiAgICAvLyByZXN1bHQzLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfYnl0ZXMsIGFyYzQuRHluYW1pY0J5dGVzKGIiYiIpLCBhcHBfaWQ9YXBwCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTIgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9ieXRlcyhieXRlW10pYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDgKICAgIC8vIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIGJ5dGVjIDEzIC8vIDB4MDAwMTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0Ny0xNDkKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUwCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX3VpbnQ2NChhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdWludDY0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1Mi0xNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uYXRpdmVfdWludDY0KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTQKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIDEsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTUKICAgIC8vIGFzc2VydCByZXN1bHQxID09IDIKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTcKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIFVJbnQ2NCgxKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1OAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjAKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIGFyYzQuVUludDY0KDEpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdWludDY0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYxCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2JpZ3VpbnQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmF0aXZlX2JpZ3VpbnQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzLTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9iaWd1aW50KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjUKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfYmlndWludCh1aW50NTEyKXVpbnQ1MTIiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2NgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gMwogICAgZHVwCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2OAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQsIEJpZ1VJbnQoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTY5CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzEKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCBhcmM0LlVJbnQ1MTIoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcyCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hdGl2ZV90dXBsZShhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV90dXBsZShzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc2LTE4NgogICAgLy8gIyBweXRob24gbGl0ZXJhbHMKICAgIC8vIHJlc3VsdDEsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgInMxIiwKICAgIC8vICAgICBiImIxIiwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MQogICAgLy8gInMxIiwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxODIKICAgIC8vIGIiYjEiLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MwogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NAogICAgLy8gMiwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzYtMTg2CiAgICAvLyAjIHB5dGhvbiBsaXRlcmFscwogICAgLy8gcmVzdWx0MSwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NwogICAgLy8gcywgYiwgdSwgYnUgPSByZXN1bHQxLm5hdGl2ZQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4OAogICAgLy8gYXNzZXJ0IHMubmF0aXZlID09ICJlY2hvOiBzMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZWNobzogczEiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg5CiAgICAvLyBhc3NlcnQgYi5uYXRpdmUgPT0gYiJlY2hvOiBiMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgMjQgLy8gMHg2NTYzNjg2ZjNhMjA2MjMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkwCiAgICAvLyBhc3NlcnQgdS5uYXRpdmUgPT0gMgogICAgdW5jb3ZlciAzCiAgICBidG9pCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkxCiAgICAvLyBhc3NlcnQgYnUubmF0aXZlID09IDMKICAgIGRpZyAzCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDAKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk4CiAgICAvLyBTdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk5CiAgICAvLyBCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwMQogICAgLy8gQmlnVUludCgyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTMtMjAzCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MiwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBTdHJpbmcoInMxIiksCiAgICAvLyAgICAgQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIFVJbnQ2NCgxKSwKICAgIC8vICAgICBCaWdVSW50KDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjA0CiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSByZXN1bHQyCiAgICBkaWcgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwNi0yMTYKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBhcmM0IHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MywgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTEKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTQKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDYtMjE2CiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgYXJjNCB0eXBlcyBpbiBhcmd1bWVudHMKICAgIC8vIHJlc3VsdDMsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxNwogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gcmVzdWx0MwogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjE5LTIyNwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSByZXN1bHQgdHlwZQogICAgLy8gcmVzdWx0X25hdGl2ZSwgdHhuID0gYXJjNC5hYmlfY2FsbFt0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyMgogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjIzCiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI0CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyNQogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxOS0yMjcKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI4CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMF0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMF0KICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI5CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMV0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMV0KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMl0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMl0KICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzEKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVszXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVszXQogICAgYj09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZihhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzMtMjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWYoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM4CiAgICAvLyAiczEiLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzOQogICAgLy8gYiJiMSIsCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQwCiAgICAvLyAxLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQxCiAgICAvLyAyLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NQogICAgLy8gYXNzZXJ0IHMgPT0gImVjaG86IHMxIgogICAgZGlnIDMKICAgIGJ5dGVjIDggLy8gImVjaG86IHMxIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NgogICAgLy8gYXNzZXJ0IGIgPT0gYiJlY2hvOiBiMSIKICAgIGRpZyAyCiAgICBieXRlYyAyNCAvLyAweDY1NjM2ODZmM2EyMDYyMzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNDcKICAgIC8vIGFzc2VydCB1ID09IDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0OAogICAgLy8gYXNzZXJ0IGJ1ID09IDMKICAgIGR1cAogICAgYnl0ZWMgMTYgLy8gMHgwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTAtMjU4CiAgICAvLyAjIHRlc3Qgd2l0aCBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0XzIsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTUKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTMKICAgIC8vIFN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTQKICAgIC8vIEJ5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjU2CiAgICAvLyBCaWdVSW50KDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1OQogICAgLy8gYXNzZXJ0IHJlc3VsdF8yID09IHJlc3VsdCwgImV4cGVjdGVkIG5hdGl2ZSBhcmd1bWVudHMgdG8gZ2l2ZSB0aGUgc2FtZSByZXN1bHQiCiAgICB1bmNvdmVyIDMKICAgIGRpZyA3CiAgICA9PQogICAgdW5jb3ZlciAzCiAgICBkaWcgNgogICAgPT0KICAgICYmCiAgICB1bmNvdmVyIDIKICAgIGRpZyA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIGRpZyAyCiAgICBiPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbmF0aXZlIGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NAogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY1CiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY2CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NwogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAxMiA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzAKICAgIC8vIGFzc2VydCByZXN1bHRfMyA9PSByZXN1bHQsICJleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdCIKICAgIHVuY292ZXIgMwogICAgZGlnIDcKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGRpZyA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZGlnIDQKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZGlnIDIKICAgIGI9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3Mi0yODAKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzUKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzgKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzItMjgwCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHJlc3VsdCB0eXBlCiAgICAvLyByZXN1bHRfbmF0aXZlLCB0eG4gPSBhcmM0LmFiaV9jYWxsW3R1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF1dKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MQogICAgLy8gYXNzZXJ0IHJlc3VsdF9uYXRpdmUgPT0gcmVzdWx0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNwogICAgPT0KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYj09CiAgICAmJgogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmVzdGVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfdHVwbGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4My0yODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODUtMjkwCiAgICAvLyAjIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKCJzMSIsICJzMiIpLCAoMSwgMiwgYiIzIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4OAogICAgLy8gKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjg1LTI5MAogICAgLy8gIyBsaXRlcmFsIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjkyCiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTMKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTQKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk1CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk2CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5OC0zMDMKICAgIC8vICMgbmF0aXZlIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKChTdHJpbmcoInMxIiksIGFyYzQuU3RyaW5nKCJzMiIpKSwgKFVJbnQ2NCgxKSwgYXJjNC5VSW50NjQoMiksIEJ5dGVzKGIiMyIpKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNyAvLyBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzAxCiAgICAvLyAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk4LTMwMwogICAgLy8gIyBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA1CiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDYKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDcKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA4CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA5CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxNC0zMTkKICAgIC8vIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlN0cmluZygiczFiIiksIGFyYzQuU3RyaW5nKCJzMmIiKSkpLAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgKQogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDAwMDQwMDEyMDAwNDAwMDkwMDAzNzMzMTYyMDAwMzczMzI2MjAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE1MDAxMjAwMDIzMzYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjMKICAgIC8vIGFzc2VydCBzMSA9PSAiZWNobzogczFiIgogICAgdW5jb3ZlciA0CiAgICBwdXNoYnl0ZXMgImVjaG86IHMxYiIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjQKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczJiIgogICAgdW5jb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMDA5NjU2MzY4NmYzYTIwNzMzMjYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI1CiAgICAvLyBhc3NlcnQgdTY0XzEgPT0gMTIKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMiAvLyAxMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNgogICAgLy8gYXNzZXJ0IHU2NF8yID09IDIyCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDE2CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNwogICAgLy8gYXNzZXJ0IGJ5dGV6ID09IGIiZWNobzogM2IiCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjAzMzYyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3Rfbm9fYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9ub19hcmdzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOS0zMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9ub19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MgogICAgcHVzaGludCA0MiAvLyA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMwogICAgLy8gYXJjNF9yZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuVUludDY0XSgibm9fYXJncygpdWludDY0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxOCAvLyBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJjNF9yZXN1bHQgPT0gNDIKICAgIGJ5dGVjIDI4IC8vIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzYKICAgIC8vIGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzNwogICAgLy8gYXNzZXJ0IGFyYzQuVUludDY0LmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gNDIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnl0ZWMgMjggLy8gMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hbWVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYW1lZF90dXBsZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5LTM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hbWVkX3R1cGxlcyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjkgLy8gbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM0MwogICAgLy8gKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIGJ5dGVjIDE5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDQKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ3CiAgICAvLyBhc3NlcnQgcmVzdWx0CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDgtMzUzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5sb2dzX2FyZV9lcXVhbCwKICAgIC8vICAgICAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgLy8gICAgIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyOSAvLyBtZXRob2QgImxvZ3NfYXJlX2VxdWFsKCh1aW50NjQsc3RyaW5nKSwodWludDY0LHN0cmluZykpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzUwCiAgICAvLyAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMjAwMGEwMDA1NmM2ZjY3MjAzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNTEKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ4LTM1MwogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgyKSwgU3RyaW5nKCJsb2cgMiIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzU0CiAgICAvLyBhc3NlcnQgbm90IHJlc3VsdAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/typed_abi_call/out/Greeter.arc56.json b/test_cases/typed_abi_call/out/Greeter.arc56.json new file mode 100644 index 0000000000..c0d4d2f188 --- /dev/null +++ b/test_cases/typed_abi_call/out/Greeter.arc56.json @@ -0,0 +1,534 @@ +{ + "name": "Greeter", + "structs": {}, + "methods": [ + { + "name": "test_is_a_b", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_method_selector_kinds", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_method_overload", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arg_conversion", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_15plus_args", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_void", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_ref_types", + "args": [ + { + "type": "application", + "name": "app" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_string", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_bytes", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_uint64", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_biguint", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_tuple", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_tuple_method_ref", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_tuples", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_no_args", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_named_tuples", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 909, + 965, + 1021, + 1077, + 1133, + 1197, + 1210, + 1286, + 1353, + 1371, + 1416, + 1800, + 2077, + 2125, + 2165, + 2207, + 2255, + 2295, + 2336, + 2374, + 2411, + 2450, + 2487, + 2523, + 2572, + 2683, + 2730, + 2777, + 2883, + 2990, + 3097, + 3204, + 3305, + 3441, + 3617, + 3790, + 3824, + 3852, + 3865, + 3910, + 3967 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 503, + 533, + 551, + 569, + 587, + 605, + 623, + 647, + 665, + 683, + 701, + 719, + 737, + 755, + 773, + 791 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 2037 + ], + "errorMessage": "application exists" + }, + { + "pc": [ + 2029 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 814 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 506, + 536, + 554, + 572, + 590, + 608, + 626, + 650, + 668, + 686, + 704, + 722, + 740, + 758, + 776, + 794 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 3161 + ], + "errorMessage": "expected arc4 arguments to give the same result" + }, + { + "pc": [ + 3054 + ], + "errorMessage": "expected native arguments to give the same result" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCA2IDEgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgMHg5YmY4MTkxMyAweDAwMDAwMDAwMDAwMDAwMDEgMHgxNmUwMzkxOSAweDAwMDI3MzMxIDB4MDAwMjYyMzEgMHhiNGI0MzM0ZSAiZWNobzogczEiIDB4MDAwMDAwMDAwMDAwMDAwMyAweDRhNDQ0Yzc3IDB4MDAwMTczIDB4MjY1OWU4MTggMHgwMDAxNjIgMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MDMgMHhhYjI3MWNlNCAweGI4NjJlZTE5IDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMSAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1IDB4MDAwMDAwMDAwMDAwMDAwMiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzIDB4MGYxMDExMTJkZWFkYmVlZjE0IDB4NjU2MzY4NmYzYTIwNjIzMSAweDAwMDQwMDEwMDAwNDAwMDgwMDAyNzMzMTAwMDI3MzMyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDEyMDAwMTMzIDB4MDAwODY1NjM2ODZmM2EyMDczMzIgMHg2NTYzNjg2ZjNhMjAzMyAweDAwMDAwMDAwMDAwMDAwMmEgMHhkZGQwNzE4NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMAogICAgcHVzaGJ5dGVzcyAweDA3OTE2YmVhIDB4MTg1OWIwYmEgMHg0ZWIxMWIwZCAweDBkMTc2YTRhIDB4YjU0NzMwYzggMHg3ODU5ZWFmNyAweDI0NDc4YTNjIDB4N2E2MGMwMzUgMHg2YTU1OWNiMyAweDFiZTYwNzEyIDB4MTljYjc4YTQgMHhmMGVmNjg3MyAweDNkMmJmZTM3IDB4NTRlOThmNTYgMHhmNTViNzU2NyAweDg1OThiYjQzIC8vIG1ldGhvZCAidGVzdF9pc19hX2IoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X21ldGhvZF9vdmVybG9hZChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyZ19jb252ZXJzaW9uKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfMTVwbHVzX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF92b2lkKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmX3R5cGVzKGFwcGxpY2F0aW9uLGFzc2V0KXZvaWQiLCBtZXRob2QgInRlc3RfbmF0aXZlX3N0cmluZyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV9ieXRlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV91aW50NjQoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfYmlndWludChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlcyhhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25vX2FyZ3MoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYW1lZF90dXBsZXMoYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHNfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21ldGhvZF9vdmVybG9hZF9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJnX2NvbnZlcnNpb25fcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0XzE1cGx1c19hcmdzX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yZWZfdHlwZXNfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9zdHJpbmdfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV9ieXRlc19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV91aW50NjRfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYmlndWludF9yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmX3JvdXRlQDE0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlc19yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25vX2FyZ3Nfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTcKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfaXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2lzX2FfYgogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHNfcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWV0aG9kX292ZXJsb2FkX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbWV0aG9kX292ZXJsb2FkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyZ19jb252ZXJzaW9uX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfYXJnX2NvbnZlcnNpb24KICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfMTVwbHVzX2FyZ3Nfcm91dGVANjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF8xNXBsdXNfYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF92b2lkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JlZl90eXBlc19yb3V0ZUA4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9yZWZfdHlwZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3N0cmluZ19yb3V0ZUA5OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3N0cmluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYnl0ZXNfcm91dGVAMTA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYnl0ZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3VpbnQ2NF9yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X25hdGl2ZV91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYmlndWludAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdHVwbGVfcm91dGVAMTM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdHVwbGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWZfcm91dGVAMTQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZgogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVzX3JvdXRlQDE1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3R1cGxlcwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ub19hcmdzX3JvdXRlQDE2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3Rfbm9fYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYW1lZF90dXBsZXNfcm91dGVAMTc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYW1lZF90dXBsZXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X2lzX2FfYihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2lzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOC0xOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9pc19hX2Ioc2VsZiwgYTogQnl0ZXMsIGI6IEJ5dGVzLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjAtMjUKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzCiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMC0yNQogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjNzcyMTJiYyAvLyBtZXRob2QgImlzX2FfYihieXRlW10sYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvLCBhcmM0LlN0cmluZygidGVzdDEiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0MSIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyQ2xpZW50LmVjaG8sICJ0ZXN0MiIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDIiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyIsICJ0ZXN0MyIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDMiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM1CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyhzdHJpbmcpIiwgInRlc3Q0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDM0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM2CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0NCIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDM0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzcKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidGVzdDUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NjU3Mzc0MzUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImVjaG86IHRlc3Q1IgogICAgcHVzaGJ5dGVzIDB4MDAwYjY1NjM2ODZmM2EyMDc0NjU3Mzc0MzUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9tZXRob2Rfb3ZlcmxvYWQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbWV0aG9kX292ZXJsb2FkOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWV0aG9kX292ZXJsb2FkKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MgogICAgLy8gYXJjNC5hYmlfY2FsbFthcmM0LlN0cmluZ10oImVjaG8oc3RyaW5nKXN0cmluZyIsICJ0eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDBlNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gImVjaG86IHR5cGVkICsgaWdub3JlIgogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBwdXNoYnl0ZXMgMHgwMDE0NjU2MzY4NmYzYTIwNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ1CiAgICAvLyBhcmM0LmFiaV9jYWxsKCJlY2hvKHN0cmluZylzdHJpbmciLCAidW50eXBlZCArIGlnbm9yZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDEwNzU2ZTc0Nzk3MDY1NjQyMDJiMjA2OTY3NmU2ZjcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ2CiAgICAvLyBhc3NlcnQgYXJjNC5TdHJpbmcuZnJvbV9sb2cob3AuSVR4bi5sYXN0X2xvZygpKSA9PSAiZWNobzogdW50eXBlZCArIGlnbm9yZSIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAxNjY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0MjAyYjIwNjk2NzZlNmY3MjY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDgKICAgIC8vIHJlc3VsdCA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZylzdHJpbmciLCAidHVwbGUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NzU3MDZjNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0OQogICAgLy8gYXNzZXJ0IHJlc3VsdFswXSA9PSAiZWNobzogdHVwbGUiCiAgICBzd2FwCiAgICBieXRlYyAyMCAvLyAweDAwMGI2NTYzNjg2ZjNhMjA3NDc1NzA2YzY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTAKICAgIC8vIGFzc2VydCBhcmM0LlN0cmluZy5mcm9tX2xvZyhyZXN1bHRbMV0ubGFzdF9sb2cpID09ICJlY2hvOiB0dXBsZSIKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ5dGVjIDIwIC8vIDB4MDAwYjY1NjM2ODZmM2EyMDc0NzU3MDZjNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MgogICAgLy8gdHhuX3Jlc3VsdCA9IGFyYzQuYWJpX2NhbGwoImVjaG8oc3RyaW5nKXN0cmluZyIsICJ1bnR5cGVkIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDc3NTZlNzQ3OTcwNjU2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MwogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKHR4bl9yZXN1bHQubGFzdF9sb2cpID09ICJlY2hvOiB1bnR5cGVkIgogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcHVzaGJ5dGVzIDB4MDAwZDY1NjM2ODZmM2EyMDc1NmU3NDc5NzA2NTY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfYXJnX2NvbnZlcnNpb24oYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfYXJnX2NvbnZlcnNpb246CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTUtNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmdfY29udmVyc2lvbihzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NTcKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJjb252ZXJ0ZWQxIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMGE2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1OAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiImNvbnZlcnRlZDEiCiAgICBwdXNoYnl0ZXMgMHg2MzZmNmU3NjY1NzI3NDY1NjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYwCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDY0LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDNjMTA1OGQ5IC8vIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDIxIC8vIDB4MDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2MQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBvcC5pdG9iKDIpCiAgICBpbnRjXzMgLy8gMgogICAgaXRvYgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYzCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfdWludDUxMiwgMywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2YWY0NTkzMCAvLyBtZXRob2QgImxvZyh1aW50NTEyKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMjIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSAob3AuYnplcm8oNTYpICsgb3AuaXRvYigzKSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubG9nX2J5dGVzLCBiIjQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGI1MDBlMTExIC8vIG1ldGhvZCAibG9nKGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDEzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo2NwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIjQiCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY5CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfYm9vbCwgVHJ1ZSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2ZWVkN2VjMyAvLyBtZXRob2QgImxvZyhib29sKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzAKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJUcnVlIgogICAgcHVzaGJ5dGVzIDB4NTQ3Mjc1NjUKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF8xNXBsdXNfYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF8xNXBsdXNfYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3Mi03MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0XzE1cGx1c19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NC05NwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5yZXR1cm5fYXJnc19hZnRlcl8xNHRoLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICAzLAogICAgLy8gICAgIDQsCiAgICAvLyAgICAgNSwKICAgIC8vICAgICA2LAogICAgLy8gICAgIDcsCiAgICAvLyAgICAgOCwKICAgIC8vICAgICA5LAogICAgLy8gICAgIDEwLAogICAgLy8gICAgIDExLAogICAgLy8gICAgIDEyLAogICAgLy8gICAgIDEzLAogICAgLy8gICAgIDE0LAogICAgLy8gICAgIDE1LAogICAgLy8gICAgIDE2LAogICAgLy8gICAgIDE3LAogICAgLy8gICAgIDE4LAogICAgLy8gICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vICAgICAyMCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweGJhMGI0MzgxIC8vIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NgogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc3CiAgICAvLyAyLAogICAgYnl0ZWMgMjEgLy8gMHgwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc4CiAgICAvLyAzLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzkKICAgIC8vIDQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgwCiAgICAvLyA1LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4MQogICAgLy8gNiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODIKICAgIC8vIDcsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgzCiAgICAvLyA4LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NAogICAgLy8gOSwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODUKICAgIC8vIDEwLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NgogICAgLy8gMTEsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg3CiAgICAvLyAxMiwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODgKICAgIC8vIDEzLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwZAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4OQogICAgLy8gMTQsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBlCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjkwLTk1CiAgICAvLyAxNSwKICAgIC8vIDE2LAogICAgLy8gMTcsCiAgICAvLyAxOCwKICAgIC8vIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vIDIwLAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzQtOTcKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIucmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgMywKICAgIC8vICAgICA0LAogICAgLy8gICAgIDUsCiAgICAvLyAgICAgNiwKICAgIC8vICAgICA3LAogICAgLy8gICAgIDgsCiAgICAvLyAgICAgOSwKICAgIC8vICAgICAxMCwKICAgIC8vICAgICAxMSwKICAgIC8vICAgICAxMiwKICAgIC8vICAgICAxMywKICAgIC8vICAgICAxNCwKICAgIC8vICAgICAxNSwKICAgIC8vICAgICAxNiwKICAgIC8vICAgICAxNywKICAgIC8vICAgICAxOCwKICAgIC8vICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ4KDB4REUpLCBhcmM0LlVJbnQ4KDB4QUQpLCBhcmM0LlVJbnQ4KDB4QkUpLCBhcmM0LlVJbnQ4KDB4RUYpKSksCiAgICAvLyAgICAgMjAsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo5OAogICAgLy8gYXNzZXJ0IHJlc3VsdC5uYXRpdmUgPT0gQnl0ZXMuZnJvbV9oZXgoIjBGMTAxMTEyREVBREJFRUYxNCIpCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjMgLy8gMHgwZjEwMTExMmRlYWRiZWVmMTQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF92b2lkKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X3ZvaWQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwLTEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3ZvaWQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZyl2b2lkIiwgIldvcmxkMSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImxvZyhzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA2NTc2ZjcyNmM2NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwMwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIldvcmxkMSIKICAgIHB1c2hieXRlcyAweDU3NmY3MjZjNjQzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwNQogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMT0dfTUVUSE9EX05BTUUgKyAiKHN0cmluZykiLCAiV29ybGQyIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDY1NzZmNzI2YzY0MzIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA2CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiV29ybGQyIgogICAgcHVzaGJ5dGVzIDB4NTc2ZjcyNmM2NDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA4CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExPR19NRVRIT0RfTkFNRSwgYXJjNC5TdHJpbmcoIldvcmxkMyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDkKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDMiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTEKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19zdHJpbmcsICJXb3JsZDQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTIKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDQiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9yZWZfdHlwZXMoYXBwOiB1aW50NjQsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfcmVmX3R5cGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNC0xMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9yZWZfdHlwZXMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25zCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhjZDcyN2I3MSAvLyBtZXRob2QgImxvZyhhc3NldCxhY2NvdW50LGFwcGxpY2F0aW9uKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExOAogICAgLy8gYXNzZXQsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTkKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjAKICAgIC8vIGFwcCwKICAgIHB1c2hieXRlcyAweDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExNi0xMjIKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcCwKICAgIC8vICAgICBhc3NldCwKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFwcCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyNQogICAgLy8gPT0gYXNzZXQubmFtZSArIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMgKyBhcHAuYWRkcmVzcy5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjQtMTI1CiAgICAvLyB0eG4ubGFzdF9sb2cKICAgIC8vID09IGFzc2V0Lm5hbWUgKyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJ5dGVzICsgYXBwLmFkZHJlc3MuYnl0ZXMKICAgID09CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTIzLTEyNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0eG4ubGFzdF9sb2cKICAgIC8vICAgICA9PSBhc3NldC5uYW1lICsgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcyArIGFwcC5hZGRyZXNzLmJ5dGVzCiAgICAvLyApCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfc3RyaW5nKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9zdHJpbmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTI4LTEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9zdHJpbmcoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMAogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3N0cmluZywgInMiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMQogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gImVjaG86IHMiCiAgICBkdXAKICAgIHB1c2hieXRlcyAiZWNobzogcyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzMKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIFN0cmluZygicyIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgwMDAxNzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzNAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzYKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcsIGFyYzQuU3RyaW5nKCJzIiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDAwMDE3MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM3CiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2J5dGVzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV9ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzktMTQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX2J5dGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDEKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYiJiIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0MgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gYiJlY2hvOiBiIgogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjA2MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBCeXRlcyhiImIiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0NQogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDctMTQ5CiAgICAvLyByZXN1bHQzLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfYnl0ZXMsIGFyYzQuRHluYW1pY0J5dGVzKGIiYiIpLCBhcHBfaWQ9YXBwCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTIgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9ieXRlcyhieXRlW10pYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNDgKICAgIC8vIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIGJ5dGVjIDEzIC8vIDB4MDAwMTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0Ny0xNDkKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUwCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX3VpbnQ2NChhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdWludDY0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1Mi0xNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uYXRpdmVfdWludDY0KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTQKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIDEsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTUKICAgIC8vIGFzc2VydCByZXN1bHQxID09IDIKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTcKICAgIC8vIHJlc3VsdDIsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIFVJbnQ2NCgxKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1OAogICAgLy8gYXNzZXJ0IHJlc3VsdDIgPT0gcmVzdWx0MQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjAKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQsIGFyYzQuVUludDY0KDEpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdWludDY0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYxCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX2JpZ3VpbnQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmF0aXZlX2JpZ3VpbnQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTYzLTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV9iaWd1aW50KHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjUKICAgIC8vIHJlc3VsdDEsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCAyLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfYmlndWludCh1aW50NTEyKXVpbnQ1MTIiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2NgogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gMwogICAgZHVwCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2OAogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQsIEJpZ1VJbnQoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTY5CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzEKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50LCBhcmM0LlVJbnQ1MTIoMiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcyCiAgICAvLyBhc3NlcnQgcmVzdWx0MyA9PSByZXN1bHQxCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hdGl2ZV90dXBsZShhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV90dXBsZShzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc2LTE4NgogICAgLy8gIyBweXRob24gbGl0ZXJhbHMKICAgIC8vIHJlc3VsdDEsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgInMxIiwKICAgIC8vICAgICBiImIxIiwKICAgIC8vICAgICAxLAogICAgLy8gICAgIDIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MQogICAgLy8gInMxIiwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxODIKICAgIC8vIGIiYjEiLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MwogICAgLy8gMSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NAogICAgLy8gMiwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzYtMTg2CiAgICAvLyAjIHB5dGhvbiBsaXRlcmFscwogICAgLy8gcmVzdWx0MSwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4NwogICAgLy8gcywgYiwgdSwgYnUgPSByZXN1bHQxLm5hdGl2ZQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4OAogICAgLy8gYXNzZXJ0IHMubmF0aXZlID09ICJlY2hvOiBzMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZWNobzogczEiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg5CiAgICAvLyBhc3NlcnQgYi5uYXRpdmUgPT0gYiJlY2hvOiBiMSIKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgYnl0ZWMgMjQgLy8gMHg2NTYzNjg2ZjNhMjA2MjMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkwCiAgICAvLyBhc3NlcnQgdS5uYXRpdmUgPT0gMgogICAgdW5jb3ZlciAzCiAgICBidG9pCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkxCiAgICAvLyBhc3NlcnQgYnUubmF0aXZlID09IDMKICAgIGRpZyAzCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDAKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk4CiAgICAvLyBTdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTk5CiAgICAvLyBCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwMQogICAgLy8gQmlnVUludCgyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTMtMjAzCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MiwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBTdHJpbmcoInMxIiksCiAgICAvLyAgICAgQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIFVJbnQ2NCgxKSwKICAgIC8vICAgICBCaWdVSW50KDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjA0CiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSByZXN1bHQyCiAgICBkaWcgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwNi0yMTYKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBhcmM0IHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MywgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTEKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTQKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDYtMjE2CiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgYXJjNCB0eXBlcyBpbiBhcmd1bWVudHMKICAgIC8vIHJlc3VsdDMsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxNwogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gcmVzdWx0MwogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjE5LTIyNwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSByZXN1bHQgdHlwZQogICAgLy8gcmVzdWx0X25hdGl2ZSwgdHhuID0gYXJjNC5hYmlfY2FsbFt0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyMgogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjIzCiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI0CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIyNQogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxOS0yMjcKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI4CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMF0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMF0KICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI5CiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMV0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMV0KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMwCiAgICAvLyBhc3NlcnQgcmVzdWx0MS5uYXRpdmVbMl0ubmF0aXZlID09IHJlc3VsdF9uYXRpdmVbMl0KICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzEKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVszXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVszXQogICAgYj09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZihhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzMtMjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX3R1cGxlX21ldGhvZF9yZWYoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM4CiAgICAvLyAiczEiLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzOQogICAgLy8gYiJiMSIsCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQwCiAgICAvLyAxLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQxCiAgICAvLyAyLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzNS0yNDMKICAgIC8vICMgdGVzdCB3aXRoIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NQogICAgLy8gYXNzZXJ0IHMgPT0gImVjaG86IHMxIgogICAgZGlnIDMKICAgIGJ5dGVjIDggLy8gImVjaG86IHMxIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NgogICAgLy8gYXNzZXJ0IGIgPT0gYiJlY2hvOiBiMSIKICAgIGRpZyAyCiAgICBieXRlYyAyNCAvLyAweDY1NjM2ODZmM2EyMDYyMzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNDcKICAgIC8vIGFzc2VydCB1ID09IDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0OAogICAgLy8gYXNzZXJ0IGJ1ID09IDMKICAgIGR1cAogICAgYnl0ZWMgMTYgLy8gMHgwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTAtMjU4CiAgICAvLyAjIHRlc3Qgd2l0aCBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0XzIsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTUKICAgIC8vIFVJbnQ2NCgxKSwKICAgIGludGNfMiAvLyAxCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTMKICAgIC8vIFN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTQKICAgIC8vIEJ5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjU2CiAgICAvLyBCaWdVSW50KDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1OQogICAgLy8gYXNzZXJ0IHJlc3VsdF8yID09IHJlc3VsdCwgImV4cGVjdGVkIG5hdGl2ZSBhcmd1bWVudHMgdG8gZ2l2ZSB0aGUgc2FtZSByZXN1bHQiCiAgICB1bmNvdmVyIDMKICAgIGRpZyA3CiAgICA9PQogICAgdW5jb3ZlciAzCiAgICBkaWcgNgogICAgPT0KICAgICYmCiAgICB1bmNvdmVyIDIKICAgIGRpZyA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIGRpZyAyCiAgICBiPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbmF0aXZlIGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NAogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY1CiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY2CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2NwogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI2MS0yNjkKICAgIC8vICMgdGVzdCB3aXRoIGFyYzQgYXJncwogICAgLy8gcmVzdWx0XzMsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAxMiA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzAKICAgIC8vIGFzc2VydCByZXN1bHRfMyA9PSByZXN1bHQsICJleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdCIKICAgIHVuY292ZXIgMwogICAgZGlnIDcKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGRpZyA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZGlnIDQKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZGlnIDIKICAgIGI9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcmM0IGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3Mi0yODAKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzUKICAgIC8vIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NgogICAgLy8gYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NwogICAgLy8gYXJjNC5VSW50NjQoMSksCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzgKICAgIC8vIGFyYzQuVUludDUxMigyKSwKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNzItMjgwCiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHJlc3VsdCB0eXBlCiAgICAvLyByZXN1bHRfbmF0aXZlLCB0eG4gPSBhcmM0LmFiaV9jYWxsW3R1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF1dKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4MQogICAgLy8gYXNzZXJ0IHJlc3VsdF9uYXRpdmUgPT0gcmVzdWx0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNwogICAgPT0KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA0CiAgICA9PQogICAgJiYKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYj09CiAgICAmJgogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmVzdGVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfdHVwbGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4My0yODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODUtMjkwCiAgICAvLyAjIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKCJzMSIsICJzMiIpLCAoMSwgMiwgYiIzIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4OAogICAgLy8gKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjg1LTI5MAogICAgLy8gIyBsaXRlcmFsIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKCgiczEiLCAiczIiKSwgKDEsIDIsIGIiMyIpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjkyCiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTMKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTQKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk1CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk2CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5OC0zMDMKICAgIC8vICMgbmF0aXZlIGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgKChTdHJpbmcoInMxIiksIGFyYzQuU3RyaW5nKCJzMiIpKSwgKFVJbnQ2NCgxKSwgYXJjNC5VSW50NjQoMiksIEJ5dGVzKGIiMyIpKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNyAvLyBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzAxCiAgICAvLyAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIGJ5dGVjIDI1IC8vIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk4LTMwMwogICAgLy8gIyBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA1CiAgICAvLyBhc3NlcnQgczEgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciA0CiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDYKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczIiCiAgICB1bmNvdmVyIDMKICAgIGJ5dGVjIDI2IC8vIDB4MDAwODY1NjM2ODZmM2EyMDczMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDcKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA4CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMwogICAgc3dhcAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzA5CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzIgogICAgYnl0ZWMgMjcgLy8gMHg2NTYzNjg2ZjNhMjAzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxNC0zMTkKICAgIC8vIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlN0cmluZygiczFiIiksIGFyYzQuU3RyaW5nKCJzMmIiKSkpLAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgKQogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDAwMDQwMDEyMDAwNDAwMDkwMDAzNzMzMTYyMDAwMzczMzI2MjAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE1MDAxMjAwMDIzMzYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMxMS0zMjEKICAgIC8vICMgYXJjNCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgICAgICgKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgICAgICBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NCgxMSksIGFyYzQuVUludDY0KDIxKSwgYXJjNC5EeW5hbWljQnl0ZXMoYiIzYiIpKSksCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICApLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjMKICAgIC8vIGFzc2VydCBzMSA9PSAiZWNobzogczFiIgogICAgdW5jb3ZlciA0CiAgICBwdXNoYnl0ZXMgImVjaG86IHMxYiIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjQKICAgIC8vIGFzc2VydCBzMiA9PSAiZWNobzogczJiIgogICAgdW5jb3ZlciAzCiAgICBwdXNoYnl0ZXMgMHgwMDA5NjU2MzY4NmYzYTIwNzMzMjYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI1CiAgICAvLyBhc3NlcnQgdTY0XzEgPT0gMTIKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMiAvLyAxMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNgogICAgLy8gYXNzZXJ0IHU2NF8yID09IDIyCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDE2CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNwogICAgLy8gYXNzZXJ0IGJ5dGV6ID09IGIiZWNobzogM2IiCiAgICBwdXNoYnl0ZXMgMHg2NTYzNjg2ZjNhMjAzMzYyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3Rfbm9fYXJncyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9ub19hcmdzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOS0zMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9ub19hcmdzKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MgogICAgcHVzaGludCA0MiAvLyA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMwogICAgLy8gYXJjNF9yZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuVUludDY0XSgibm9fYXJncygpdWludDY0IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxOCAvLyBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJjNF9yZXN1bHQgPT0gNDIKICAgIGJ5dGVjIDI4IC8vIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzYKICAgIC8vIGFyYzQuYWJpX2NhbGwoTG9nZ2VyLm5vX2FyZ3MsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJub19hcmdzKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzNwogICAgLy8gYXNzZXJ0IGFyYzQuVUludDY0LmZyb21fbG9nKG9wLklUeG4ubGFzdF9sb2coKSkgPT0gNDIKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnl0ZWMgMjggLy8gMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hbWVkX3R1cGxlcyhhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYW1lZF90dXBsZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM5LTM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hbWVkX3R1cGxlcyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjkgLy8gbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM0MwogICAgLy8gKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIGJ5dGVjIDE5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMGEwMDA1NmM2ZjY3MjAzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDQKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQxLTM0NgogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgxKSwgU3RyaW5nKCJsb2cgMSIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ3CiAgICAvLyBhc3NlcnQgcmVzdWx0CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNDgtMzUzCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5sb2dzX2FyZV9lcXVhbCwKICAgIC8vICAgICAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgLy8gICAgIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyOSAvLyBtZXRob2QgImxvZ3NfYXJlX2VxdWFsKCh1aW50NjQsc3RyaW5nKSwodWludDY0LHN0cmluZykpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzUwCiAgICAvLyAoVUludDY0KDIpLCBTdHJpbmcoImxvZyAyIikpLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMjAwMGEwMDA1NmM2ZjY3MjAzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNTEKICAgIC8vIExvZ01lc3NhZ2UobGV2ZWw9VUludDY0KDEpLCBtZXNzYWdlPVN0cmluZygibG9nIDEiKSksCiAgICBieXRlYyAxOSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwNTZjNmY2NzIwMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzQ4LTM1MwogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nc19hcmVfZXF1YWwsCiAgICAvLyAgICAgKFVJbnQ2NCgyKSwgU3RyaW5nKCJsb2cgMiIpKSwKICAgIC8vICAgICBMb2dNZXNzYWdlKGxldmVsPVVJbnQ2NCgxKSwgbWVzc2FnZT1TdHJpbmcoImxvZyAxIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzU0CiAgICAvLyBhc3NlcnQgbm90IHJlc3VsdAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAYBAiYeBBUffHVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgSb+BkTCAAAAAAAAAABBBbgORkEAAJzMQQAAmIxBLS0M04IZWNobzogczEIAAAAAAAAAAMESkRMdwMAAXMEJlnoGAMAAWIEqfts8QTYzDY7AQMEqycc5AS4Yu4ZEQAAAAAAAAABAAoABWxvZyAxDQALZWNobzogdHVwbGUIAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkPEBES3q2+7xQIZWNobzogYjElAAQAEAAEAAgAAnMxAAJzMgAAAAAAAAABAAAAAAAAAAIAEgABMwoACGVjaG86IHMyB2VjaG86IDMIAAAAAAAAACoE3dBxhYgAAUOKAAExG0EBq4IQBAeRa+oEGFmwugROsRsNBA0XakoEtUcwyAR4Wer3BCRHijwEemDANQRqVZyzBBvmBxIEGct4pATw72hzBD0r/jcEVOmPVgT1W3VnBIWYu0M2GgCOEAACACAAMgBEAFYAaAB6AJIApAC2AMgA2gDsAP4BEAEiIokxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiAEjJIkxGRREMRhENhoBF8AyiAFCJIkxGRREMRhENhoBF8AyiAJMJIkxGRREMRhENhoBF8AyiANXJIkxGRREMRhENhoBF8AyiAP6JIkxGRREMRhENhoBF8AyiASnJIkxGRREMRhENhoBF8AyNhoCF8AwiAUzJIkxGRREMRhENhoBF8AyiAVmJIkxGRREMRhENhoBF8AyiAXWJIkxGRREMRhENhoBF8AyiAZGJIkxGRREMRhENhoBF8AyiAamJIkxGRREMRhENhoBF8AyiAcDJIkxGRREMRhENhoBF8AyiAgoJIkxGRREMRhENhoBF8AyiAnGJIkxGRREMRhENhoBF8AyiAudJIkxGRREMRhENhoBF8AyiAv7JIkxGUAABjEYFEQkiSKJigMAsYv9FRZXBgKL/VCL/hUWVwYCi/5Qi/+yGIAEx3ISvLIaTLIashojshAisgGziYoBALGL/7IYKrIagAcABXRlc3QxshojshAisgGztD5JVwQATFcABCgSRIANAAtlY2hvOiB0ZXN0MRJEsYv/shgqshqABwAFdGVzdDKyGiOyECKyAbO0PklXBABMVwAEKBJEgA0AC2VjaG86IHRlc3QyEkSxi/+yGCqyGoAHAAV0ZXN0M7IaI7IQIrIBs7Q+SVcEAExXAAQoEkSADQALZWNobzogdGVzdDMSRLGL/7IYKrIagAcABXRlc3Q0shojshAisgGztD5JVwQATFcABCgSRIANAAtlY2hvOiB0ZXN0NBJEsYv/shgqshqABwAFdGVzdDWyGiOyECKyAbO0PklXBABMVwAEKBJEgA0AC2VjaG86IHRlc3Q1EkSJigEAsYv/shgqshqAEAAOdHlwZWQgKyBpZ25vcmWyGiOyECKyAbO0PlcABCgSRLQ+SVcEAExXAAQoEkSAFgAUZWNobzogdHlwZWQgKyBpZ25vcmUSRLGL/7IYKrIagBIAEHVudHlwZWQgKyBpZ25vcmWyGiOyECKyAbO0PklXBABMVwAEKBJEgBgAFmVjaG86IHVudHlwZWQgKyBpZ25vcmUSRLGL/7IYKrIagAcABXR1cGxlshojshAisgGztD5JVwQATFcABCgSRLQ+TCcUEkRJVwQATFcABCgSRCcUEkSxi/+yGCqyGoAJAAd1bnR5cGVkshojshAisgGztD5JVwQATFcABCgSRIAPAA1lY2hvOiB1bnR5cGVkEkSJigEAsYv/shgnB7IagAwACmNvbnZlcnRlZDGyGiOyECKyAbO0PoAKY29udmVydGVkMRJEsYv/shiABDwQWNmyGicVshojshAisgGztD4lFhJEsYv/shiABGr0WTCyGicWshojshAisgGztD4nFhJEsYv/shiABLUA4RGyGoADAAE0shojshAisgGztD6AATQSRLGL/7IYgARu7X7DshqAAYCyGiOyECKyAbO0PoAEVHJ1ZRJEiYoBALGL/7IYgAS6C0OBshorshonFbIaJwmyGoAIAAAAAAAAAASyGoAIAAAAAAAAAAWyGoAIAAAAAAAAAAayGoAIAAAAAAAAAAeyGoAIAAAAAAAAAAiyGoAIAAAAAAAAAAmyGoAIAAAAAAAAAAqyGoAIAAAAAAAAAAuyGoAIAAAAAAAAAAyyGoAIAAAAAAAAAA2yGoAIAAAAAAAAAA6yGicXshojshAisgGztD5JVwQATFcABCgSRFcCACcXEkSJigEAsYv/shgnB7IagAgABldvcmxkMbIaI7IQIrIBs7Q+gAZXb3JsZDESRLGL/7IYJweyGoAIAAZXb3JsZDKyGiOyECKyAbO0PoAGV29ybGQyEkSxi/+yGCcHshqACAAGV29ybGQzshojshAisgGztD6ABldvcmxkMxJEsYv/shgnB7IagAgABldvcmxkNLIaI7IQIrIBs7Q+gAZXb3JsZDQSRImKAgCxMgqL/rIYi/+yMIv+sjKyHIAEzXJ7cbIagAEAshqAAQGyGoABAbIaI7IQIrIBs7Q+i/9xBEQyClCL/nIIRFASRImKAQCxi/+yGCcKshonC7IaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgBJgAdlY2hvOiBzEkSxi/+yGCcKshonC7IaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgBLARJEsYv/shgnCrIaJwuyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAEkSJigEAsYv/shgnDLIaJw2yGiOyECKyAbO0PklXBABMVwAEKBJEVwIASYAHZWNobzogYhJEsYv/shgnDLIaJw2yGiOyECKyAbO0PklXBABMVwAEKBJEVwIASwESRLGL/7IYJwyyGicNshojshAisgGztD5JVwQATFcABCgSRFcCABJEiYoBALGL/7IYJw6yGiuyGiOyECKyAbO0PklXBABMVwAEKBJEF0klEkSxJBaL/7IYJw6yGrIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXSwESRLGL/7IYJw6yGiuyGiOyECKyAbO0PklXBABMVwAEKBJEFxJEiYoBALGL/7IYJw+yGimyGiOyECKyAbO0PklXBABMVwAEKBJESScQqESxi/+yGCcPshopshojshAisgGztD5JVwQATFcABCgSREsBqESxi/+yGCcPshopshojshAisgGztD5JVwQATFcABCgSRKhEiYoBALGL/7IYJwSyGicFshonBrIaK7IaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRJIllLASVZSwJPAksCUksCFUsDTwNPAlJLAlcECEsDVwxATwNXAgBJJwgSRE8DVwIASScYEkRPAxdJJRJESwMnEKhEsSQWi/+yGCcEshonBbIaJwayGrIaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRLBRJEsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSRE8FEkSxi/+yGCcEshonBbIaJwayGiuyGimyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJXAgBLAhVLA08DTwJSVwIASwJXBAgXTwNXDEBPBk8EEkRPBE8DEkROAhJEqESJigEAsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSVwIASwIVSwNPA08CUlcCAEsCVwQIF08DVwxASwMnCBJESwInGBJESwElEkRJJxCoRLEkFov/shgnBLIaJwWyGicGshqyGimyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJXAgBLAhVLA08DTwJSVwIASwJXBAgXTwNXDEBPA0sHEk8DSwYSEE8CSwQSEExLAqgQRLGL/7IYJwSyGicFshonBrIaK7IaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRJIllLASVZSwJPAksCUlcCAEsCFUsDTwNPAlJXAgBLAlcECBdPA1cMQE8DSwcSTwNLBhIQTwJLBBIQTEsCqBBEsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSVwIASwIVSwNPA08CUlcCAEsCVwQIF08DVwxATwNPBxJPA08GEhBPAk8EEhBMTwKoEESJigEAsYv/shgnEbIaJxmyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJJIllLASVZSwJPAksCUlcCAEsCFU8DTwNPAlJLAxVPBE8ETwJSSVcACBdLAVcICEsCgRBZSwMVTwROAlJXAgBPBCcIEkRPAycaEkRPAiUSREwnCahEJxsSRLGL/7IYJxGyGicZshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSSSJZSwElWUsCTwJLAlJXAgBLAhVPA08DTwJSSwMVTwRPBE8CUklXAAgXSwFXCAhLAoEQWUsDFU8ETgJSVwIATwQnCBJETwMnGhJETwIlEkRMJwmoRCcbEkSxi/+yGCcRshqAKAAEABIABAAJAANzMWIAA3MyYgAAAAAAAAALAAAAAAAAABUAEgACM2KyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJJIllLASVZSwJPAksCUlcCAEsCFU8DTwNPAlJLAxVPBE8ETwJSSVcACBdLAVcICEsCgRBZSwMVTwROAlJXAgBPBIAJZWNobzogczFiEkRPA4ALAAllY2hvOiBzMmISRE8CgQwSREyACAAAAAAAAAAWqESACGVjaG86IDNiEkSJigEAsYv/shgnErIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXgSoSRLGL/7IYJxKyGiOyECKyAbO0PklXBABMVwAEKBJEJxyoRLGL/7IYJxKyGiOyECKyAbO0PlcABCgSRLQ+SVcEAExXAAQoEkQnHKhEiYoBALGL/7IYJx2yGicTshonE7IaI7IQIrIBs7Q+SVcEAExXAAQoEkQiU0Sxi/+yGCcdshqAEQAAAAAAAAACAAoABWxvZyAyshonE7IaI7IQIrIBs7Q+SVcEAExXAAQoEkQiUxREiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/typed_abi_call/out/Greeter.destructured.ir b/test_cases/typed_abi_call/out/Greeter.destructured.ir index 2926b0d3e4..884f659366 100644 --- a/test_cases/typed_abi_call/out/Greeter.destructured.ir +++ b/test_cases/typed_abi_call/out/Greeter.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.ir b/test_cases/typed_abi_call/out/Greeter.ssa.ir index 8cdc80821c..3af424fa70 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -32,10 +32,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -44,10 +44,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -56,10 +56,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -68,10 +68,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (== tmp%35#0 NoOp) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) let tmp%38#0: bool = (!= tmp%37#0 0u) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -80,10 +80,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (== tmp%42#0 NoOp) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) let tmp%45#0: bool = (!= tmp%44#0 0u) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -92,10 +92,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (== tmp%49#0 NoOp) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) let tmp%52#0: bool = (!= tmp%51#0 0u) - (assert tmp%52#0) // is not creating + (assert tmp%52#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -107,10 +107,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (== tmp%59#0 NoOp) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) let tmp%62#0: bool = (!= tmp%61#0 0u) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -119,10 +119,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -131,10 +131,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (== tmp%73#0 NoOp) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) let tmp%76#0: bool = (!= tmp%75#0 0u) - (assert tmp%76#0) // is not creating + (assert tmp%76#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -143,10 +143,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (== tmp%80#0 NoOp) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) let tmp%83#0: bool = (!= tmp%82#0 0u) - (assert tmp%83#0) // is not creating + (assert tmp%83#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -155,10 +155,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (== tmp%87#0 NoOp) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) let tmp%90#0: bool = (!= tmp%89#0 0u) - (assert tmp%90#0) // is not creating + (assert tmp%90#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -167,10 +167,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (== tmp%94#0 NoOp) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) let tmp%97#0: bool = (!= tmp%96#0 0u) - (assert tmp%97#0) // is not creating + (assert tmp%97#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -179,10 +179,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (== tmp%101#0 NoOp) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) let tmp%104#0: bool = (!= tmp%103#0 0u) - (assert tmp%104#0) // is not creating + (assert tmp%104#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -191,10 +191,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (== tmp%108#0 NoOp) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) let tmp%111#0: bool = (!= tmp%110#0 0u) - (assert tmp%111#0) // is not creating + (assert tmp%111#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -203,10 +203,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (== tmp%115#0 NoOp) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) let tmp%118#0: bool = (!= tmp%117#0 0u) - (assert tmp%118#0) // is not creating + (assert tmp%118#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -222,7 +222,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (== tmp%123#0 0u) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating test_cases.typed_abi_call.typed_c2c.Greeter.__algopy_default_create() return 1u block@22: // switch_case_default_L17 diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_1.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_1.ir index 2eb2ea0e0f..7df2ffea49 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_1.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_10.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_10.ir index d9e33f5f8e..b2c180d996 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_10.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_10.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_11.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_11.ir index b4863fcc9d..0b696cb215 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_11.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_11.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_12.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_12.ir index ea256de135..5505e92d28 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_12.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_12.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_13.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_13.ir index 896c491300..3108ef270d 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_13.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_13.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_14.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_14.ir index e769dc6e1d..25bd32ae93 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_14.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_14.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_15.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_15.ir index 8dffeb23f0..742fd8bff6 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_15.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_15.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_16.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_16.ir index 22f3c36dc6..97bec3934f 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_16.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_16.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_2.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_2.ir index 55f23c6dd5..8751a8471e 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_2.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_3.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_3.ir index 7c0839094a..1573b035fc 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_3.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_4.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_4.ir index 58fb857994..586600771b 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_4.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_5.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_5.ir index d8e7f3307b..6fa43dda80 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_5.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_5.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_6.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_6.ir index c82b1b8012..48f1e3a8a1 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_6.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_6.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_7.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_7.ir index c8c26a7bd7..76aa4b1389 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_7.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_7.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_8.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_8.ir index 338ed791e6..2739800f6a 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_8.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_8.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_9.ir b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_9.ir index 082e7bf49e..c1f5fe1030 100644 --- a/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_9.ir +++ b/test_cases/typed_abi_call/out/Greeter.ssa.opt_pass_9.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.approval.mir b/test_cases/typed_abi_call/out/Logger.approval.mir index f6a20c9515..8c0e44b018 100644 --- a/test_cases/typed_abi_call/out/Logger.approval.mir +++ b/test_cases/typed_abi_call/out/Logger.approval.mir @@ -49,9 +49,9 @@ __puya_arc4_router___is_a_b_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -71,9 +71,9 @@ __puya_arc4_router___echo_route@3: // @arc4.abimethod txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%15#0 @@ -92,9 +92,9 @@ __puya_arc4_router___no_args_route@4: // @arc4.abimethod txn OnCompletion tmp%18#0 ! tmp%19#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%20#0 - assert // is not creating + assert // can only call when not creating callsub no_args to_encode%0#0 itob val_as_bytes%0#0 byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75 @@ -109,9 +109,9 @@ __puya_arc4_router___log_route@5: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%23#0 ! tmp%24#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%25#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%27#0 @@ -126,9 +126,9 @@ __puya_arc4_router___log_route@6: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%28#0 ! tmp%29#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%30#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%32#0 @@ -143,9 +143,9 @@ __puya_arc4_router___log_route@7: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%33#0 ! tmp%34#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%35#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%37#0 @@ -160,9 +160,9 @@ __puya_arc4_router___log_route@8: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%38#0 ! tmp%39#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%40#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%42#0 @@ -177,9 +177,9 @@ __puya_arc4_router___log_route@9: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%43#0 ! tmp%44#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%45#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%47#0 @@ -194,9 +194,9 @@ __puya_arc4_router___log_route@10: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion tmp%48#0 ! tmp%49#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%50#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%52#0 @@ -222,9 +222,9 @@ __puya_arc4_router___echo_native_string_route@11: // @arc4.abimethod txn OnCompletion tmp%61#0 ! tmp%62#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%63#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%65#0 @@ -250,9 +250,9 @@ __puya_arc4_router___echo_native_bytes_route@12: // @arc4.abimethod txn OnCompletion tmp%68#0 ! tmp%69#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%70#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%72#0 @@ -278,9 +278,9 @@ __puya_arc4_router___echo_native_uint64_route@13: // @arc4.abimethod txn OnCompletion tmp%75#0 ! tmp%76#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%77#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%79#0 @@ -301,9 +301,9 @@ __puya_arc4_router___echo_native_biguint_route@14: // @arc4.abimethod txn OnCompletion tmp%82#0 ! tmp%83#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%84#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%86#0 @@ -332,9 +332,9 @@ __puya_arc4_router___echo_native_tuple_route@15: // @arc4.abimethod txn OnCompletion tmp%89#0 ! tmp%90#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%91#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%93#0 @@ -405,9 +405,9 @@ __puya_arc4_router___echo_nested_tuple_route@16: // @arc4.abimethod txn OnCompletion tmp%101#0 ! tmp%102#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%103#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%105#0 @@ -528,9 +528,9 @@ __puya_arc4_router___return_args_after_14th_route@17: // @arc4.abimethod txn OnCompletion tmp%107#0 ! tmp%108#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%109#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%111#0 @@ -594,9 +594,9 @@ __puya_arc4_router___logs_are_equal_route@18: // @arc4.abimethod txn OnCompletion tmp%139#0 ! tmp%140#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%141#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 tmp%143#0 @@ -655,7 +655,7 @@ __puya_arc4_router___bare_routing@21: __puya_arc4_router_____algopy_default_create@22: txn ApplicationID tmp%147#0 ! tmp%148#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/typed_abi_call/out/Logger.approval.teal b/test_cases/typed_abi_call/out/Logger.approval.teal index 6c958ebee6..2b26f46919 100644 --- a/test_cases/typed_abi_call/out/Logger.approval.teal +++ b/test_cases/typed_abi_call/out/Logger.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___is_a_b_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -45,9 +45,9 @@ __puya_arc4_router___echo_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -66,9 +66,9 @@ __puya_arc4_router___no_args_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub no_args itob bytec_0 // 0x151f7c75 @@ -83,9 +83,9 @@ __puya_arc4_router___log_route@5: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -100,9 +100,9 @@ __puya_arc4_router___log_route@6: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -117,9 +117,9 @@ __puya_arc4_router___log_route@7: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -134,9 +134,9 @@ __puya_arc4_router___log_route@8: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -151,9 +151,9 @@ __puya_arc4_router___log_route@9: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -168,9 +168,9 @@ __puya_arc4_router___log_route@10: // @arc4.abimethod(name=LOG_METHOD_NAME) txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -193,9 +193,9 @@ __puya_arc4_router___echo_native_string_route@11: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -221,9 +221,9 @@ __puya_arc4_router___echo_native_bytes_route@12: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -249,9 +249,9 @@ __puya_arc4_router___echo_native_uint64_route@13: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -272,9 +272,9 @@ __puya_arc4_router___echo_native_biguint_route@14: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -301,9 +301,9 @@ __puya_arc4_router___echo_native_tuple_route@15: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -368,9 +368,9 @@ __puya_arc4_router___echo_nested_tuple_route@16: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -483,9 +483,9 @@ __puya_arc4_router___return_args_after_14th_route@17: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -529,9 +529,9 @@ __puya_arc4_router___logs_are_equal_route@18: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -581,7 +581,7 @@ __puya_arc4_router___bare_routing@21: bnz __puya_arc4_router___after_if_else@25 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/typed_abi_call/out/Logger.arc32.json b/test_cases/typed_abi_call/out/Logger.arc32.json index 0eeac46748..0f044a74f8 100644 --- a/test_cases/typed_abi_call/out/Logger.arc32.json +++ b/test_cases/typed_abi_call/out/Logger.arc32.json @@ -115,7 +115,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgNjQgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NjU2MzY4NmYzYTIwIDB4MDAwNCAweDAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweGM3NzIxMmJjIDB4OWJmODE5MTMgMHhiODYyZWUxOSAweDNjMTA1OGQ5IDB4NmFmNDU5MzAgMHhiNGI0MzM0ZSAweDZlZWQ3ZWMzIDB4YjUwMGUxMTEgMHhjZDcyN2I3MSAweDRhNDQ0Yzc3IDB4MjY1OWU4MTggMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MTZlMDM5MTkgMHhhYjI3MWNlNCAweGJhMGI0MzgxIDB4ZGRkMDcxODUgLy8gbWV0aG9kICJpc19hX2IoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciLCBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIsIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJsb2codWludDUxMil2b2lkIiwgbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiLCBtZXRob2QgImxvZyhib29sKXZvaWQiLCBtZXRob2QgImxvZyhieXRlW10pdm9pZCIsIG1ldGhvZCAibG9nKGFzc2V0LGFjY291bnQsYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciLCBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgImVjaG9fbmF0aXZlX3VpbnQ2NCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIsIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLCBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIsIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIiwgbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19pc19hX2Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbm9fYXJnc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV9zdHJpbmdfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdWludDY0X3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uZXN0ZWRfdHVwbGVfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dzX2FyZV9lcXVhbF9yb3V0ZUAxOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19faXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgaXNfYV9iCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vX2FyZ3Nfcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG5vX2FyZ3MKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ191aW50NjQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ191aW50NTEyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVANzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfc3RyaW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfYm9vbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDk6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIGNhbGxzdWIgbG9nX2J5dGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAMTA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfYXNzZXRfYWNjb3VudF9hcHAKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3N0cmluZ19yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX3N0cmluZwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX2J5dGVzX3JvdXRlQDEyOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV91aW50NjRfcm91dGVAMTM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYmlndWludF9yb3V0ZUAxNDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfYmlndWludAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3R1cGxlX3JvdXRlQDE1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX3R1cGxlCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgNAogICAgYnwKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDRjCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmVzdGVkX3R1cGxlX3JvdXRlQDE2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmVzdGVkX3R1cGxlCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzIgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMiAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAzIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0IDQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXR1cm5fYXJnc19hZnRlcl8xNHRoCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dzX2FyZV9lcXVhbF9yb3V0ZUAxODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGxvZ3NfYXJlX2VxdWFsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMjE6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5pc19hX2IoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgppc19hX2I6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYtMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGlzX2FfYihzZWxmLCBhOiBCeXRlcywgYjogQnl0ZXMpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyOAogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAweDYxCiAgICA9PQogICAgYXNzZXJ0IC8vIGEgaXMgbm90IGEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyOQogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvKHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG86CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzEtMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG8oc2VsZiwgdmFsdWU6IGFyYzQuU3RyaW5nKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjMzCiAgICAvLyByZXR1cm4gImVjaG86ICIgKyB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLm5vX2FyZ3MoKSAtPiB1aW50NjQ6Cm5vX2FyZ3M6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzUtMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vX2FyZ3Moc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzcKICAgIC8vIHJldHVybiBVSW50NjQoNDIpCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX3VpbnQ2NCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ191aW50NjQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzktNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIC8vIGRlZiBsb2dfdWludDY0KHNlbGYsIHZhbHVlOiBhcmM0LlVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQxCiAgICAvLyBsb2codmFsdWUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ191aW50NTEyKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3VpbnQ1MTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDMtNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIC8vIGRlZiBsb2dfdWludDUxMihzZWxmLCB2YWx1ZTogYXJjNC5VSW50NTEyKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDUKICAgIC8vIGxvZyh2YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX3N0cmluZyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19zdHJpbmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIC8vIGRlZiBsb2dfc3RyaW5nKHNlbGYsIHZhbHVlOiBhcmM0LlN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQ5CiAgICAvLyBsb2codmFsdWUubmF0aXZlKSAgIyBkZWNvZGUgdG8gcmVtb3ZlIGhlYWRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX2Jvb2wodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfYm9vbDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19ib29sKHNlbGYsIHZhbHVlOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MwogICAgLy8gbG9nKEJ5dGVzKGIiVHJ1ZSIpIGlmIHZhbHVlLm5hdGl2ZSBlbHNlIEJ5dGVzKGIiRmFsc2UiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGJ5dGVzcyAweDQ2NjE2YzczNjUgMHg1NDcyNzU2NSAvLyAweDQ2NjE2YzczNjUsIDB4NTQ3Mjc1NjUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfYnl0ZXModmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfYnl0ZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTUtNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIC8vIGRlZiBsb2dfYnl0ZXMoc2VsZiwgdmFsdWU6IGFyYzQuRHluYW1pY0J5dGVzKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTcKICAgIC8vIGxvZyh2YWx1ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfYXNzZXRfYWNjb3VudF9hcHAoYXNzZXQ6IHVpbnQ2NCwgYWNjb3VudDogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgpsb2dfYXNzZXRfYWNjb3VudF9hcHA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NTktNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIC8vIGRlZiBsb2dfYXNzZXRfYWNjb3VudF9hcHAoc2VsZiwgYXNzZXQ6IEFzc2V0LCBhY2NvdW50OiBBY2NvdW50LCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjEKICAgIC8vIGxvZyhhc3NldC5uYW1lLCBhY2NvdW50LmJ5dGVzLCBhcHAuYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuZWNob19uYXRpdmVfc3RyaW5nKHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fbmF0aXZlX3N0cmluZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfc3RyaW5nKHNlbGYsIHZhbHVlOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY1CiAgICAvLyByZXR1cm4gImVjaG86ICIgKyB2YWx1ZQogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IGJ5dGVzOgplY2hvX25hdGl2ZV9ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2Ny02OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfYnl0ZXMoc2VsZiwgdmFsdWU6IEJ5dGVzKSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY5CiAgICAvLyByZXR1cm4gYiJlY2hvOiAiICsgdmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuZWNob19uYXRpdmVfdWludDY0KHZhbHVlOiB1aW50NjQpIC0+IHVpbnQ2NDoKZWNob19uYXRpdmVfdWludDY0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjcxLTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV91aW50NjQoc2VsZiwgdmFsdWU6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzMKICAgIC8vIHJldHVybiB2YWx1ZSArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV9iaWd1aW50KHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fbmF0aXZlX2JpZ3VpbnQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzUtNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fbmF0aXZlX2JpZ3VpbnQoc2VsZiwgdmFsdWU6IEJpZ1VJbnQpIC0+IEJpZ1VJbnQ6CiAgICBwcm90byAxIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NwogICAgLy8gcmV0dXJuIHZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18zIC8vIDB4MDEKICAgIGIrCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuZWNob19uYXRpdmVfdHVwbGUoczogYnl0ZXMsIGI6IGJ5dGVzLCB1OiB1aW50NjQsIGJ1OiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzLCB1aW50NjQsIGJ5dGVzOgplY2hvX25hdGl2ZV90dXBsZToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3OS04MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfdHVwbGUoCiAgICAvLyAgICAgc2VsZiwgczogU3RyaW5nLCBiOiBCeXRlcywgdTogVUludDY0LCBidTogQmlnVUludAogICAgLy8gKSAtPiB0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdOgogICAgcHJvdG8gNCA0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6ODMKICAgIC8vIHJldHVybiAiZWNobzogIiArIHMsIGIiZWNobzogIiArIGIsIHUgKyAxLCBidSArIDEKICAgIGJ5dGVjXzEgLy8gImVjaG86ICIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4NjU2MzY4NmYzYTIwCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18zIC8vIDB4MDEKICAgIGIrCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUodHVwbGVfb2ZfdHVwbGVzLjAuMDogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4wLjE6IGJ5dGVzLCB0dXBsZV9vZl90dXBsZXMuMS4wOiB1aW50NjQsIHR1cGxlX29mX3R1cGxlcy4xLjE6IGJ5dGVzLCB0dXBsZV9vZl90dXBsZXMuMS4yOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzLCB1aW50NjQsIGJ5dGVzLCBieXRlczoKZWNob19uZXN0ZWRfdHVwbGU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6ODUtODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fbmVzdGVkX3R1cGxlKAogICAgLy8gICAgIHNlbGYsIHR1cGxlX29mX3R1cGxlczogdHVwbGVbdHVwbGVbU3RyaW5nLCBhcmM0LlN0cmluZ10sIHR1cGxlW1VJbnQ2NCwgYXJjNC5VSW50NjQsIEJ5dGVzXV0KICAgIC8vICkgLT4gdHVwbGVbdHVwbGVbU3RyaW5nLCBhcmM0LlN0cmluZ10sIHR1cGxlW1VJbnQ2NCwgYXJjNC5VSW50NjQsIEJ5dGVzXV06CiAgICBwcm90byA1IDUKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MAogICAgLy8gcmV0dXJuICgiZWNobzogIiArIHN0cmluZywgImVjaG86ICIgKyBhcmM0X3N0cmluZyksICgKICAgIGJ5dGVjXzEgLy8gImVjaG86ICIKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18xIC8vIDB4NjU2MzY4NmYzYTIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTEKICAgIC8vIHU2NCArIDEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTIKICAgIC8vIGFyYzQuVUludDY0KGFyYzRfdTY0Lm5hdGl2ZSArIDEpLAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjkzCiAgICAvLyBiImVjaG86ICIgKyBieXRleiwKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTAtOTQKICAgIC8vIHJldHVybiAoImVjaG86ICIgKyBzdHJpbmcsICJlY2hvOiAiICsgYXJjNF9zdHJpbmcpLCAoCiAgICAvLyAgICAgdTY0ICsgMSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChhcmM0X3U2NC5uYXRpdmUgKyAxKSwKICAgIC8vICAgICBiImVjaG86ICIgKyBieXRleiwKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5yZXR1cm5fYXJnc19hZnRlcl8xNHRoKF9hMTogYnl0ZXMsIF9hMjogYnl0ZXMsIF9hMzogYnl0ZXMsIF9hNDogYnl0ZXMsIF9hNTogYnl0ZXMsIF9hNjogYnl0ZXMsIF9hNzogYnl0ZXMsIF9hODogYnl0ZXMsIF9hOTogYnl0ZXMsIF9hMTA6IGJ5dGVzLCBfYTExOiBieXRlcywgX2ExMjogYnl0ZXMsIF9hMTM6IGJ5dGVzLCBfYTE0OiBieXRlcywgYTE1OiBieXRlcywgYTE2OiBieXRlcywgYTE3OiBieXRlcywgYTE4OiBieXRlcywgYTE5OiBieXRlcywgYTIwOiBieXRlcykgLT4gYnl0ZXM6CnJldHVybl9hcmdzX2FmdGVyXzE0dGg6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTYtMTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXR1cm5fYXJnc19hZnRlcl8xNHRoKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgX2ExOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTI6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hMzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E0OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hNjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E3OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hOTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2ExMDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2ExMTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2ExMjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2ExMzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2ExNDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYTE1OiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGExNjogYXJjNC5VSW50OCwKICAgIC8vICAgICBhMTc6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE4OiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGExOTogYXJjNC5UdXBsZVthcmM0LlVJbnQ4LCBhcmM0LlVJbnQ4LCBhcmM0LlVJbnQ4LCBhcmM0LlVJbnQ4XSwKICAgIC8vICAgICBhMjA6IGFyYzQuVUludDgsCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0J5dGVzOgogICAgcHJvdG8gMjAgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyMAogICAgLy8gbGFzdF9hcmcgPSBhcmM0LlR1cGxlKChhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKSkKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTIxCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMTUpID09IGxhc3RfYXJnLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjIKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNCeXRlcyhsYXN0X2FyZy5ieXRlcykKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nc19hcmVfZXF1YWwobG9nXzEubGV2ZWw6IHVpbnQ2NCwgbG9nXzEubWVzc2FnZTogYnl0ZXMsIGxvZ18yLmxldmVsOiB1aW50NjQsIGxvZ18yLm1lc3NhZ2U6IGJ5dGVzKSAtPiB1aW50NjQ6CmxvZ3NfYXJlX2VxdWFsOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyNC0xMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGxvZ3NfYXJlX2VxdWFsKHNlbGYsIGxvZ18xOiBMb2dNZXNzYWdlLCBsb2dfMjogTG9nTWVzc2FnZSkgLT4gYm9vbDoKICAgIHByb3RvIDQgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyNgogICAgLy8gcmV0dXJuIGxvZ18xID09IGxvZ18yCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgJiYKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgNjQgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NjU2MzY4NmYzYTIwIDB4MDAwNCAweDAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweGM3NzIxMmJjIDB4OWJmODE5MTMgMHhiODYyZWUxOSAweDNjMTA1OGQ5IDB4NmFmNDU5MzAgMHhiNGI0MzM0ZSAweDZlZWQ3ZWMzIDB4YjUwMGUxMTEgMHhjZDcyN2I3MSAweDRhNDQ0Yzc3IDB4MjY1OWU4MTggMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MTZlMDM5MTkgMHhhYjI3MWNlNCAweGJhMGI0MzgxIDB4ZGRkMDcxODUgLy8gbWV0aG9kICJpc19hX2IoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciLCBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIsIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJsb2codWludDUxMil2b2lkIiwgbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiLCBtZXRob2QgImxvZyhib29sKXZvaWQiLCBtZXRob2QgImxvZyhieXRlW10pdm9pZCIsIG1ldGhvZCAibG9nKGFzc2V0LGFjY291bnQsYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciLCBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgImVjaG9fbmF0aXZlX3VpbnQ2NCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIsIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLCBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIsIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIiwgbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19pc19hX2Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbm9fYXJnc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV9zdHJpbmdfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdWludDY0X3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uZXN0ZWRfdHVwbGVfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dzX2FyZV9lcXVhbF9yb3V0ZUAxOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19faXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBpc19hX2IKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ub19hcmdzX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG5vX2FyZ3MKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIGNhbGxzdWIgbG9nX3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfdWludDUxMgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfc3RyaW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19ib29sCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAOToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19ieXRlcwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDEwOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfYXNzZXRfYWNjb3VudF9hcHAKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3N0cmluZ19yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfc3RyaW5nCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX2J5dGVzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdWludDY0X3JvdXRlQDEzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYmlndWludF9yb3V0ZUAxNDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV9iaWd1aW50CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV90dXBsZQogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA0YwogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25lc3RlZF90dXBsZV9yb3V0ZUAxNjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmVzdGVkX3R1cGxlCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzIgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMiAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQgNCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDggMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldHVybl9hcmdzX2FmdGVyXzE0dGgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ3NfYXJlX2VxdWFsX3JvdXRlQDE4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBsb2dzX2FyZV9lcXVhbAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDIxOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI1CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmlzX2FfYihhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmlzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNi0yNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaXNfYV9iKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI4CiAgICAvLyBhc3NlcnQgYSA9PSBiImEiLCAiYSBpcyBub3QgYSIKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI5CiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4NjIKICAgID09CiAgICBhc3NlcnQgLy8gYiBpcyBub3QgYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG8odmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNobzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNobyhzZWxmLCB2YWx1ZTogYXJjNC5TdHJpbmcpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzMKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18xIC8vIDB4NjU2MzY4NmYzYTIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubm9fYXJncygpIC0+IHVpbnQ2NDoKbm9fYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNS0zNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbm9fYXJncyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNwogICAgLy8gcmV0dXJuIFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfdWludDY0KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3VpbnQ2NDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozOS00MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NjQoc2VsZiwgdmFsdWU6IGFyYzQuVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDEKICAgIC8vIGxvZyh2YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX3VpbnQ1MTIodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfdWludDUxMjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NTEyKHNlbGYsIHZhbHVlOiBhcmM0LlVJbnQ1MTIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NQogICAgLy8gbG9nKHZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfc3RyaW5nKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3N0cmluZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0Ny00OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19zdHJpbmcoc2VsZiwgdmFsdWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDkKICAgIC8vIGxvZyh2YWx1ZS5uYXRpdmUpICAjIGRlY29kZSB0byByZW1vdmUgaGVhZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfYm9vbCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ib29sOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUxLTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICAvLyBkZWYgbG9nX2Jvb2woc2VsZiwgdmFsdWU6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUzCiAgICAvLyBsb2coQnl0ZXMoYiJUcnVlIikgaWYgdmFsdWUubmF0aXZlIGVsc2UgQnl0ZXMoYiJGYWxzZSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoYnl0ZXNzIDB4NDY2MTZjNzM2NSAweDU0NzI3NTY1IC8vIDB4NDY2MTZjNzM2NSwgMHg1NDcyNzU2NQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NS01NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19ieXRlcyhzZWxmLCB2YWx1ZTogYXJjNC5EeW5hbWljQnl0ZXMpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NwogICAgLy8gbG9nKHZhbHVlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcChhc3NldDogdWludDY0LCBhY2NvdW50OiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CmxvZ19hc3NldF9hY2NvdW50X2FwcDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1OS02MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19hc3NldF9hY2NvdW50X2FwcChzZWxmLCBhc3NldDogQXNzZXQsIGFjY291bnQ6IEFjY291bnQsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MQogICAgLy8gbG9nKGFzc2V0Lm5hbWUsIGFjY291bnQuYnl0ZXMsIGFwcC5hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0zCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfc3RyaW5nOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjYzLTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9zdHJpbmcoc2VsZiwgdmFsdWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjUKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBieXRlY18xIC8vICJlY2hvOiAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzKHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fbmF0aXZlX2J5dGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY3LTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9ieXRlcyhzZWxmLCB2YWx1ZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjkKICAgIC8vIHJldHVybiBiImVjaG86ICIgKyB2YWx1ZQogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQodmFsdWU6IHVpbnQ2NCkgLT4gdWludDY0OgplY2hvX25hdGl2ZV91aW50NjQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzEtNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fbmF0aXZlX3VpbnQ2NChzZWxmLCB2YWx1ZTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MwogICAgLy8gcmV0dXJuIHZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfYmlndWludDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfYmlndWludChzZWxmLCB2YWx1ZTogQmlnVUludCkgLT4gQmlnVUludDoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc3CiAgICAvLyByZXR1cm4gdmFsdWUgKyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV90dXBsZShzOiBieXRlcywgYjogYnl0ZXMsIHU6IHVpbnQ2NCwgYnU6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXM6CmVjaG9fbmF0aXZlX3R1cGxlOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc5LTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV90dXBsZSgKICAgIC8vICAgICBzZWxmLCBzOiBTdHJpbmcsIGI6IEJ5dGVzLCB1OiBVSW50NjQsIGJ1OiBCaWdVSW50CiAgICAvLyApIC0+IHR1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF06CiAgICBwcm90byA0IDQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4MwogICAgLy8gcmV0dXJuICJlY2hvOiAiICsgcywgYiJlY2hvOiAiICsgYiwgdSArIDEsIGJ1ICsgMQogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25lc3RlZF90dXBsZSh0dXBsZV9vZl90dXBsZXMuMC4wOiBieXRlcywgdHVwbGVfb2ZfdHVwbGVzLjAuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjA6IHVpbnQ2NCwgdHVwbGVfb2ZfdHVwbGVzLjEuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjI6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzOgplY2hvX25lc3RlZF90dXBsZToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NS04OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uZXN0ZWRfdHVwbGUoCiAgICAvLyAgICAgc2VsZiwgdHVwbGVfb2ZfdHVwbGVzOiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXQogICAgLy8gKSAtPiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXToKICAgIHByb3RvIDUgNQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjkwCiAgICAvLyByZXR1cm4gKCJlY2hvOiAiICsgc3RyaW5nLCAiZWNobzogIiArIGFyYzRfc3RyaW5nKSwgKAogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MQogICAgLy8gdTY0ICsgMSwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MgogICAgLy8gYXJjNC5VSW50NjQoYXJjNF91NjQubmF0aXZlICsgMSksCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTMKICAgIC8vIGIiZWNobzogIiArIGJ5dGV6LAogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MC05NAogICAgLy8gcmV0dXJuICgiZWNobzogIiArIHN0cmluZywgImVjaG86ICIgKyBhcmM0X3N0cmluZyksICgKICAgIC8vICAgICB1NjQgKyAxLAogICAgLy8gICAgIGFyYzQuVUludDY0KGFyYzRfdTY0Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGIiZWNobzogIiArIGJ5dGV6LAogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLnJldHVybl9hcmdzX2FmdGVyXzE0dGgoX2ExOiBieXRlcywgX2EyOiBieXRlcywgX2EzOiBieXRlcywgX2E0OiBieXRlcywgX2E1OiBieXRlcywgX2E2OiBieXRlcywgX2E3OiBieXRlcywgX2E4OiBieXRlcywgX2E5OiBieXRlcywgX2ExMDogYnl0ZXMsIF9hMTE6IGJ5dGVzLCBfYTEyOiBieXRlcywgX2ExMzogYnl0ZXMsIF9hMTQ6IGJ5dGVzLCBhMTU6IGJ5dGVzLCBhMTY6IGJ5dGVzLCBhMTc6IGJ5dGVzLCBhMTg6IGJ5dGVzLCBhMTk6IGJ5dGVzLCBhMjA6IGJ5dGVzKSAtPiBieXRlczoKcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5Ni0xMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldHVybl9hcmdzX2FmdGVyXzE0dGgoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBfYTE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hMjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2EzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hNTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E2OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hODogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E5OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEwOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTExOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEyOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTE0OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBhMTU6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE2OiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGExNzogYXJjNC5VSW50OCwKICAgIC8vICAgICBhMTg6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE5OiBhcmM0LlR1cGxlW2FyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDhdLAogICAgLy8gICAgIGEyMDogYXJjNC5VSW50OCwKICAgIC8vICkgLT4gYXJjNC5EeW5hbWljQnl0ZXM6CiAgICBwcm90byAyMCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTIwCiAgICAvLyBsYXN0X2FyZyA9IGFyYzQuVHVwbGUoKGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApKQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjEKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxNSkgPT0gbGFzdF9hcmcuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyMgogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0J5dGVzKGxhc3RfYXJnLmJ5dGVzKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dzX2FyZV9lcXVhbChsb2dfMS5sZXZlbDogdWludDY0LCBsb2dfMS5tZXNzYWdlOiBieXRlcywgbG9nXzIubGV2ZWw6IHVpbnQ2NCwgbG9nXzIubWVzc2FnZTogYnl0ZXMpIC0+IHVpbnQ2NDoKbG9nc19hcmVfZXF1YWw6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTI0LTEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbG9nc19hcmVfZXF1YWwoc2VsZiwgbG9nXzE6IExvZ01lc3NhZ2UsIGxvZ18yOiBMb2dNZXNzYWdlKSAtPiBib29sOgogICAgcHJvdG8gNCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTI2CiAgICAvLyByZXR1cm4gbG9nXzEgPT0gbG9nXzIKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAmJgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/typed_abi_call/out/Logger.arc56.json b/test_cases/typed_abi_call/out/Logger.arc56.json new file mode 100644 index 0000000000..c04c6dccf9 --- /dev/null +++ b/test_cases/typed_abi_call/out/Logger.arc56.json @@ -0,0 +1,618 @@ +{ + "name": "Logger", + "structs": { + "LogMessage": [ + { + "name": "level", + "type": "uint64" + }, + { + "name": "message", + "type": "string" + } + ] + }, + "methods": [ + { + "name": "is_a_b", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "no_args", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "uint512", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log", + "args": [ + { + "type": "asset", + "name": "asset" + }, + { + "type": "account", + "name": "account" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_string", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_uint64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_biguint", + "args": [ + { + "type": "uint512", + "name": "value" + } + ], + "returns": { + "type": "uint512" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_tuple", + "args": [ + { + "type": "string", + "name": "s" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "u" + }, + { + "type": "uint512", + "name": "bu" + } + ], + "returns": { + "type": "(string,byte[],uint64,uint512)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_nested_tuple", + "args": [ + { + "type": "((string,string),(uint64,uint64,byte[]))", + "name": "tuple_of_tuples" + } + ], + "returns": { + "type": "((string,string),(uint64,uint64,byte[]))" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "return_args_after_14th", + "args": [ + { + "type": "uint64", + "name": "_a1" + }, + { + "type": "uint64", + "name": "_a2" + }, + { + "type": "uint64", + "name": "_a3" + }, + { + "type": "uint64", + "name": "_a4" + }, + { + "type": "uint64", + "name": "_a5" + }, + { + "type": "uint64", + "name": "_a6" + }, + { + "type": "uint64", + "name": "_a7" + }, + { + "type": "uint64", + "name": "_a8" + }, + { + "type": "uint64", + "name": "_a9" + }, + { + "type": "uint64", + "name": "_a10" + }, + { + "type": "uint64", + "name": "_a11" + }, + { + "type": "uint64", + "name": "_a12" + }, + { + "type": "uint64", + "name": "_a13" + }, + { + "type": "uint64", + "name": "_a14" + }, + { + "type": "uint8", + "name": "a15" + }, + { + "type": "uint8", + "name": "a16" + }, + { + "type": "uint8", + "name": "a17" + }, + { + "type": "uint8", + "name": "a18" + }, + { + "type": "(uint8,uint8,uint8,uint8)", + "name": "a19" + }, + { + "type": "uint8", + "name": "a20" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "logs_are_equal", + "args": [ + { + "type": "(uint64,string)", + "struct": "LogMessage", + "name": "log_1" + }, + { + "type": "(uint64,string)", + "struct": "LogMessage", + "name": "log_2" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 169, + 193, + 212, + 229, + 244, + 259, + 274, + 289, + 304, + 334, + 364, + 394, + 415, + 442, + 537, + 702, + 796 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 886 + ], + "errorMessage": "a is not a" + }, + { + "pc": [ + 995 + ], + "errorMessage": "application exists" + }, + { + "pc": [ + 987 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 893 + ], + "errorMessage": "b is not b" + }, + { + "pc": [ + 872 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 172, + 196, + 215, + 232, + 247, + 262, + 277, + 292, + 307, + 337, + 367, + 397, + 418, + 445, + 540, + 705, + 799 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 429, + 496 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgNjQgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NjU2MzY4NmYzYTIwIDB4MDAwNCAweDAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweGM3NzIxMmJjIDB4OWJmODE5MTMgMHhiODYyZWUxOSAweDNjMTA1OGQ5IDB4NmFmNDU5MzAgMHhiNGI0MzM0ZSAweDZlZWQ3ZWMzIDB4YjUwMGUxMTEgMHhjZDcyN2I3MSAweDRhNDQ0Yzc3IDB4MjY1OWU4MTggMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MTZlMDM5MTkgMHhhYjI3MWNlNCAweGJhMGI0MzgxIDB4ZGRkMDcxODUgLy8gbWV0aG9kICJpc19hX2IoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciLCBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIsIG1ldGhvZCAibG9nKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJsb2codWludDUxMil2b2lkIiwgbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiLCBtZXRob2QgImxvZyhib29sKXZvaWQiLCBtZXRob2QgImxvZyhieXRlW10pdm9pZCIsIG1ldGhvZCAibG9nKGFzc2V0LGFjY291bnQsYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAiZWNob19uYXRpdmVfc3RyaW5nKHN0cmluZylzdHJpbmciLCBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgImVjaG9fbmF0aXZlX3VpbnQ2NCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIsIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLCBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIsIG1ldGhvZCAicmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LCh1aW50OCx1aW50OCx1aW50OCx1aW50OCksdWludDgpYnl0ZVtdIiwgbWV0aG9kICJsb2dzX2FyZV9lcXVhbCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpKWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19pc19hX2Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbm9fYXJnc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV9zdHJpbmdfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdWludDY0X3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uZXN0ZWRfdHVwbGVfcm91dGVAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dzX2FyZV9lcXVhbF9yb3V0ZUAxOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19faXNfYV9iX3JvdXRlQDI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBpc19hX2IKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ub19hcmdzX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG5vX2FyZ3MKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIGNhbGxzdWIgbG9nX3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfdWludDUxMgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfc3RyaW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19ib29sCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAOToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19ieXRlcwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDEwOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfYXNzZXRfYWNjb3VudF9hcHAKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3N0cmluZ19yb3V0ZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfc3RyaW5nCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX2J5dGVzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdWludDY0X3JvdXRlQDEzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmF0aXZlX3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYmlndWludF9yb3V0ZUAxNDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV9iaWd1aW50CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjUKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV90dXBsZQogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA0YwogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25lc3RlZF90dXBsZV9yb3V0ZUAxNjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fbmVzdGVkX3R1cGxlCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzIgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMiAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aF9yb3V0ZUAxNzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQgNCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDggMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldHVybl9hcmdzX2FmdGVyXzE0dGgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ3NfYXJlX2VxdWFsX3JvdXRlQDE4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBsb2dzX2FyZV9lcXVhbAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDIxOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI1CiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDI1CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNQogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmlzX2FfYihhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmlzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNi0yNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaXNfYV9iKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI4CiAgICAvLyBhc3NlcnQgYSA9PSBiImEiLCAiYSBpcyBub3QgYSIKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI5CiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4NjIKICAgID09CiAgICBhc3NlcnQgLy8gYiBpcyBub3QgYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG8odmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNobzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNobyhzZWxmLCB2YWx1ZTogYXJjNC5TdHJpbmcpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzMKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18xIC8vIDB4NjU2MzY4NmYzYTIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubm9fYXJncygpIC0+IHVpbnQ2NDoKbm9fYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNS0zNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbm9fYXJncyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNwogICAgLy8gcmV0dXJuIFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfdWludDY0KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3VpbnQ2NDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozOS00MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NjQoc2VsZiwgdmFsdWU6IGFyYzQuVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDEKICAgIC8vIGxvZyh2YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX3VpbnQ1MTIodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfdWludDUxMjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NTEyKHNlbGYsIHZhbHVlOiBhcmM0LlVJbnQ1MTIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0NQogICAgLy8gbG9nKHZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfc3RyaW5nKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3N0cmluZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0Ny00OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19zdHJpbmcoc2VsZiwgdmFsdWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDkKICAgIC8vIGxvZyh2YWx1ZS5uYXRpdmUpICAjIGRlY29kZSB0byByZW1vdmUgaGVhZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfYm9vbCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ib29sOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUxLTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICAvLyBkZWYgbG9nX2Jvb2woc2VsZiwgdmFsdWU6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjUzCiAgICAvLyBsb2coQnl0ZXMoYiJUcnVlIikgaWYgdmFsdWUubmF0aXZlIGVsc2UgQnl0ZXMoYiJGYWxzZSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoYnl0ZXNzIDB4NDY2MTZjNzM2NSAweDU0NzI3NTY1IC8vIDB4NDY2MTZjNzM2NSwgMHg1NDcyNzU2NQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NS01NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19ieXRlcyhzZWxmLCB2YWx1ZTogYXJjNC5EeW5hbWljQnl0ZXMpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NwogICAgLy8gbG9nKHZhbHVlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcChhc3NldDogdWludDY0LCBhY2NvdW50OiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CmxvZ19hc3NldF9hY2NvdW50X2FwcDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1OS02MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19hc3NldF9hY2NvdW50X2FwcChzZWxmLCBhc3NldDogQXNzZXQsIGFjY291bnQ6IEFjY291bnQsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2MQogICAgLy8gbG9nKGFzc2V0Lm5hbWUsIGFjY291bnQuYnl0ZXMsIGFwcC5hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0zCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfc3RyaW5nOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjYzLTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9zdHJpbmcoc2VsZiwgdmFsdWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjUKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBieXRlY18xIC8vICJlY2hvOiAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzKHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fbmF0aXZlX2J5dGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY3LTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9ieXRlcyhzZWxmLCB2YWx1ZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjkKICAgIC8vIHJldHVybiBiImVjaG86ICIgKyB2YWx1ZQogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQodmFsdWU6IHVpbnQ2NCkgLT4gdWludDY0OgplY2hvX25hdGl2ZV91aW50NjQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzEtNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fbmF0aXZlX3VpbnQ2NChzZWxmLCB2YWx1ZTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MwogICAgLy8gcmV0dXJuIHZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfYmlndWludDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfYmlndWludChzZWxmLCB2YWx1ZTogQmlnVUludCkgLT4gQmlnVUludDoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc3CiAgICAvLyByZXR1cm4gdmFsdWUgKyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV90dXBsZShzOiBieXRlcywgYjogYnl0ZXMsIHU6IHVpbnQ2NCwgYnU6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXM6CmVjaG9fbmF0aXZlX3R1cGxlOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc5LTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV90dXBsZSgKICAgIC8vICAgICBzZWxmLCBzOiBTdHJpbmcsIGI6IEJ5dGVzLCB1OiBVSW50NjQsIGJ1OiBCaWdVSW50CiAgICAvLyApIC0+IHR1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF06CiAgICBwcm90byA0IDQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4MwogICAgLy8gcmV0dXJuICJlY2hvOiAiICsgcywgYiJlY2hvOiAiICsgYiwgdSArIDEsIGJ1ICsgMQogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25lc3RlZF90dXBsZSh0dXBsZV9vZl90dXBsZXMuMC4wOiBieXRlcywgdHVwbGVfb2ZfdHVwbGVzLjAuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjA6IHVpbnQ2NCwgdHVwbGVfb2ZfdHVwbGVzLjEuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjI6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzOgplY2hvX25lc3RlZF90dXBsZToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NS04OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uZXN0ZWRfdHVwbGUoCiAgICAvLyAgICAgc2VsZiwgdHVwbGVfb2ZfdHVwbGVzOiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXQogICAgLy8gKSAtPiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXToKICAgIHByb3RvIDUgNQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjkwCiAgICAvLyByZXR1cm4gKCJlY2hvOiAiICsgc3RyaW5nLCAiZWNobzogIiArIGFyYzRfc3RyaW5nKSwgKAogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MQogICAgLy8gdTY0ICsgMSwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MgogICAgLy8gYXJjNC5VSW50NjQoYXJjNF91NjQubmF0aXZlICsgMSksCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6OTMKICAgIC8vIGIiZWNobzogIiArIGJ5dGV6LAogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MC05NAogICAgLy8gcmV0dXJuICgiZWNobzogIiArIHN0cmluZywgImVjaG86ICIgKyBhcmM0X3N0cmluZyksICgKICAgIC8vICAgICB1NjQgKyAxLAogICAgLy8gICAgIGFyYzQuVUludDY0KGFyYzRfdTY0Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGIiZWNobzogIiArIGJ5dGV6LAogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLnJldHVybl9hcmdzX2FmdGVyXzE0dGgoX2ExOiBieXRlcywgX2EyOiBieXRlcywgX2EzOiBieXRlcywgX2E0OiBieXRlcywgX2E1OiBieXRlcywgX2E2OiBieXRlcywgX2E3OiBieXRlcywgX2E4OiBieXRlcywgX2E5OiBieXRlcywgX2ExMDogYnl0ZXMsIF9hMTE6IGJ5dGVzLCBfYTEyOiBieXRlcywgX2ExMzogYnl0ZXMsIF9hMTQ6IGJ5dGVzLCBhMTU6IGJ5dGVzLCBhMTY6IGJ5dGVzLCBhMTc6IGJ5dGVzLCBhMTg6IGJ5dGVzLCBhMTk6IGJ5dGVzLCBhMjA6IGJ5dGVzKSAtPiBieXRlczoKcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5Ni0xMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldHVybl9hcmdzX2FmdGVyXzE0dGgoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBfYTE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hMjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2EzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hNTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E2OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hODogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E5OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEwOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTExOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEyOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTE0OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBhMTU6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE2OiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGExNzogYXJjNC5VSW50OCwKICAgIC8vICAgICBhMTg6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE5OiBhcmM0LlR1cGxlW2FyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDhdLAogICAgLy8gICAgIGEyMDogYXJjNC5VSW50OCwKICAgIC8vICkgLT4gYXJjNC5EeW5hbWljQnl0ZXM6CiAgICBwcm90byAyMCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTIwCiAgICAvLyBsYXN0X2FyZyA9IGFyYzQuVHVwbGUoKGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApKQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMjEKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxNSkgPT0gbGFzdF9hcmcuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjEyMgogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0J5dGVzKGxhc3RfYXJnLmJ5dGVzKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dzX2FyZV9lcXVhbChsb2dfMS5sZXZlbDogdWludDY0LCBsb2dfMS5tZXNzYWdlOiBieXRlcywgbG9nXzIubGV2ZWw6IHVpbnQ2NCwgbG9nXzIubWVzc2FnZTogYnl0ZXMpIC0+IHVpbnQ2NDoKbG9nc19hcmVfZXF1YWw6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTI0LTEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbG9nc19hcmVfZXF1YWwoc2VsZiwgbG9nXzE6IExvZ01lc3NhZ2UsIGxvZ18yOiBMb2dNZXNzYWdlKSAtPiBib29sOgogICAgcHJvdG8gNCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTI2CiAgICAvLyByZXR1cm4gbG9nXzEgPT0gbG9nXzIKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAmJgogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQBAAiYEBBUffHUGZWNobzogAgAEAQGIAAFDigABMRtBAzqCEQTHchK8BJv4GRMEuGLuGQQ8EFjZBGr0WTAEtLQzTgRu7X7DBLUA4REEzXJ7cQRKREx3BCZZ6BgEqfts8QTYzDY7BBbgORkEqycc5AS6C0OBBN3QcYU2GgCOEQACABoALQA+AE0AXABrAHoAiQCnAMUA4wD4ARMBcgIXAnUjiTEZFEQxGEQ2GgFXAgA2GgJXAgCIArEiiTEZFEQxGEQ2GgGIArQoTFCwIokxGRREMRhEiAK4FihMULAiiTEZFEQxGEQ2GgGIAqoiiTEZFEQxGEQ2GgGIAqIiiTEZFEQxGEQ2GgGIApoiiTEZFEQxGEQ2GgGIApUiiTEZFEQxGEQ2GgGIAp8iiTEZFEQxGEQ2GgEXwDA2GgIXwBw2GgMXwDKIAosiiTEZFEQxGEQ2GgFXAgCIAoxJFRZXBgJMUChMULAiiTEZFEQxGEQ2GgFXAgCIAnZJFRZXBgJMUChMULAiiTEZFEQxGEQ2GgEXiAJiFihMULAiiTEZFEQxGEQ2GgGIAlZJFSQORCSvqyhMULAiiTEZFEQxGEQ2GgFXAgA2GgJXAgA2GgMXNhoEiAIzSwMVFlcGAk8EUEsDFRZXBgJPBFBPAxZLAxUkDkQkr08Eq0sDFYFMCBZXBgKAAgBMTFBPAlBMUE8CUExQKExQsCKJMRkURDEYRDYaAUkjWUsBJVlLAk8CSwJSSSNZSwElWUsCTwJLAlJXAgBLAhVPA08DTwJSSwMVTwRPBE8CUklXAAgXSwFXCAhLAoEQWUsDFU8ETgJSVwIAiAGrSwQVFlcGAk8FUEkVgQQIFlcGAipMUExQTwRQTwMWSwIVFlcGAk8DUExPA1CAAgASUExQSwEVgQQIFlcGAipMUE8CUExQKExQsCKJMRkURDEYRDYaATYaAjYaAzYaBDYaBTYaBjYaBzYaCDYaCTYaCjYaCzYaDDYaDTYaDjYaD1cAATYaD1cBATYaD1cCATYaD1cDATYaD1cEBDYaD1cIAYgBLihMULAiiTEZFEQxGEQ2GgFJVwAIF0sBgQhZSwIVTwNOAlJXAgA2GgJJVwAIF0sBgQhZSwIVTwNOAlJXAgCIARKAAQAjTwJUKExQsCKJMRlAAAYxGBREIokjiYoCAIv+gAFhEkSL/4ABYhJEiYoBAYv/VwIAKUxQSRUWVwYCTFCJigABgSqJigEAi/+wiYoBAIv/sImKAQCL/1cCALCJigEAi/8jU4ICBUZhbHNlBFRydWVPAk2wiYoBAIv/VwIAsImKAwCL/XEERIv+UIv/cghEULCJigEBKYv/UImKAQEpi/9QiYoBAYv/IgiJigEBi/8roImKBAQpi/xQKYv9UIv+IgiL/yugiYoFBSmL+1CL/FcCAClMUEkVFlcGAkxQi/0iCIv+FyIIFimL/1CJihQBi/qL+1CL/FCL/VCL/lCL/1A2Gg9LARJESRUWVwYCTFCJigQBi/yL/hKL/Yv/EhCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/typed_abi_call/out/Logger.destructured.ir b/test_cases/typed_abi_call/out/Logger.destructured.ir index b61dc12dc8..7ecd6950bc 100644 --- a/test_cases/typed_abi_call/out/Logger.destructured.ir +++ b/test_cases/typed_abi_call/out/Logger.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.ssa.ir b/test_cases/typed_abi_call/out/Logger.ssa.ir index 3ab078c87a..08fc0ff7ce 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -29,10 +29,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -41,10 +41,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (== tmp%18#0 NoOp) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (!= tmp%20#0 0u) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -53,60 +53,60 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (== tmp%38#0 NoOp) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (!= tmp%40#0 0u) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (== tmp%43#0 NoOp) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) let tmp%46#0: bool = (!= tmp%45#0 0u) - (assert tmp%46#0) // is not creating + (assert tmp%46#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (== tmp%48#0 NoOp) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) let tmp%51#0: bool = (!= tmp%50#0 0u) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -121,10 +121,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (== tmp%61#0 NoOp) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (!= tmp%63#0 0u) - (assert tmp%64#0) // is not creating + (assert tmp%64#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -138,10 +138,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (== tmp%68#0 NoOp) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) let tmp%71#0: bool = (!= tmp%70#0 0u) - (assert tmp%71#0) // is not creating + (assert tmp%71#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -155,10 +155,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (== tmp%75#0 NoOp) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) let tmp%78#0: bool = (!= tmp%77#0 0u) - (assert tmp%78#0) // is not creating + (assert tmp%78#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -169,10 +169,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (== tmp%82#0 NoOp) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) let tmp%85#0: bool = (!= tmp%84#0 0u) - (assert tmp%85#0) // is not creating + (assert tmp%85#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -186,10 +186,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (== tmp%89#0 NoOp) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) let tmp%92#0: bool = (!= tmp%91#0 0u) - (assert tmp%92#0) // is not creating + (assert tmp%92#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -234,10 +234,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (== tmp%101#0 NoOp) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) let tmp%104#0: bool = (!= tmp%103#0 0u) - (assert tmp%104#0) // is not creating + (assert tmp%104#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -313,10 +313,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (== tmp%107#0 NoOp) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) let tmp%110#0: bool = (!= tmp%109#0 0u) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -350,10 +350,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (== tmp%139#0 NoOp) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) let tmp%142#0: bool = (!= tmp%141#0 0u) - (assert tmp%142#0) // is not creating + (assert tmp%142#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = (extract3 tmp%143#0 0u 8u) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -383,7 +383,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (== tmp%147#0 0u) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating test_cases.typed_abi_call.logger.Logger.__algopy_default_create() return 1u block@23: // switch_case_default_L25 diff --git a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_1.ir b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_1.ir index ff1dc73ac8..90f7cf7063 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_1.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -214,9 +214,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -275,9 +275,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -311,9 +311,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -339,7 +339,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_2.ir b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_2.ir index f9aef3170c..445aaa6aff 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_2.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_3.ir b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_3.ir index a5b6e39380..9c7b4d192f 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_3.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_3.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_4.ir b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_4.ir index f57fc50311..8f3d2d8d7b 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_4.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_4.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_5.ir b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_5.ir index b61dc12dc8..7ecd6950bc 100644 --- a/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_5.ir +++ b/test_cases/typed_abi_call/out/Logger.ssa.opt_pass_5.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out_O2/Greeter.approval.teal b/test_cases/typed_abi_call/out_O2/Greeter.approval.teal index 87a9292439..2e954f6f21 100644 --- a/test_cases/typed_abi_call/out_O2/Greeter.approval.teal +++ b/test_cases/typed_abi_call/out_O2/Greeter.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_is_a_b_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -38,9 +38,9 @@ __puya_arc4_router___test_is_a_b_route@2: __puya_arc4_router___test_method_selector_kinds_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -51,9 +51,9 @@ __puya_arc4_router___test_method_selector_kinds_route@3: __puya_arc4_router___test_method_overload_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -64,9 +64,9 @@ __puya_arc4_router___test_method_overload_route@4: __puya_arc4_router___test_arg_conversion_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -77,9 +77,9 @@ __puya_arc4_router___test_arg_conversion_route@5: __puya_arc4_router___test_15plus_args_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -90,9 +90,9 @@ __puya_arc4_router___test_15plus_args_route@6: __puya_arc4_router___test_void_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -103,9 +103,9 @@ __puya_arc4_router___test_void_route@7: __puya_arc4_router___test_ref_types_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -119,9 +119,9 @@ __puya_arc4_router___test_ref_types_route@8: __puya_arc4_router___test_native_string_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -132,9 +132,9 @@ __puya_arc4_router___test_native_string_route@9: __puya_arc4_router___test_native_bytes_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -145,9 +145,9 @@ __puya_arc4_router___test_native_bytes_route@10: __puya_arc4_router___test_native_uint64_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -158,9 +158,9 @@ __puya_arc4_router___test_native_uint64_route@11: __puya_arc4_router___test_native_biguint_route@12: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -171,9 +171,9 @@ __puya_arc4_router___test_native_biguint_route@12: __puya_arc4_router___test_native_tuple_route@13: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -184,9 +184,9 @@ __puya_arc4_router___test_native_tuple_route@13: __puya_arc4_router___test_native_tuple_method_ref_route@14: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -197,9 +197,9 @@ __puya_arc4_router___test_native_tuple_method_ref_route@14: __puya_arc4_router___test_nested_tuples_route@15: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -210,9 +210,9 @@ __puya_arc4_router___test_nested_tuples_route@15: __puya_arc4_router___test_no_args_route@16: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -223,9 +223,9 @@ __puya_arc4_router___test_no_args_route@16: __puya_arc4_router___test_named_tuples_route@17: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Applications @@ -238,7 +238,7 @@ __puya_arc4_router___bare_routing@20: bnz __puya_arc4_router___after_if_else@24 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_2 // 1 retsub diff --git a/test_cases/typed_abi_call/out_O2/Greeter.destructured.ir b/test_cases/typed_abi_call/out_O2/Greeter.destructured.ir index 2926b0d3e4..884f659366 100644 --- a/test_cases/typed_abi_call/out_O2/Greeter.destructured.ir +++ b/test_cases/typed_abi_call/out_O2/Greeter.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -41,9 +41,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (! tmp%21#0) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) - (assert tmp%23#0) // is not creating + (assert tmp%23#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -63,9 +63,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (! tmp%35#0) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) - (assert tmp%37#0) // is not creating + (assert tmp%37#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -74,9 +74,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (! tmp%42#0) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) - (assert tmp%44#0) // is not creating + (assert tmp%44#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -85,9 +85,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (! tmp%49#0) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -99,9 +99,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (! tmp%59#0) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) - (assert tmp%61#0) // is not creating + (assert tmp%61#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -110,9 +110,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (! tmp%66#0) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) - (assert tmp%68#0) // is not creating + (assert tmp%68#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -121,9 +121,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (! tmp%73#0) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) - (assert tmp%75#0) // is not creating + (assert tmp%75#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -132,9 +132,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (! tmp%80#0) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) - (assert tmp%82#0) // is not creating + (assert tmp%82#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (! tmp%87#0) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) - (assert tmp%89#0) // is not creating + (assert tmp%89#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -154,9 +154,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (! tmp%94#0) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) - (assert tmp%96#0) // is not creating + (assert tmp%96#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -165,9 +165,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -176,9 +176,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (! tmp%108#0) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -187,9 +187,9 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (! tmp%115#0) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) - (assert tmp%117#0) // is not creating + (assert tmp%117#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -201,7 +201,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (! tmp%123#0) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating return 1u block@24: // after_if_else_L17 return 0u diff --git a/test_cases/typed_abi_call/out_O2/Logger.approval.teal b/test_cases/typed_abi_call/out_O2/Logger.approval.teal index c8438e5e6e..06f22897fe 100644 --- a/test_cases/typed_abi_call/out_O2/Logger.approval.teal +++ b/test_cases/typed_abi_call/out_O2/Logger.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___is_a_b_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -35,9 +35,9 @@ __puya_arc4_router___is_a_b_route@2: __puya_arc4_router___echo_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub echo bytec_0 // 0x151f7c75 @@ -50,9 +50,9 @@ __puya_arc4_router___echo_route@3: __puya_arc4_router___no_args_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub no_args itob bytec_0 // 0x151f7c75 @@ -65,9 +65,9 @@ __puya_arc4_router___no_args_route@4: __puya_arc4_router___log_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_uint64 intc_0 // 1 @@ -76,9 +76,9 @@ __puya_arc4_router___log_route@5: __puya_arc4_router___log_route@6: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_uint512 intc_0 // 1 @@ -87,9 +87,9 @@ __puya_arc4_router___log_route@6: __puya_arc4_router___log_route@7: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_string intc_0 // 1 @@ -98,9 +98,9 @@ __puya_arc4_router___log_route@7: __puya_arc4_router___log_route@8: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_bool intc_0 // 1 @@ -109,9 +109,9 @@ __puya_arc4_router___log_route@8: __puya_arc4_router___log_route@9: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub log_bytes intc_0 // 1 @@ -120,9 +120,9 @@ __puya_arc4_router___log_route@9: __puya_arc4_router___log_route@10: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi txnas Assets @@ -139,9 +139,9 @@ __puya_arc4_router___log_route@10: __puya_arc4_router___echo_native_string_route@11: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub echo_native_string @@ -161,9 +161,9 @@ __puya_arc4_router___echo_native_string_route@11: __puya_arc4_router___echo_native_bytes_route@12: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 callsub echo_native_bytes @@ -183,9 +183,9 @@ __puya_arc4_router___echo_native_bytes_route@12: __puya_arc4_router___echo_native_uint64_route@13: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 btoi callsub echo_native_uint64 @@ -200,9 +200,9 @@ __puya_arc4_router___echo_native_uint64_route@13: __puya_arc4_router___echo_native_biguint_route@14: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 callsub echo_native_biguint dup @@ -223,9 +223,9 @@ __puya_arc4_router___echo_native_biguint_route@14: __puya_arc4_router___echo_native_tuple_route@15: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -284,9 +284,9 @@ __puya_arc4_router___echo_native_tuple_route@15: __puya_arc4_router___echo_nested_tuple_route@16: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup intc_1 // 0 @@ -392,9 +392,9 @@ __puya_arc4_router___echo_nested_tuple_route@16: __puya_arc4_router___return_args_after_14th_route@17: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 @@ -432,9 +432,9 @@ __puya_arc4_router___return_args_after_14th_route@17: __puya_arc4_router___logs_are_equal_route@18: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 dup extract 0 8 // on error: Index access is out of bounds @@ -478,7 +478,7 @@ __puya_arc4_router___bare_routing@21: bnz __puya_arc4_router___after_if_else@25 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/typed_abi_call/out_O2/Logger.destructured.ir b/test_cases/typed_abi_call/out_O2/Logger.destructured.ir index b61dc12dc8..7ecd6950bc 100644 --- a/test_cases/typed_abi_call/out_O2/Logger.destructured.ir +++ b/test_cases/typed_abi_call/out_O2/Logger.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -27,9 +27,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -38,9 +38,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (! tmp%18#0) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) - (assert tmp%20#0) // is not creating + (assert tmp%20#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -49,54 +49,54 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (! tmp%28#0) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) - (assert tmp%30#0) // is not creating + (assert tmp%30#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) - (assert tmp%35#0) // is not creating + (assert tmp%35#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (! tmp%38#0) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) - (assert tmp%40#0) // is not creating + (assert tmp%40#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (! tmp%43#0) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) - (assert tmp%50#0) // is not creating + (assert tmp%50#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -111,9 +111,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (! tmp%61#0) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) - (assert tmp%63#0) // is not creating + (assert tmp%63#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -127,9 +127,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (! tmp%68#0) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) - (assert tmp%70#0) // is not creating + (assert tmp%70#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -143,9 +143,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (! tmp%75#0) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) - (assert tmp%77#0) // is not creating + (assert tmp%77#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -156,9 +156,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (! tmp%82#0) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) - (assert tmp%84#0) // is not creating + (assert tmp%84#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -172,9 +172,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (! tmp%89#0) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) - (assert tmp%91#0) // is not creating + (assert tmp%91#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -212,9 +212,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (! tmp%101#0) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) - (assert tmp%103#0) // is not creating + (assert tmp%103#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -267,9 +267,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (! tmp%107#0) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) - (assert tmp%109#0) // is not creating + (assert tmp%109#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -303,9 +303,9 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (! tmp%139#0) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) - (assert tmp%141#0) // is not creating + (assert tmp%141#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = ((extract 0 8) tmp%143#0) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -331,7 +331,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (! tmp%147#0) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating return 1u block@25: // after_if_else_L25 return 0u diff --git a/test_cases/typed_abi_call/out_unoptimized/Greeter.approval.teal b/test_cases/typed_abi_call/out_unoptimized/Greeter.approval.teal index 9eebb94ece..b7215ec623 100644 --- a/test_cases/typed_abi_call/out_unoptimized/Greeter.approval.teal +++ b/test_cases/typed_abi_call/out_unoptimized/Greeter.approval.teal @@ -43,11 +43,11 @@ __puya_arc4_router___test_is_a_b_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -72,11 +72,11 @@ __puya_arc4_router___test_method_selector_kinds_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -94,11 +94,11 @@ __puya_arc4_router___test_method_overload_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -116,11 +116,11 @@ __puya_arc4_router___test_arg_conversion_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -138,11 +138,11 @@ __puya_arc4_router___test_15plus_args_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -160,11 +160,11 @@ __puya_arc4_router___test_void_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -182,11 +182,11 @@ __puya_arc4_router___test_ref_types_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -207,11 +207,11 @@ __puya_arc4_router___test_native_string_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -229,11 +229,11 @@ __puya_arc4_router___test_native_bytes_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -251,11 +251,11 @@ __puya_arc4_router___test_native_uint64_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -273,11 +273,11 @@ __puya_arc4_router___test_native_biguint_route@12: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -295,11 +295,11 @@ __puya_arc4_router___test_native_tuple_route@13: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -317,11 +317,11 @@ __puya_arc4_router___test_native_tuple_method_ref_route@14: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -339,11 +339,11 @@ __puya_arc4_router___test_nested_tuples_route@15: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -361,11 +361,11 @@ __puya_arc4_router___test_no_args_route@16: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -383,11 +383,11 @@ __puya_arc4_router___test_named_tuples_route@17: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/typed_c2c.py:17 // class Greeter(ARC4Contract): txna ApplicationArgs 1 @@ -415,7 +415,7 @@ __puya_arc4_router_____algopy_default_create@21: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_3 // 1 retsub diff --git a/test_cases/typed_abi_call/out_unoptimized/Greeter.destructured.ir b/test_cases/typed_abi_call/out_unoptimized/Greeter.destructured.ir index 9b90a3a309..4527ad4e56 100644 --- a/test_cases/typed_abi_call/out_unoptimized/Greeter.destructured.ir +++ b/test_cases/typed_abi_call/out_unoptimized/Greeter.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@2: // test_is_a_b_route_L18 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -32,10 +32,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@3: // test_method_selector_kinds_route_L27 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Applications) tmp%19#0) @@ -44,10 +44,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@4: // test_method_overload_route_L40 let tmp%21#0: uint64 = (txn OnCompletion) let tmp%22#0: bool = (== tmp%21#0 NoOp) - (assert tmp%22#0) // OnCompletion is NoOp + (assert tmp%22#0) // OnCompletion is not NoOp let tmp%23#0: uint64 = (txn ApplicationID) let tmp%24#0: bool = (!= tmp%23#0 0u) - (assert tmp%24#0) // is not creating + (assert tmp%24#0) // can only call when not creating let tmp%25#0: bytes = (txna ApplicationArgs 1) let tmp%26#0: uint64 = (btoi tmp%25#0) let tmp%27#0: uint64 = ((txnas Applications) tmp%26#0) @@ -56,10 +56,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@5: // test_arg_conversion_route_L55 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) let tmp%33#0: uint64 = (btoi tmp%32#0) let tmp%34#0: uint64 = ((txnas Applications) tmp%33#0) @@ -68,10 +68,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@6: // test_15plus_args_route_L72 let tmp%35#0: uint64 = (txn OnCompletion) let tmp%36#0: bool = (== tmp%35#0 NoOp) - (assert tmp%36#0) // OnCompletion is NoOp + (assert tmp%36#0) // OnCompletion is not NoOp let tmp%37#0: uint64 = (txn ApplicationID) let tmp%38#0: bool = (!= tmp%37#0 0u) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%39#0: bytes = (txna ApplicationArgs 1) let tmp%40#0: uint64 = (btoi tmp%39#0) let tmp%41#0: uint64 = ((txnas Applications) tmp%40#0) @@ -80,10 +80,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@7: // test_void_route_L100 let tmp%42#0: uint64 = (txn OnCompletion) let tmp%43#0: bool = (== tmp%42#0 NoOp) - (assert tmp%43#0) // OnCompletion is NoOp + (assert tmp%43#0) // OnCompletion is not NoOp let tmp%44#0: uint64 = (txn ApplicationID) let tmp%45#0: bool = (!= tmp%44#0 0u) - (assert tmp%45#0) // is not creating + (assert tmp%45#0) // can only call when not creating let tmp%46#0: bytes = (txna ApplicationArgs 1) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Applications) tmp%47#0) @@ -92,10 +92,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@8: // test_ref_types_route_L114 let tmp%49#0: uint64 = (txn OnCompletion) let tmp%50#0: bool = (== tmp%49#0 NoOp) - (assert tmp%50#0) // OnCompletion is NoOp + (assert tmp%50#0) // OnCompletion is not NoOp let tmp%51#0: uint64 = (txn ApplicationID) let tmp%52#0: bool = (!= tmp%51#0 0u) - (assert tmp%52#0) // is not creating + (assert tmp%52#0) // can only call when not creating let tmp%53#0: bytes = (txna ApplicationArgs 1) let tmp%54#0: uint64 = (btoi tmp%53#0) let tmp%55#0: uint64 = ((txnas Applications) tmp%54#0) @@ -107,10 +107,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@9: // test_native_string_route_L128 let tmp%59#0: uint64 = (txn OnCompletion) let tmp%60#0: bool = (== tmp%59#0 NoOp) - (assert tmp%60#0) // OnCompletion is NoOp + (assert tmp%60#0) // OnCompletion is not NoOp let tmp%61#0: uint64 = (txn ApplicationID) let tmp%62#0: bool = (!= tmp%61#0 0u) - (assert tmp%62#0) // is not creating + (assert tmp%62#0) // can only call when not creating let tmp%63#0: bytes = (txna ApplicationArgs 1) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Applications) tmp%64#0) @@ -119,10 +119,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@10: // test_native_bytes_route_L139 let tmp%66#0: uint64 = (txn OnCompletion) let tmp%67#0: bool = (== tmp%66#0 NoOp) - (assert tmp%67#0) // OnCompletion is NoOp + (assert tmp%67#0) // OnCompletion is not NoOp let tmp%68#0: uint64 = (txn ApplicationID) let tmp%69#0: bool = (!= tmp%68#0 0u) - (assert tmp%69#0) // is not creating + (assert tmp%69#0) // can only call when not creating let tmp%70#0: bytes = (txna ApplicationArgs 1) let tmp%71#0: uint64 = (btoi tmp%70#0) let tmp%72#0: uint64 = ((txnas Applications) tmp%71#0) @@ -131,10 +131,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@11: // test_native_uint64_route_L152 let tmp%73#0: uint64 = (txn OnCompletion) let tmp%74#0: bool = (== tmp%73#0 NoOp) - (assert tmp%74#0) // OnCompletion is NoOp + (assert tmp%74#0) // OnCompletion is not NoOp let tmp%75#0: uint64 = (txn ApplicationID) let tmp%76#0: bool = (!= tmp%75#0 0u) - (assert tmp%76#0) // is not creating + (assert tmp%76#0) // can only call when not creating let tmp%77#0: bytes = (txna ApplicationArgs 1) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Applications) tmp%78#0) @@ -143,10 +143,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@12: // test_native_biguint_route_L163 let tmp%80#0: uint64 = (txn OnCompletion) let tmp%81#0: bool = (== tmp%80#0 NoOp) - (assert tmp%81#0) // OnCompletion is NoOp + (assert tmp%81#0) // OnCompletion is not NoOp let tmp%82#0: uint64 = (txn ApplicationID) let tmp%83#0: bool = (!= tmp%82#0 0u) - (assert tmp%83#0) // is not creating + (assert tmp%83#0) // can only call when not creating let tmp%84#0: bytes = (txna ApplicationArgs 1) let tmp%85#0: uint64 = (btoi tmp%84#0) let tmp%86#0: uint64 = ((txnas Applications) tmp%85#0) @@ -155,10 +155,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@13: // test_native_tuple_route_L174 let tmp%87#0: uint64 = (txn OnCompletion) let tmp%88#0: bool = (== tmp%87#0 NoOp) - (assert tmp%88#0) // OnCompletion is NoOp + (assert tmp%88#0) // OnCompletion is not NoOp let tmp%89#0: uint64 = (txn ApplicationID) let tmp%90#0: bool = (!= tmp%89#0 0u) - (assert tmp%90#0) // is not creating + (assert tmp%90#0) // can only call when not creating let tmp%91#0: bytes = (txna ApplicationArgs 1) let tmp%92#0: uint64 = (btoi tmp%91#0) let tmp%93#0: uint64 = ((txnas Applications) tmp%92#0) @@ -167,10 +167,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@14: // test_native_tuple_method_ref_route_L233 let tmp%94#0: uint64 = (txn OnCompletion) let tmp%95#0: bool = (== tmp%94#0 NoOp) - (assert tmp%95#0) // OnCompletion is NoOp + (assert tmp%95#0) // OnCompletion is not NoOp let tmp%96#0: uint64 = (txn ApplicationID) let tmp%97#0: bool = (!= tmp%96#0 0u) - (assert tmp%97#0) // is not creating + (assert tmp%97#0) // can only call when not creating let tmp%98#0: bytes = (txna ApplicationArgs 1) let tmp%99#0: uint64 = (btoi tmp%98#0) let tmp%100#0: uint64 = ((txnas Applications) tmp%99#0) @@ -179,10 +179,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@15: // test_nested_tuples_route_L283 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (== tmp%101#0 NoOp) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) let tmp%104#0: bool = (!= tmp%103#0 0u) - (assert tmp%104#0) // is not creating + (assert tmp%104#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let tmp%106#0: uint64 = (btoi tmp%105#0) let tmp%107#0: uint64 = ((txnas Applications) tmp%106#0) @@ -191,10 +191,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@16: // test_no_args_route_L329 let tmp%108#0: uint64 = (txn OnCompletion) let tmp%109#0: bool = (== tmp%108#0 NoOp) - (assert tmp%109#0) // OnCompletion is NoOp + (assert tmp%109#0) // OnCompletion is not NoOp let tmp%110#0: uint64 = (txn ApplicationID) let tmp%111#0: bool = (!= tmp%110#0 0u) - (assert tmp%111#0) // is not creating + (assert tmp%111#0) // can only call when not creating let tmp%112#0: bytes = (txna ApplicationArgs 1) let tmp%113#0: uint64 = (btoi tmp%112#0) let tmp%114#0: uint64 = ((txnas Applications) tmp%113#0) @@ -203,10 +203,10 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@17: // test_named_tuples_route_L339 let tmp%115#0: uint64 = (txn OnCompletion) let tmp%116#0: bool = (== tmp%115#0 NoOp) - (assert tmp%116#0) // OnCompletion is NoOp + (assert tmp%116#0) // OnCompletion is not NoOp let tmp%117#0: uint64 = (txn ApplicationID) let tmp%118#0: bool = (!= tmp%117#0 0u) - (assert tmp%118#0) // is not creating + (assert tmp%118#0) // can only call when not creating let tmp%119#0: bytes = (txna ApplicationArgs 1) let tmp%120#0: uint64 = (btoi tmp%119#0) let tmp%121#0: uint64 = ((txnas Applications) tmp%120#0) @@ -222,7 +222,7 @@ contract test_cases.typed_abi_call.typed_c2c.Greeter: block@21: // __algopy_default_create_L1 let tmp%123#0: uint64 = (txn ApplicationID) let tmp%124#0: bool = (== tmp%123#0 0u) - (assert tmp%124#0) // is creating + (assert tmp%124#0) // can only call when creating test_cases.typed_abi_call.typed_c2c.Greeter.__algopy_default_create() return 1u block@22: // switch_case_default_L17 diff --git a/test_cases/typed_abi_call/out_unoptimized/Logger.approval.teal b/test_cases/typed_abi_call/out_unoptimized/Logger.approval.teal index 687e185fc7..189814b4ad 100644 --- a/test_cases/typed_abi_call/out_unoptimized/Logger.approval.teal +++ b/test_cases/typed_abi_call/out_unoptimized/Logger.approval.teal @@ -44,11 +44,11 @@ __puya_arc4_router___is_a_b_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -67,11 +67,11 @@ __puya_arc4_router___echo_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -91,11 +91,11 @@ __puya_arc4_router___no_args_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub no_args itob bytec_0 // 0x151f7c75 @@ -111,11 +111,11 @@ __puya_arc4_router___log_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -131,11 +131,11 @@ __puya_arc4_router___log_route@6: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -151,11 +151,11 @@ __puya_arc4_router___log_route@7: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -171,11 +171,11 @@ __puya_arc4_router___log_route@8: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -191,11 +191,11 @@ __puya_arc4_router___log_route@9: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -211,11 +211,11 @@ __puya_arc4_router___log_route@10: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -242,11 +242,11 @@ __puya_arc4_router___echo_native_string_route@11: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -273,11 +273,11 @@ __puya_arc4_router___echo_native_bytes_route@12: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -304,11 +304,11 @@ __puya_arc4_router___echo_native_uint64_route@13: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -330,11 +330,11 @@ __puya_arc4_router___echo_native_biguint_route@14: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -362,11 +362,11 @@ __puya_arc4_router___echo_native_tuple_route@15: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -444,11 +444,11 @@ __puya_arc4_router___echo_nested_tuple_route@16: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -607,11 +607,11 @@ __puya_arc4_router___return_args_after_14th_route@17: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -688,11 +688,11 @@ __puya_arc4_router___logs_are_equal_route@18: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call/logger.py:25 // class Logger(ARC4Contract): txna ApplicationArgs 1 @@ -765,7 +765,7 @@ __puya_arc4_router_____algopy_default_create@22: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/typed_abi_call/out_unoptimized/Logger.destructured.ir b/test_cases/typed_abi_call/out_unoptimized/Logger.destructured.ir index 4afd23d3e0..684082e7cb 100644 --- a/test_cases/typed_abi_call/out_unoptimized/Logger.destructured.ir +++ b/test_cases/typed_abi_call/out_unoptimized/Logger.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@2: // is_a_b_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -29,10 +29,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@3: // echo_route_L31 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating let tmp%15#0: bytes = (txna ApplicationArgs 1) let tmp%16#0: bytes = test_cases.typed_abi_call.logger.Logger.echo(tmp%15#0) let tmp%17#0: bytes = (concat 0x151f7c75 tmp%16#0) @@ -41,10 +41,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@4: // no_args_route_L35 let tmp%18#0: uint64 = (txn OnCompletion) let tmp%19#0: bool = (== tmp%18#0 NoOp) - (assert tmp%19#0) // OnCompletion is NoOp + (assert tmp%19#0) // OnCompletion is not NoOp let tmp%20#0: uint64 = (txn ApplicationID) let tmp%21#0: bool = (!= tmp%20#0 0u) - (assert tmp%21#0) // is not creating + (assert tmp%21#0) // can only call when not creating let to_encode%0#0: uint64 = test_cases.typed_abi_call.logger.Logger.no_args() let val_as_bytes%0#0: bytes = (itob to_encode%0#0) let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) @@ -53,60 +53,60 @@ contract test_cases.typed_abi_call.logger.Logger: block@5: // log_route_L39 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint64(tmp%27#0) return 1u block@6: // log_route_L43 let tmp%28#0: uint64 = (txn OnCompletion) let tmp%29#0: bool = (== tmp%28#0 NoOp) - (assert tmp%29#0) // OnCompletion is NoOp + (assert tmp%29#0) // OnCompletion is not NoOp let tmp%30#0: uint64 = (txn ApplicationID) let tmp%31#0: bool = (!= tmp%30#0 0u) - (assert tmp%31#0) // is not creating + (assert tmp%31#0) // can only call when not creating let tmp%32#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_uint512(tmp%32#0) return 1u block@7: // log_route_L47 let tmp%33#0: uint64 = (txn OnCompletion) let tmp%34#0: bool = (== tmp%33#0 NoOp) - (assert tmp%34#0) // OnCompletion is NoOp + (assert tmp%34#0) // OnCompletion is not NoOp let tmp%35#0: uint64 = (txn ApplicationID) let tmp%36#0: bool = (!= tmp%35#0 0u) - (assert tmp%36#0) // is not creating + (assert tmp%36#0) // can only call when not creating let tmp%37#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_string(tmp%37#0) return 1u block@8: // log_route_L51 let tmp%38#0: uint64 = (txn OnCompletion) let tmp%39#0: bool = (== tmp%38#0 NoOp) - (assert tmp%39#0) // OnCompletion is NoOp + (assert tmp%39#0) // OnCompletion is not NoOp let tmp%40#0: uint64 = (txn ApplicationID) let tmp%41#0: bool = (!= tmp%40#0 0u) - (assert tmp%41#0) // is not creating + (assert tmp%41#0) // can only call when not creating let tmp%42#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bool(tmp%42#0) return 1u block@9: // log_route_L55 let tmp%43#0: uint64 = (txn OnCompletion) let tmp%44#0: bool = (== tmp%43#0 NoOp) - (assert tmp%44#0) // OnCompletion is NoOp + (assert tmp%44#0) // OnCompletion is not NoOp let tmp%45#0: uint64 = (txn ApplicationID) let tmp%46#0: bool = (!= tmp%45#0 0u) - (assert tmp%46#0) // is not creating + (assert tmp%46#0) // can only call when not creating let tmp%47#0: bytes = (txna ApplicationArgs 1) test_cases.typed_abi_call.logger.Logger.log_bytes(tmp%47#0) return 1u block@10: // log_route_L59 let tmp%48#0: uint64 = (txn OnCompletion) let tmp%49#0: bool = (== tmp%48#0 NoOp) - (assert tmp%49#0) // OnCompletion is NoOp + (assert tmp%49#0) // OnCompletion is not NoOp let tmp%50#0: uint64 = (txn ApplicationID) let tmp%51#0: bool = (!= tmp%50#0 0u) - (assert tmp%51#0) // is not creating + (assert tmp%51#0) // can only call when not creating let tmp%52#0: bytes = (txna ApplicationArgs 1) let tmp%53#0: uint64 = (btoi tmp%52#0) let tmp%54#0: uint64 = ((txnas Assets) tmp%53#0) @@ -121,10 +121,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@11: // echo_native_string_route_L63 let tmp%61#0: uint64 = (txn OnCompletion) let tmp%62#0: bool = (== tmp%61#0 NoOp) - (assert tmp%62#0) // OnCompletion is NoOp + (assert tmp%62#0) // OnCompletion is not NoOp let tmp%63#0: uint64 = (txn ApplicationID) let tmp%64#0: bool = (!= tmp%63#0 0u) - (assert tmp%64#0) // is not creating + (assert tmp%64#0) // can only call when not creating let tmp%65#0: bytes = (txna ApplicationArgs 1) let tmp%66#0: bytes = ((extract 2 0) tmp%65#0) let to_encode%1#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_string(tmp%66#0) @@ -138,10 +138,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@12: // echo_native_bytes_route_L67 let tmp%68#0: uint64 = (txn OnCompletion) let tmp%69#0: bool = (== tmp%68#0 NoOp) - (assert tmp%69#0) // OnCompletion is NoOp + (assert tmp%69#0) // OnCompletion is not NoOp let tmp%70#0: uint64 = (txn ApplicationID) let tmp%71#0: bool = (!= tmp%70#0 0u) - (assert tmp%71#0) // is not creating + (assert tmp%71#0) // can only call when not creating let tmp%72#0: bytes = (txna ApplicationArgs 1) let tmp%73#0: bytes = ((extract 2 0) tmp%72#0) let to_encode%2#0: bytes = test_cases.typed_abi_call.logger.Logger.echo_native_bytes(tmp%73#0) @@ -155,10 +155,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@13: // echo_native_uint64_route_L71 let tmp%75#0: uint64 = (txn OnCompletion) let tmp%76#0: bool = (== tmp%75#0 NoOp) - (assert tmp%76#0) // OnCompletion is NoOp + (assert tmp%76#0) // OnCompletion is not NoOp let tmp%77#0: uint64 = (txn ApplicationID) let tmp%78#0: bool = (!= tmp%77#0 0u) - (assert tmp%78#0) // is not creating + (assert tmp%78#0) // can only call when not creating let tmp%79#0: bytes = (txna ApplicationArgs 1) let tmp%80#0: uint64 = (btoi tmp%79#0) let to_encode%3#0: uint64 = test_cases.typed_abi_call.logger.Logger.echo_native_uint64(tmp%80#0) @@ -169,10 +169,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@14: // echo_native_biguint_route_L75 let tmp%82#0: uint64 = (txn OnCompletion) let tmp%83#0: bool = (== tmp%82#0 NoOp) - (assert tmp%83#0) // OnCompletion is NoOp + (assert tmp%83#0) // OnCompletion is not NoOp let tmp%84#0: uint64 = (txn ApplicationID) let tmp%85#0: bool = (!= tmp%84#0 0u) - (assert tmp%85#0) // is not creating + (assert tmp%85#0) // can only call when not creating let tmp%86#0: bytes = (txna ApplicationArgs 1) let to_encode%4#0: biguint = test_cases.typed_abi_call.logger.Logger.echo_native_biguint(tmp%86#0) let len_%0#0: uint64 = (len to_encode%4#0) @@ -186,10 +186,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@15: // echo_native_tuple_route_L79 let tmp%89#0: uint64 = (txn OnCompletion) let tmp%90#0: bool = (== tmp%89#0 NoOp) - (assert tmp%90#0) // OnCompletion is NoOp + (assert tmp%90#0) // OnCompletion is not NoOp let tmp%91#0: uint64 = (txn ApplicationID) let tmp%92#0: bool = (!= tmp%91#0 0u) - (assert tmp%92#0) // is not creating + (assert tmp%92#0) // can only call when not creating let tmp%93#0: bytes = (txna ApplicationArgs 1) let tmp%94#0: bytes = ((extract 2 0) tmp%93#0) let tmp%95#0: bytes = (txna ApplicationArgs 2) @@ -230,10 +230,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@16: // echo_nested_tuple_route_L85 let tmp%101#0: uint64 = (txn OnCompletion) let tmp%102#0: bool = (== tmp%101#0 NoOp) - (assert tmp%102#0) // OnCompletion is NoOp + (assert tmp%102#0) // OnCompletion is not NoOp let tmp%103#0: uint64 = (txn ApplicationID) let tmp%104#0: bool = (!= tmp%103#0 0u) - (assert tmp%104#0) // is not creating + (assert tmp%104#0) // can only call when not creating let tmp%105#0: bytes = (txna ApplicationArgs 1) let item_start_offset%0#0: uint64 = (extract_uint16 tmp%105#0 0u) let item_end_offset%0#0: uint64 = (extract_uint16 tmp%105#0 2u) @@ -297,10 +297,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@17: // return_args_after_14th_route_L96 let tmp%107#0: uint64 = (txn OnCompletion) let tmp%108#0: bool = (== tmp%107#0 NoOp) - (assert tmp%108#0) // OnCompletion is NoOp + (assert tmp%108#0) // OnCompletion is not NoOp let tmp%109#0: uint64 = (txn ApplicationID) let tmp%110#0: bool = (!= tmp%109#0 0u) - (assert tmp%110#0) // is not creating + (assert tmp%110#0) // can only call when not creating let tmp%111#0: bytes = (txna ApplicationArgs 1) let tmp%112#0: bytes = (txna ApplicationArgs 2) let tmp%113#0: bytes = (txna ApplicationArgs 3) @@ -334,10 +334,10 @@ contract test_cases.typed_abi_call.logger.Logger: block@18: // logs_are_equal_route_L124 let tmp%139#0: uint64 = (txn OnCompletion) let tmp%140#0: bool = (== tmp%139#0 NoOp) - (assert tmp%140#0) // OnCompletion is NoOp + (assert tmp%140#0) // OnCompletion is not NoOp let tmp%141#0: uint64 = (txn ApplicationID) let tmp%142#0: bool = (!= tmp%141#0 0u) - (assert tmp%142#0) // is not creating + (assert tmp%142#0) // can only call when not creating let tmp%143#0: bytes = (txna ApplicationArgs 1) let item0%3#0: bytes = (extract3 tmp%143#0 0u 8u) // on error: Index access is out of bounds let item0%3%0#0: uint64 = (btoi item0%3#0) @@ -367,7 +367,7 @@ contract test_cases.typed_abi_call.logger.Logger: block@22: // __algopy_default_create_L1 let tmp%147#0: uint64 = (txn ApplicationID) let tmp%148#0: bool = (== tmp%147#0 0u) - (assert tmp%148#0) // is creating + (assert tmp%148#0) // can only call when creating test_cases.typed_abi_call.logger.Logger.__algopy_default_create() return 1u block@23: // switch_case_default_L25 diff --git a/test_cases/typed_abi_call/puya.log b/test_cases/typed_abi_call/puya.log index 44e2d660ab..8652f50f84 100644 --- a/test_cases/typed_abi_call/puya.log +++ b/test_cases/typed_abi_call/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing typed_abi_call/out/module.awst debug: Sealing block@0: // L12 @@ -15626,6 +15626,7 @@ debug: Inserted test_named_tuples_block@0.ops[60]: 'l-store-copy tmp%4#0 1' debug: Replaced test_named_tuples_block@0.ops[73]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 3 edge set/s for test_cases.typed_abi_call.typed_c2c.Greeter.__puya_arc4_router__ info: Writing typed_abi_call/out/Logger.arc32.json +info: Writing typed_abi_call/out/Logger.arc56.json info: Writing typed_abi_call/out/Logger.approval.teal info: Writing typed_abi_call/out/Logger.clear.teal info: Writing typed_abi_call/out/Logger.approval.bin @@ -15633,6 +15634,7 @@ info: Writing typed_abi_call/out/Logger.clear.bin info: Writing typed_abi_call/out/Logger.approval.puya.map info: Writing typed_abi_call/out/Logger.clear.puya.map info: Writing typed_abi_call/out/Greeter.arc32.json +info: Writing typed_abi_call/out/Greeter.arc56.json info: Writing typed_abi_call/out/Greeter.approval.teal info: Writing typed_abi_call/out/Greeter.clear.teal info: Writing typed_abi_call/out/Greeter.approval.bin diff --git a/test_cases/typed_abi_call_txn/out/Caller.approval.mir b/test_cases/typed_abi_call_txn/out/Caller.approval.mir index cc920dabec..be58c3bbff 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.approval.mir +++ b/test_cases/typed_abi_call_txn/out/Caller.approval.mir @@ -36,9 +36,9 @@ __puya_arc4_router___test_call_with_txn_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -62,9 +62,9 @@ __puya_arc4_router___test_call_with_acfg_route@3: // @arc4.abimethod txn OnCompletion tmp%14#0 ! tmp%15#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%16#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 tmp%18#0 @@ -88,9 +88,9 @@ __puya_arc4_router___test_call_with_infer_route@4: // @arc4.abimethod txn OnCompletion tmp%25#0 ! tmp%26#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%27#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 tmp%29#0 @@ -114,9 +114,9 @@ __puya_arc4_router___test_call_with_acfg_no_return_route@5: // @arc4.abimethod txn OnCompletion tmp%36#0 ! tmp%37#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%38#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 tmp%40#0 @@ -145,7 +145,7 @@ __puya_arc4_router___bare_routing@8: __puya_arc4_router_____algopy_default_create@9: txn ApplicationID tmp%48#0 ! tmp%49#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/typed_abi_call_txn/out/Caller.approval.teal b/test_cases/typed_abi_call_txn/out/Caller.approval.teal index 8e116b9a68..a70c93bca0 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.approval.teal +++ b/test_cases/typed_abi_call_txn/out/Caller.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___test_call_with_txn_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -48,9 +48,9 @@ __puya_arc4_router___test_call_with_acfg_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -71,9 +71,9 @@ __puya_arc4_router___test_call_with_infer_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -94,9 +94,9 @@ __puya_arc4_router___test_call_with_acfg_no_return_route@5: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -119,7 +119,7 @@ __puya_arc4_router___bare_routing@8: bnz __puya_arc4_router___after_if_else@12 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out/Caller.arc32.json b/test_cases/typed_abi_call_txn/out/Caller.arc32.json index dee5905a78..f877de52b8 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.arc32.json +++ b/test_cases/typed_abi_call_txn/out/Caller.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgNgogICAgYnl0ZWNibG9jayAiVEVTVCIgIlRTVCIgMHgxNTFmN2M3NSAweDZkNDcwMGFkCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDgKICAgIHB1c2hieXRlc3MgMHgyODRjMWU2MSAweGFhMzNjMWJhIDB4NGY5NjA3MWEgMHhiYjAwOThhMiAvLyBtZXRob2QgInRlc3RfY2FsbF93aXRoX3R4bihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmcoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2NhbGxfd2l0aF9pbmZlcihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxieXRlW10sYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9pbmZlcl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDUKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfdHhuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9hY2ZnX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2NhbGxfd2l0aF9hY2ZnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9pbmZlcl9yb3V0ZUA0OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfaW5mZXIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF90eG4oYTogYnl0ZXMsIGI6IGJ5dGVzLCBhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9jYWxsX3dpdGhfdHhuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9jYWxsX3dpdGhfdHhuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMi0yOAogICAgLy8gYXNzZXRfaWQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4sCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMAogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTkKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTcKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjIyLTI4CiAgICAvLyBhc3NldF9pZCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4biwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjQKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI2CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjItMjgKICAgIC8vIGFzc2V0X2lkLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfdHhuLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGExZjUwNDBkIC8vIG1ldGhvZCAiY2FsbF93aXRoX3R4bihieXRlW10sdHhuLGJ5dGVbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI5CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfY2FsbF93aXRoX2FjZmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2NhbGxfd2l0aF9hY2ZnKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozOC00NAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZywKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozNQogICAgLy8gYXNzZXRfbmFtZT0iVEVTVCIsCiAgICBieXRlY18wIC8vICJURVNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzQKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjXzEgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozMwogICAgLy8gdHhuID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzgtNDQKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmcsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9uZXh0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQwCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0MgogICAgLy8gYiwKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM4LTQ0CiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9pbmZlcihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9pbmZlcjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDYtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2luZmVyKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1My01OQogICAgLy8gYXJjNC5hYmlfY2FsbFtVSW50NjRdKAogICAgLy8gICAgICJjYWxsX3dpdGhfYWNmZyIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1MQogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTAKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ5CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDgKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjUzLTU5CiAgICAvLyBhcmM0LmFiaV9jYWxsW1VJbnQ2NF0oCiAgICAvLyAgICAgImNhbGxfd2l0aF9hY2ZnIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTUKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjU3CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTMtNTkKICAgIC8vIGFyYzQuYWJpX2NhbGxbVUludDY0XSgKICAgIC8vICAgICAiY2FsbF93aXRoX2FjZmciLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjEtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjYKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjY1CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzAgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2NAogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWNfMSAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYzCiAgICAvLyBhY2ZnID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjgtNzAKICAgIC8vIHR4bjEgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjkKICAgIC8vIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgzMQogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM4NDAwNzdkIC8vIG1ldGhvZCAiY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxhY2ZnLGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTm90ZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3MQogICAgLy8gYXNzZXJ0IHR4bjEubm90ZSA9PSBiIjEiCiAgICBwdXNoYnl0ZXMgMHgzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3NAogICAgLy8gYXNzZXRfaWQgPSBvcC5HSVR4bi5jcmVhdGVkX2Fzc2V0X2lkKDApCiAgICBnaXR4biAwIENyZWF0ZWRBc3NldElECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5Ojc1CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCB0byBiZSBjcmVhdGVkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIGNyZWF0ZWQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgNgogICAgYnl0ZWNibG9jayAiVEVTVCIgIlRTVCIgMHgxNTFmN2M3NSAweDZkNDcwMGFkCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDgKICAgIHB1c2hieXRlc3MgMHgyODRjMWU2MSAweGFhMzNjMWJhIDB4NGY5NjA3MWEgMHhiYjAwOThhMiAvLyBtZXRob2QgInRlc3RfY2FsbF93aXRoX3R4bihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmcoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2NhbGxfd2l0aF9pbmZlcihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxieXRlW10sYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9pbmZlcl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDUKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2NhbGxfd2l0aF90eG4KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfYWNmZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jYWxsX3dpdGhfaW5mZXJfcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfaW5mZXIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF90eG4oYTogYnl0ZXMsIGI6IGJ5dGVzLCBhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9jYWxsX3dpdGhfdHhuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9jYWxsX3dpdGhfdHhuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMi0yOAogICAgLy8gYXNzZXRfaWQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4sCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMAogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTkKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTcKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjIyLTI4CiAgICAvLyBhc3NldF9pZCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4biwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjQKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI2CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjItMjgKICAgIC8vIGFzc2V0X2lkLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfdHhuLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGExZjUwNDBkIC8vIG1ldGhvZCAiY2FsbF93aXRoX3R4bihieXRlW10sdHhuLGJ5dGVbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI5CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfY2FsbF93aXRoX2FjZmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2NhbGxfd2l0aF9hY2ZnKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozOC00NAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZywKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozNQogICAgLy8gYXNzZXRfbmFtZT0iVEVTVCIsCiAgICBieXRlY18wIC8vICJURVNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzQKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjXzEgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozMwogICAgLy8gdHhuID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzgtNDQKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmcsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9uZXh0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQwCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0MgogICAgLy8gYiwKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM4LTQ0CiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9pbmZlcihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9pbmZlcjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDYtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2luZmVyKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1My01OQogICAgLy8gYXJjNC5hYmlfY2FsbFtVSW50NjRdKAogICAgLy8gICAgICJjYWxsX3dpdGhfYWNmZyIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1MQogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTAKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ5CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDgKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjUzLTU5CiAgICAvLyBhcmM0LmFiaV9jYWxsW1VJbnQ2NF0oCiAgICAvLyAgICAgImNhbGxfd2l0aF9hY2ZnIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTUKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjU3CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTMtNTkKICAgIC8vIGFyYzQuYWJpX2NhbGxbVUludDY0XSgKICAgIC8vICAgICAiY2FsbF93aXRoX2FjZmciLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjEtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjYKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjY1CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzAgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2NAogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWNfMSAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYzCiAgICAvLyBhY2ZnID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjgtNzAKICAgIC8vIHR4bjEgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjkKICAgIC8vIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgzMQogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM4NDAwNzdkIC8vIG1ldGhvZCAiY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxhY2ZnLGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTm90ZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3MQogICAgLy8gYXNzZXJ0IHR4bjEubm90ZSA9PSBiIjEiCiAgICBwdXNoYnl0ZXMgMHgzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3NAogICAgLy8gYXNzZXRfaWQgPSBvcC5HSVR4bi5jcmVhdGVkX2Fzc2V0X2lkKDApCiAgICBnaXR4biAwIENyZWF0ZWRBc3NldElECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5Ojc1CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCB0byBiZSBjcmVhdGVkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIGNyZWF0ZWQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/typed_abi_call_txn/out/Caller.arc56.json b/test_cases/typed_abi_call_txn/out/Caller.arc56.json new file mode 100644 index 0000000000..042b8e5183 --- /dev/null +++ b/test_cases/typed_abi_call_txn/out/Caller.arc56.json @@ -0,0 +1,228 @@ +{ + "name": "Caller", + "structs": {}, + "methods": [ + { + "name": "test_call_with_txn", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_call_with_acfg", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_call_with_infer", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_call_with_acfg_no_return", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 287, + 358, + 427 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 80, + 110, + 140, + 170 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 205 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 83, + 113, + 143, + 173 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 289 + ], + "errorMessage": "expected asset id" + }, + { + "pc": [ + 508 + ], + "errorMessage": "expected asset to be created" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgNgogICAgYnl0ZWNibG9jayAiVEVTVCIgIlRTVCIgMHgxNTFmN2M3NSAweDZkNDcwMGFkCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDgKICAgIHB1c2hieXRlc3MgMHgyODRjMWU2MSAweGFhMzNjMWJhIDB4NGY5NjA3MWEgMHhiYjAwOThhMiAvLyBtZXRob2QgInRlc3RfY2FsbF93aXRoX3R4bihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmcoYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2NhbGxfd2l0aF9pbmZlcihieXRlW10sYnl0ZVtdLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxieXRlW10sYXBwbGljYXRpb24pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9pbmZlcl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDUKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2NhbGxfd2l0aF90eG4KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfYWNmZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jYWxsX3dpdGhfaW5mZXJfcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfaW5mZXIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF90eG4oYTogYnl0ZXMsIGI6IGJ5dGVzLCBhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9jYWxsX3dpdGhfdHhuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9jYWxsX3dpdGhfdHhuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMi0yOAogICAgLy8gYXNzZXRfaWQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4sCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMAogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTkKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTcKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjIyLTI4CiAgICAvLyBhc3NldF9pZCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4biwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjQKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI2CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjItMjgKICAgIC8vIGFzc2V0X2lkLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfdHhuLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGExZjUwNDBkIC8vIG1ldGhvZCAiY2FsbF93aXRoX3R4bihieXRlW10sdHhuLGJ5dGVbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjI5CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfY2FsbF93aXRoX2FjZmc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2NhbGxfd2l0aF9hY2ZnKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozOC00NAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZywKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM2CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozNQogICAgLy8gYXNzZXRfbmFtZT0iVEVTVCIsCiAgICBieXRlY18wIC8vICJURVNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzQKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjXzEgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozMwogICAgLy8gdHhuID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzgtNDQKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmcsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9uZXh0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQwCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0MgogICAgLy8gYiwKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM4LTQ0CiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9pbmZlcihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9pbmZlcjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDYtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2luZmVyKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1My01OQogICAgLy8gYXJjNC5hYmlfY2FsbFtVSW50NjRdKAogICAgLy8gICAgICJjYWxsX3dpdGhfYWNmZyIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1MQogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTAKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ5CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDgKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjUzLTU5CiAgICAvLyBhcmM0LmFiaV9jYWxsW1VJbnQ2NF0oCiAgICAvLyAgICAgImNhbGxfd2l0aF9hY2ZnIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTUKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjU3CiAgICAvLyBiLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTMtNTkKICAgIC8vIGFyYzQuYWJpX2NhbGxbVUludDY0XSgKICAgIC8vICAgICAiY2FsbF93aXRoX2FjZmciLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4uY2FsbGVyLkNhbGxlci50ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybihhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjEtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcywgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjYKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjY1CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzAgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2NAogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWNfMSAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjYzCiAgICAvLyBhY2ZnID0gaXR4bi5Bc3NldENvbmZpZygKICAgIGludGNfMiAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjgtNzAKICAgIC8vIHR4bjEgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NjkKICAgIC8vIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybiwgYSwgYWNmZywgYiwgYXBwX2lkPWFwcCwgbm90ZT1iIjEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgzMQogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo2OC03MAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM4NDAwNzdkIC8vIG1ldGhvZCAiY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxhY2ZnLGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTm90ZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3MQogICAgLy8gYXNzZXJ0IHR4bjEubm90ZSA9PSBiIjEiCiAgICBwdXNoYnl0ZXMgMHgzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo3NAogICAgLy8gYXNzZXRfaWQgPSBvcC5HSVR4bi5jcmVhdGVkX2Fzc2V0X2lkKDApCiAgICBnaXR4biAwIENyZWF0ZWRBc3NldElECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5Ojc1CiAgICAvLyBhc3NlcnQgYXNzZXRfaWQsICJleHBlY3RlZCBhc3NldCB0byBiZSBjcmVhdGVkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIGNyZWF0ZWQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEDBiYEBFRFU1QDVFNUBBUffHUEbUcArYgAAUOKAAExG0EAnYIEBChMHmEEqjPBugRPlgcaBLsAmKI2GgCOBAACACAAPgBcIokxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiABpI4kxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiACcI4kxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiADDI4kxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiADqI4kxGUAABjEYFEQjiSKJigMAsSOyIiiyJimyJSSyECKyAbaL/RUWVwYCi/1Qi/4VFlcGAov+UIv/shiABKH1BA2yGkyyGrIaJbIQIrIBs7cBPklXBABMVwAEKhJEF0SJigMAsSOyIiiyJimyJSSyECKyAbaL/RUWVwYCi/1Qi/4VFlcGAov+UIv/shgrshpMshqyGiWyECKyAbO3AT5XAAQqEkSJigMAsSOyIiiyJimyJSSyECKyAbaL/RUWVwYCi/1Qi/4VFlcGAov+UIv/shgrshpMshqyGiWyECKyAbO3AT5XAAQqEkSJigMAsSOyIiiyJimyJSSyECKyAbaL/RUWVwYCi/1Qi/4VFlcGAov+UIABMbIFi/+yGIAEyEAHfbIaTLIasholshAisgGztAWAATESRLcAPESJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/typed_abi_call_txn/out/Caller.destructured.ir b/test_cases/typed_abi_call_txn/out/Caller.destructured.ir index 64da012608..3c561dceca 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.destructured.ir +++ b/test_cases/typed_abi_call_txn/out/Caller.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -45,9 +45,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -60,9 +60,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (! tmp%36#0) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -78,7 +78,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating return 1u block@12: // after_if_else_L14 return 0u diff --git a/test_cases/typed_abi_call_txn/out/Caller.ssa.ir b/test_cases/typed_abi_call_txn/out/Caller.ssa.ir index d186320b3d..687edbcf8f 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.ssa.ir +++ b/test_cases/typed_abi_call_txn/out/Caller.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -32,10 +32,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -48,10 +48,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (== tmp%25#0 NoOp) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (!= tmp%27#0 0u) - (assert tmp%28#0) // is not creating + (assert tmp%28#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -64,10 +64,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (== tmp%36#0 NoOp) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) let tmp%39#0: bool = (!= tmp%38#0 0u) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -87,7 +87,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (== tmp%48#0 0u) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating test_cases.typed_abi_call_txn.caller.Caller.__algopy_default_create() return 1u block@10: // switch_case_default_L14 diff --git a/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_1.ir b/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_1.ir index b79cbf4908..1fd112a86e 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_1.ir +++ b/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -45,9 +45,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -60,9 +60,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (! tmp%36#0) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -78,7 +78,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating return 1u block@12: // after_if_else_L14 return 0u diff --git a/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_2.ir b/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_2.ir index 64da012608..3c561dceca 100644 --- a/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_2.ir +++ b/test_cases/typed_abi_call_txn/out/Caller.ssa.opt_pass_2.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -45,9 +45,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -60,9 +60,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (! tmp%36#0) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -78,7 +78,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating return 1u block@12: // after_if_else_L14 return 0u diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.approval.mir b/test_cases/typed_abi_call_txn/out/TxnContract.approval.mir index 0e43d18ee6..0c2c51dba9 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.approval.mir +++ b/test_cases/typed_abi_call_txn/out/TxnContract.approval.mir @@ -35,9 +35,9 @@ __puya_arc4_router___call_with_txn_route@2: // @arc4.abimethod txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 tmp%7#0 @@ -66,9 +66,9 @@ __puya_arc4_router___call_with_acfg_route@3: // @arc4.abimethod txn OnCompletion tmp%13#0 ! tmp%14#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%15#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 tmp%17#0 @@ -102,9 +102,9 @@ __puya_arc4_router___call_with_acfg_no_return_route@4: // @arc4.abimethod txn OnCompletion tmp%23#0 ! tmp%24#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%25#0 - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 tmp%27#0 @@ -138,7 +138,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router_____algopy_default_create@8: txn ApplicationID tmp%33#0 ! tmp%34#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.approval.teal b/test_cases/typed_abi_call_txn/out/TxnContract.approval.teal index 080bfe8cd2..99e1004a5d 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.approval.teal +++ b/test_cases/typed_abi_call_txn/out/TxnContract.approval.teal @@ -25,9 +25,9 @@ __puya_arc4_router___call_with_txn_route@2: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -53,9 +53,9 @@ __puya_arc4_router___call_with_acfg_route@3: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -86,9 +86,9 @@ __puya_arc4_router___call_with_acfg_no_return_route@4: // @arc4.abimethod txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -116,7 +116,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.arc32.json b/test_cases/typed_abi_call_txn/out/TxnContract.arc32.json index b4fdb52ccd..74f8ecc23b 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.arc32.json +++ b/test_cases/typed_abi_call_txn/out/TxnContract.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDMgMAogICAgYnl0ZWNibG9jayAweDYxIDB4NjIgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGExZjUwNDBkIDB4NmQ0NzAwYWQgMHhjODQwMDc3ZCAvLyBtZXRob2QgImNhbGxfd2l0aF90eG4oYnl0ZVtdLHR4bixieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oYnl0ZVtdLGFjZmcsYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfdHhuX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANAogICAgaW50Y18yIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUeG5Db250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfdHhuCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19yb3V0ZUAzOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUeG5Db250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhY2ZnCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGxfd2l0aF9hY2ZnCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4bihhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdWludDY0OgpjYWxsX3dpdGhfdHhuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX3R4bihzZWxmLCBhOiBCeXRlcywgYWNmZzogZ3R4bi5UcmFuc2FjdGlvbiwgYjogQnl0ZXMpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNAogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCBhY2ZnLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLkFzc2V0Q29uZmlnLCAiZXhwZWN0ZWQgYXNzZXQgY29uZmlnIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgY29uZmlnCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE3CiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxOAogICAgLy8gcmV0dXJuIGFjZmcuY3JlYXRlZF9hc3NldC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnKGE6IGJ5dGVzLCBhY2ZnOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CmNhbGxfd2l0aF9hY2ZnOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMC0yMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX2FjZmcoc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwgYjogQnl0ZXMpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMgogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYWNmZy5jcmVhdGVkX2Fzc2V0LmlkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGE6IGJ5dGVzLCBhY2ZnOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB2b2lkOgpjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm46CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI3LTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oCiAgICAvLyAgICAgc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwgYjogQnl0ZXMKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weTozMQogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDMgMAogICAgYnl0ZWNibG9jayAweDYxIDB4NjIgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGExZjUwNDBkIDB4NmQ0NzAwYWQgMHhjODQwMDc3ZCAvLyBtZXRob2QgImNhbGxfd2l0aF90eG4oYnl0ZVtdLHR4bixieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oYnl0ZVtdLGFjZmcsYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfdHhuX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANAogICAgaW50Y18yIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGxfd2l0aF90eG4KICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NhbGxfd2l0aF9hY2ZnX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZwogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzIgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4oYTogYnl0ZXMsIGFjZmc6IHVpbnQ2NCwgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKY2FsbF93aXRoX3R4bjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTItMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGxfd2l0aF90eG4oc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uVHJhbnNhY3Rpb24sIGI6IEJ5dGVzKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTQKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgYWNmZy50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZywgImV4cGVjdGVkIGFzc2V0IGNvbmZpZyIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGNvbmZpZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXJ0IGFjZmcuY3JlYXRlZF9hc3NldC5pZCwgImV4cGVjdGVkIGFzc2V0IGlkIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBDcmVhdGVkQXNzZXRJRAogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTgKICAgIC8vIHJldHVybiBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGxfdHhuLnR4bl9jb250cmFjdC5UeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZyhhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdWludDY0OgpjYWxsX3dpdGhfYWNmZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjAtMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGxfd2l0aF9hY2ZnKHNlbGYsIGE6IEJ5dGVzLCBhY2ZnOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sIGI6IEJ5dGVzKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjIKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMwogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyNQogICAgLy8gcmV0dXJuIGFjZmcuY3JlYXRlZF9hc3NldC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybihhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdm9pZDoKY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyNy0zMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKAogICAgLy8gICAgIHNlbGYsIGE6IEJ5dGVzLCBhY2ZnOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sIGI6IEJ5dGVzCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgaWQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json b/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json new file mode 100644 index 0000000000..c9be9d4862 --- /dev/null +++ b/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json @@ -0,0 +1,214 @@ +{ + "name": "TxnContract", + "structs": {}, + "methods": [ + { + "name": "call_with_txn", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "txn", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "call_with_acfg", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "acfg", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "call_with_acfg_no_return", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "acfg", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 62, + 95, + 134 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 185, + 212, + 232 + ], + "errorMessage": "a is not a" + }, + { + "pc": [ + 190, + 217, + 237 + ], + "errorMessage": "b is not b" + }, + { + "pc": [ + 173 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 65, + 98, + 137 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 197 + ], + "errorMessage": "expected asset config" + }, + { + "pc": [ + 203, + 223, + 242 + ], + "errorMessage": "expected asset id" + }, + { + "pc": [ + 114, + 153 + ], + "errorMessage": "transaction type is acfg" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDMgMAogICAgYnl0ZWNibG9jayAweDYxIDB4NjIgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGExZjUwNDBkIDB4NmQ0NzAwYWQgMHhjODQwMDc3ZCAvLyBtZXRob2QgImNhbGxfd2l0aF90eG4oYnl0ZVtdLHR4bixieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oYnl0ZVtdLGFjZmcsYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfdHhuX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANAogICAgaW50Y18yIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGxfd2l0aF90eG4KICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NhbGxfd2l0aF9hY2ZnX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZwogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzIgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4oYTogYnl0ZXMsIGFjZmc6IHVpbnQ2NCwgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKY2FsbF93aXRoX3R4bjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTItMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGxfd2l0aF90eG4oc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uVHJhbnNhY3Rpb24sIGI6IEJ5dGVzKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTQKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgYWNmZy50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldENvbmZpZywgImV4cGVjdGVkIGFzc2V0IGNvbmZpZyIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGNvbmZpZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXJ0IGFjZmcuY3JlYXRlZF9hc3NldC5pZCwgImV4cGVjdGVkIGFzc2V0IGlkIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBDcmVhdGVkQXNzZXRJRAogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTgKICAgIC8vIHJldHVybiBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGxfdHhuLnR4bl9jb250cmFjdC5UeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZyhhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdWludDY0OgpjYWxsX3dpdGhfYWNmZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjAtMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGxfd2l0aF9hY2ZnKHNlbGYsIGE6IEJ5dGVzLCBhY2ZnOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sIGI6IEJ5dGVzKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjIKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMwogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyNQogICAgLy8gcmV0dXJuIGFjZmcuY3JlYXRlZF9hc3NldC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnX25vX3JldHVybihhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdm9pZDoKY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyNy0zMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKAogICAgLy8gICAgIHNlbGYsIGE6IEJ5dGVzLCBhY2ZnOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sIGI6IEJ5dGVzCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBhID09IGIiYSIsICJhIGlzIG5vdCBhIgogICAgZnJhbWVfZGlnIC0zCiAgICBieXRlY18wIC8vIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IGIgPT0gYiJiIiwgImIgaXMgbm90IGIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gMHg2MgogICAgPT0KICAgIGFzc2VydCAvLyBiIGlzIG5vdCBiCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgaWQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiADAQMAJgMBYQFiBBUffHWIAAFDigABMRtBAIiCAwSh9QQNBG1HAK0EyEAHfTYaAI4DAAIAIwBKJIkxGRREMRhENhoBVwIAMRYiCTYaAlcCAIgAXRYqTFCwIokxGRREMRhENhoBVwIAMRYiCUk4ECMSRDYaAlcCAIgAURYqTFCwIokxGRREMRhENhoBVwIAMRYiCUk4ECMSRDYaAlcCAIgAPiKJMRlAAAYxGBREIokkiYoDAYv9KBJEi/8pEkSL/jgQIxJEi/44PElEiYoDAYv9KBJEi/8pEkSL/jg8SUSJigMAi/0oEkSL/ykSRIv+ODxEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.destructured.ir b/test_cases/typed_abi_call_txn/out/TxnContract.destructured.ir index 1622505088..7d8847b5f1 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.destructured.ir +++ b/test_cases/typed_abi_call_txn/out/TxnContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@2: // call_with_txn_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: uint64 = (txn GroupIndex) @@ -32,9 +32,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@3: // call_with_acfg_route_L20 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let tmp%19#0: uint64 = (txn GroupIndex) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@4: // call_with_acfg_no_return_route_L27 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) let tmp%28#0: bytes = ((extract 2 0) tmp%27#0) let tmp%29#0: uint64 = (txn GroupIndex) @@ -72,7 +72,7 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@8: // __algopy_default_create_L1 let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // is creating + (assert tmp%34#0) // can only call when creating return 1u block@11: // after_if_else_L11 return 0u diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.ssa.ir b/test_cases/typed_abi_call_txn/out/TxnContract.ssa.ir index 42dce5122c..7f26725346 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.ssa.ir +++ b/test_cases/typed_abi_call_txn/out/TxnContract.ssa.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@2: // call_with_txn_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: uint64 = (txn GroupIndex) @@ -34,10 +34,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@3: // call_with_acfg_route_L20 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let tmp%19#0: uint64 = (txn GroupIndex) @@ -55,10 +55,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@4: // call_with_acfg_no_return_route_L27 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) let tmp%28#0: bytes = ((extract 2 0) tmp%27#0) let tmp%29#0: uint64 = (txn GroupIndex) @@ -80,7 +80,7 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@8: // __algopy_default_create_L1 let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (== tmp%33#0 0u) - (assert tmp%34#0) // is creating + (assert tmp%34#0) // can only call when creating test_cases.typed_abi_call_txn.txn_contract.TxnContract.__algopy_default_create() return 1u block@9: // switch_case_default_L11 diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.ssa.opt_pass_1.ir b/test_cases/typed_abi_call_txn/out/TxnContract.ssa.opt_pass_1.ir index 1622505088..7d8847b5f1 100644 --- a/test_cases/typed_abi_call_txn/out/TxnContract.ssa.opt_pass_1.ir +++ b/test_cases/typed_abi_call_txn/out/TxnContract.ssa.opt_pass_1.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@2: // call_with_txn_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: uint64 = (txn GroupIndex) @@ -32,9 +32,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@3: // call_with_acfg_route_L20 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let tmp%19#0: uint64 = (txn GroupIndex) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@4: // call_with_acfg_no_return_route_L27 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) let tmp%28#0: bytes = ((extract 2 0) tmp%27#0) let tmp%29#0: uint64 = (txn GroupIndex) @@ -72,7 +72,7 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@8: // __algopy_default_create_L1 let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // is creating + (assert tmp%34#0) // can only call when creating return 1u block@11: // after_if_else_L11 return 0u diff --git a/test_cases/typed_abi_call_txn/out_O2/Caller.approval.teal b/test_cases/typed_abi_call_txn/out_O2/Caller.approval.teal index d08c1a6f1c..8095e1d3e6 100644 --- a/test_cases/typed_abi_call_txn/out_O2/Caller.approval.teal +++ b/test_cases/typed_abi_call_txn/out_O2/Caller.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___test_call_with_txn_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -38,9 +38,9 @@ __puya_arc4_router___test_call_with_txn_route@2: __puya_arc4_router___test_call_with_acfg_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -55,9 +55,9 @@ __puya_arc4_router___test_call_with_acfg_route@3: __puya_arc4_router___test_call_with_infer_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -72,9 +72,9 @@ __puya_arc4_router___test_call_with_infer_route@4: __puya_arc4_router___test_call_with_acfg_no_return_route@5: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 @@ -91,7 +91,7 @@ __puya_arc4_router___bare_routing@8: bnz __puya_arc4_router___after_if_else@12 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_1 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out_O2/Caller.destructured.ir b/test_cases/typed_abi_call_txn/out_O2/Caller.destructured.ir index 64da012608..3c561dceca 100644 --- a/test_cases/typed_abi_call_txn/out_O2/Caller.destructured.ir +++ b/test_cases/typed_abi_call_txn/out_O2/Caller.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -30,9 +30,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (! tmp%14#0) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -45,9 +45,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (! tmp%25#0) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) - (assert tmp%27#0) // is not creating + (assert tmp%27#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -60,9 +60,9 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (! tmp%36#0) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) - (assert tmp%38#0) // is not creating + (assert tmp%38#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -78,7 +78,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (! tmp%48#0) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating return 1u block@12: // after_if_else_L14 return 0u diff --git a/test_cases/typed_abi_call_txn/out_O2/TxnContract.approval.teal b/test_cases/typed_abi_call_txn/out_O2/TxnContract.approval.teal index bcdc3e3869..9ae71cf299 100644 --- a/test_cases/typed_abi_call_txn/out_O2/TxnContract.approval.teal +++ b/test_cases/typed_abi_call_txn/out_O2/TxnContract.approval.teal @@ -21,9 +21,9 @@ __puya_arc4_router__: __puya_arc4_router___call_with_txn_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txn GroupIndex @@ -43,9 +43,9 @@ __puya_arc4_router___call_with_txn_route@2: __puya_arc4_router___call_with_acfg_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txn GroupIndex @@ -70,9 +70,9 @@ __puya_arc4_router___call_with_acfg_route@3: __puya_arc4_router___call_with_acfg_no_return_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating txna ApplicationArgs 1 extract 2 0 txn GroupIndex @@ -94,7 +94,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out_O2/TxnContract.destructured.ir b/test_cases/typed_abi_call_txn/out_O2/TxnContract.destructured.ir index 1622505088..7d8847b5f1 100644 --- a/test_cases/typed_abi_call_txn/out_O2/TxnContract.destructured.ir +++ b/test_cases/typed_abi_call_txn/out_O2/TxnContract.destructured.ir @@ -15,9 +15,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@2: // call_with_txn_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: uint64 = (txn GroupIndex) @@ -32,9 +32,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@3: // call_with_acfg_route_L20 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (! tmp%13#0) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) - (assert tmp%15#0) // is not creating + (assert tmp%15#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let tmp%19#0: uint64 = (txn GroupIndex) @@ -52,9 +52,9 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@4: // call_with_acfg_no_return_route_L27 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (! tmp%23#0) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + (assert tmp%25#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) let tmp%28#0: bytes = ((extract 2 0) tmp%27#0) let tmp%29#0: uint64 = (txn GroupIndex) @@ -72,7 +72,7 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@8: // __algopy_default_create_L1 let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (! tmp%33#0) - (assert tmp%34#0) // is creating + (assert tmp%34#0) // can only call when creating return 1u block@11: // after_if_else_L11 return 0u diff --git a/test_cases/typed_abi_call_txn/out_unoptimized/Caller.approval.teal b/test_cases/typed_abi_call_txn/out_unoptimized/Caller.approval.teal index 49c9db598a..e6e530675d 100644 --- a/test_cases/typed_abi_call_txn/out_unoptimized/Caller.approval.teal +++ b/test_cases/typed_abi_call_txn/out_unoptimized/Caller.approval.teal @@ -31,11 +31,11 @@ __puya_arc4_router___test_call_with_txn_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -60,11 +60,11 @@ __puya_arc4_router___test_call_with_acfg_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -89,11 +89,11 @@ __puya_arc4_router___test_call_with_infer_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -118,11 +118,11 @@ __puya_arc4_router___test_call_with_acfg_no_return_route@5: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/caller.py:14 // class Caller(ARC4Contract): txna ApplicationArgs 1 @@ -157,7 +157,7 @@ __puya_arc4_router_____algopy_default_create@9: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out_unoptimized/Caller.destructured.ir b/test_cases/typed_abi_call_txn/out_unoptimized/Caller.destructured.ir index 9020d4f3e2..0752678e28 100644 --- a/test_cases/typed_abi_call_txn/out_unoptimized/Caller.destructured.ir +++ b/test_cases/typed_abi_call_txn/out_unoptimized/Caller.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@2: // test_call_with_txn_route_L15 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: bytes = (txna ApplicationArgs 2) @@ -32,10 +32,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@3: // test_call_with_acfg_route_L31 let tmp%14#0: uint64 = (txn OnCompletion) let tmp%15#0: bool = (== tmp%14#0 NoOp) - (assert tmp%15#0) // OnCompletion is NoOp + (assert tmp%15#0) // OnCompletion is not NoOp let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (!= tmp%16#0 0u) - (assert tmp%17#0) // is not creating + (assert tmp%17#0) // can only call when not creating let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: bytes = ((extract 2 0) tmp%18#0) let tmp%20#0: bytes = (txna ApplicationArgs 2) @@ -48,10 +48,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@4: // test_call_with_infer_route_L46 let tmp%25#0: uint64 = (txn OnCompletion) let tmp%26#0: bool = (== tmp%25#0 NoOp) - (assert tmp%26#0) // OnCompletion is NoOp + (assert tmp%26#0) // OnCompletion is not NoOp let tmp%27#0: uint64 = (txn ApplicationID) let tmp%28#0: bool = (!= tmp%27#0 0u) - (assert tmp%28#0) // is not creating + (assert tmp%28#0) // can only call when not creating let tmp%29#0: bytes = (txna ApplicationArgs 1) let tmp%30#0: bytes = ((extract 2 0) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) @@ -64,10 +64,10 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@5: // test_call_with_acfg_no_return_route_L61 let tmp%36#0: uint64 = (txn OnCompletion) let tmp%37#0: bool = (== tmp%36#0 NoOp) - (assert tmp%37#0) // OnCompletion is NoOp + (assert tmp%37#0) // OnCompletion is not NoOp let tmp%38#0: uint64 = (txn ApplicationID) let tmp%39#0: bool = (!= tmp%38#0 0u) - (assert tmp%39#0) // is not creating + (assert tmp%39#0) // can only call when not creating let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: bytes = ((extract 2 0) tmp%40#0) let tmp%42#0: bytes = (txna ApplicationArgs 2) @@ -87,7 +87,7 @@ contract test_cases.typed_abi_call_txn.caller.Caller: block@9: // __algopy_default_create_L1 let tmp%48#0: uint64 = (txn ApplicationID) let tmp%49#0: bool = (== tmp%48#0 0u) - (assert tmp%49#0) // is creating + (assert tmp%49#0) // can only call when creating test_cases.typed_abi_call_txn.caller.Caller.__algopy_default_create() return 1u block@10: // switch_case_default_L14 diff --git a/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.approval.teal b/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.approval.teal index c4db8ba6f3..cda1fea67c 100644 --- a/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.approval.teal +++ b/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.approval.teal @@ -30,11 +30,11 @@ __puya_arc4_router___call_with_txn_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -64,11 +64,11 @@ __puya_arc4_router___call_with_acfg_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -103,11 +103,11 @@ __puya_arc4_router___call_with_acfg_no_return_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating // typed_abi_call_txn/txn_contract.py:11 // class TxnContract(ARC4Contract): txna ApplicationArgs 1 @@ -147,7 +147,7 @@ __puya_arc4_router_____algopy_default_create@8: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.destructured.ir b/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.destructured.ir index 42dce5122c..7f26725346 100644 --- a/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.destructured.ir +++ b/test_cases/typed_abi_call_txn/out_unoptimized/TxnContract.destructured.ir @@ -16,10 +16,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@2: // call_with_txn_route_L12 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating let tmp%7#0: bytes = (txna ApplicationArgs 1) let tmp%8#0: bytes = ((extract 2 0) tmp%7#0) let tmp%9#0: uint64 = (txn GroupIndex) @@ -34,10 +34,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@3: // call_with_acfg_route_L20 let tmp%13#0: uint64 = (txn OnCompletion) let tmp%14#0: bool = (== tmp%13#0 NoOp) - (assert tmp%14#0) // OnCompletion is NoOp + (assert tmp%14#0) // OnCompletion is not NoOp let tmp%15#0: uint64 = (txn ApplicationID) let tmp%16#0: bool = (!= tmp%15#0 0u) - (assert tmp%16#0) // is not creating + (assert tmp%16#0) // can only call when not creating let tmp%17#0: bytes = (txna ApplicationArgs 1) let tmp%18#0: bytes = ((extract 2 0) tmp%17#0) let tmp%19#0: uint64 = (txn GroupIndex) @@ -55,10 +55,10 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@4: // call_with_acfg_no_return_route_L27 let tmp%23#0: uint64 = (txn OnCompletion) let tmp%24#0: bool = (== tmp%23#0 NoOp) - (assert tmp%24#0) // OnCompletion is NoOp + (assert tmp%24#0) // OnCompletion is not NoOp let tmp%25#0: uint64 = (txn ApplicationID) let tmp%26#0: bool = (!= tmp%25#0 0u) - (assert tmp%26#0) // is not creating + (assert tmp%26#0) // can only call when not creating let tmp%27#0: bytes = (txna ApplicationArgs 1) let tmp%28#0: bytes = ((extract 2 0) tmp%27#0) let tmp%29#0: uint64 = (txn GroupIndex) @@ -80,7 +80,7 @@ contract test_cases.typed_abi_call_txn.txn_contract.TxnContract: block@8: // __algopy_default_create_L1 let tmp%33#0: uint64 = (txn ApplicationID) let tmp%34#0: bool = (== tmp%33#0 0u) - (assert tmp%34#0) // is creating + (assert tmp%34#0) // can only call when creating test_cases.typed_abi_call_txn.txn_contract.TxnContract.__algopy_default_create() return 1u block@9: // switch_case_default_L11 diff --git a/test_cases/typed_abi_call_txn/puya.log b/test_cases/typed_abi_call_txn/puya.log index 661f1d39a9..6c8cab6371 100644 --- a/test_cases/typed_abi_call_txn/puya.log +++ b/test_cases/typed_abi_call_txn/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call_txn'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call_txn'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing typed_abi_call_txn/out/module.awst debug: Sealing block@0: // L12 @@ -2034,6 +2034,7 @@ debug: Inserted test_call_with_acfg_no_return_block@0.ops[27]: 'l-store-copy enc debug: Replaced test_call_with_acfg_no_return_block@0.ops[52]: 'v-load encoded_value%0#0' with 'l-load encoded_value%0#0' debug: Found 3 edge set/s for test_cases.typed_abi_call_txn.caller.Caller.__puya_arc4_router__ info: Writing typed_abi_call_txn/out/TxnContract.arc32.json +info: Writing typed_abi_call_txn/out/TxnContract.arc56.json info: Writing typed_abi_call_txn/out/TxnContract.approval.teal info: Writing typed_abi_call_txn/out/TxnContract.clear.teal info: Writing typed_abi_call_txn/out/TxnContract.approval.bin @@ -2041,6 +2042,7 @@ info: Writing typed_abi_call_txn/out/TxnContract.clear.bin info: Writing typed_abi_call_txn/out/TxnContract.approval.puya.map info: Writing typed_abi_call_txn/out/TxnContract.clear.puya.map info: Writing typed_abi_call_txn/out/Caller.arc32.json +info: Writing typed_abi_call_txn/out/Caller.arc56.json info: Writing typed_abi_call_txn/out/Caller.approval.teal info: Writing typed_abi_call_txn/out/Caller.clear.teal info: Writing typed_abi_call_txn/out/Caller.approval.bin diff --git a/test_cases/unary/puya.log b/test_cases/unary/puya.log index e5af9178b5..f7f6e1cec4 100644 --- a/test_cases/unary/puya.log +++ b/test_cases/unary/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unary'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unary'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing unary/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/unassigned_expression/out/Unassigned.approval.mir b/test_cases/unassigned_expression/out/Unassigned.approval.mir index 85c71445d7..9a787294cc 100644 --- a/test_cases/unassigned_expression/out/Unassigned.approval.mir +++ b/test_cases/unassigned_expression/out/Unassigned.approval.mir @@ -35,9 +35,9 @@ __puya_arc4_router___discard_op_route@2: // @arc4.abimethod() txn OnCompletion tmp%3#0 ! tmp%4#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%5#0 - assert // is not creating + assert // can only call when not creating callsub discard_op int 1 1 retsub 1 @@ -47,9 +47,9 @@ __puya_arc4_router___discard_subroutine_route@3: // @arc4.abimethod() txn OnCompletion tmp%7#0 ! tmp%8#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%9#0 - assert // is not creating + assert // can only call when not creating callsub discard_subroutine int 1 1 retsub 1 @@ -59,9 +59,9 @@ __puya_arc4_router___discard_constants_route@4: // @arc4.abimethod() txn OnCompletion tmp%11#0 ! tmp%12#0 - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID tmp%13#0 - assert // is not creating + assert // can only call when not creating int 1 1 retsub 1 @@ -75,7 +75,7 @@ __puya_arc4_router___bare_routing@7: __puya_arc4_router_____algopy_default_create@8: txn ApplicationID tmp%16#0 ! tmp%17#0 - assert // is creating + assert // can only call when creating int 1 1 retsub 1 diff --git a/test_cases/unassigned_expression/out/Unassigned.approval.teal b/test_cases/unassigned_expression/out/Unassigned.approval.teal index 30f7271935..aec026e3ef 100644 --- a/test_cases/unassigned_expression/out/Unassigned.approval.teal +++ b/test_cases/unassigned_expression/out/Unassigned.approval.teal @@ -24,9 +24,9 @@ __puya_arc4_router___discard_op_route@2: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub discard_op intc_0 // 1 retsub @@ -36,9 +36,9 @@ __puya_arc4_router___discard_subroutine_route@3: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub discard_subroutine intc_0 // 1 retsub @@ -48,9 +48,9 @@ __puya_arc4_router___discard_constants_route@4: // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -61,7 +61,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/unassigned_expression/out/Unassigned.arc32.json b/test_cases/unassigned_expression/out/Unassigned.arc32.json index 3c4949c63e..a4d8a9cffb 100644 --- a/test_cases/unassigned_expression/out/Unassigned.arc32.json +++ b/test_cases/unassigned_expression/out/Unassigned.arc32.json @@ -17,7 +17,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGJiZDYxNjljIDB4YjY2N2JjMTQgMHgwNzU2ZGJmMSAvLyBtZXRob2QgImRpc2NhcmRfb3AoKXZvaWQiLCBtZXRob2QgImRpc2NhcmRfc3Vicm91dGluZSgpdm9pZCIsIG1ldGhvZCAiZGlzY2FyZF9jb25zdGFudHMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kaXNjYXJkX29wX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9vcF9yb3V0ZUAyOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGRpc2NhcmRfb3AKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Rpc2NhcmRfc3Vicm91dGluZV9yb3V0ZUAzOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGRpc2NhcmRfc3Vicm91dGluZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANDoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmRpc2NhcmRfb3AoKSAtPiB2b2lkOgpkaXNjYXJkX29wOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBkaXNjYXJkX29wKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo3CiAgICAvLyBvcC5iemVybygxMCkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGJ6ZXJvCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudW5hc3NpZ25lZF9leHByZXNzaW9uLmNvbnRyYWN0LlVuYXNzaWduZWQuZGlzY2FyZF9zdWJyb3V0aW5lKCkgLT4gdm9pZDoKZGlzY2FyZF9zdWJyb3V0aW5lOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjktMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZGlzY2FyZF9zdWJyb3V0aW5lKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToxMQogICAgLy8gZ2V0X2FfdmFsdWUoKQogICAgY2FsbHN1YiBnZXRfYV92YWx1ZQogICAgcG9wCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5nZXRfYV92YWx1ZSgpIC0+IHVpbnQ2NDoKZ2V0X2FfdmFsdWU6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MjAtMjEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2FfdmFsdWUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToyMgogICAgLy8gcmV0dXJuIFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGJiZDYxNjljIDB4YjY2N2JjMTQgMHgwNzU2ZGJmMSAvLyBtZXRob2QgImRpc2NhcmRfb3AoKXZvaWQiLCBtZXRob2QgImRpc2NhcmRfc3Vicm91dGluZSgpdm9pZCIsIG1ldGhvZCAiZGlzY2FyZF9jb25zdGFudHMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kaXNjYXJkX29wX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9vcF9yb3V0ZUAyOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGlzY2FyZF9vcAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDM6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBkaXNjYXJkX3N1YnJvdXRpbmUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Rpc2NhcmRfY29uc3RhbnRzX3JvdXRlQDQ6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy51bmFzc2lnbmVkX2V4cHJlc3Npb24uY29udHJhY3QuVW5hc3NpZ25lZC5kaXNjYXJkX29wKCkgLT4gdm9pZDoKZGlzY2FyZF9vcDoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZGlzY2FyZF9vcChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6NwogICAgLy8gb3AuYnplcm8oMTApCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBiemVybwogICAgcG9wCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmRpc2NhcmRfc3Vicm91dGluZSgpIC0+IHZvaWQ6CmRpc2NhcmRfc3Vicm91dGluZToKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo5LTEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGRpc2NhcmRfc3Vicm91dGluZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MTEKICAgIC8vIGdldF9hX3ZhbHVlKCkKICAgIGNhbGxzdWIgZ2V0X2FfdmFsdWUKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy51bmFzc2lnbmVkX2V4cHJlc3Npb24uY29udHJhY3QuZ2V0X2FfdmFsdWUoKSAtPiB1aW50NjQ6CmdldF9hX3ZhbHVlOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjIwLTIxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9hX3ZhbHVlKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MjIKICAgIC8vIHJldHVybiBVSW50NjQoNDIpCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/unassigned_expression/out/Unassigned.arc56.json b/test_cases/unassigned_expression/out/Unassigned.arc56.json new file mode 100644 index 0000000000..8f5763bfd0 --- /dev/null +++ b/test_cases/unassigned_expression/out/Unassigned.arc56.json @@ -0,0 +1,138 @@ +{ + "name": "Unassigned", + "structs": {}, + "methods": [ + { + "name": "discard_op", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "discard_subroutine", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "discard_constants", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 62, + 74 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 88 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 53, + 65, + 77 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGJiZDYxNjljIDB4YjY2N2JjMTQgMHgwNzU2ZGJmMSAvLyBtZXRob2QgImRpc2NhcmRfb3AoKXZvaWQiLCBtZXRob2QgImRpc2NhcmRfc3Vicm91dGluZSgpdm9pZCIsIG1ldGhvZCAiZGlzY2FyZF9jb25zdGFudHMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kaXNjYXJkX29wX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9vcF9yb3V0ZUAyOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGlzY2FyZF9vcAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDM6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBkaXNjYXJkX3N1YnJvdXRpbmUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Rpc2NhcmRfY29uc3RhbnRzX3JvdXRlQDQ6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy51bmFzc2lnbmVkX2V4cHJlc3Npb24uY29udHJhY3QuVW5hc3NpZ25lZC5kaXNjYXJkX29wKCkgLT4gdm9pZDoKZGlzY2FyZF9vcDoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZGlzY2FyZF9vcChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6NwogICAgLy8gb3AuYnplcm8oMTApCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBiemVybwogICAgcG9wCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmRpc2NhcmRfc3Vicm91dGluZSgpIC0+IHZvaWQ6CmRpc2NhcmRfc3Vicm91dGluZToKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo5LTEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGRpc2NhcmRfc3Vicm91dGluZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MTEKICAgIC8vIGdldF9hX3ZhbHVlKCkKICAgIGNhbGxzdWIgZ2V0X2FfdmFsdWUKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy51bmFzc2lnbmVkX2V4cHJlc3Npb24uY29udHJhY3QuZ2V0X2FfdmFsdWUoKSAtPiB1aW50NjQ6CmdldF9hX3ZhbHVlOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjIwLTIxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9hX3ZhbHVlKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MjIKICAgIC8vIHJldHVybiBVSW50NjQoNDIpCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBAD+CAwS71hacBLZnvBQEB1bb8TYaAI4DAAIADgAaI4kxGRREMRhEiAAkIokxGRREMRhEiAAgIokxGRREMRhEIokxGUAABjEYFEQiiSOJigAAgQqvSImKAACIAAJIiYoAAYEqiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 99, + "minor": 99, + "patch": 99 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/test_cases/unassigned_expression/out/Unassigned.destructured.ir b/test_cases/unassigned_expression/out/Unassigned.destructured.ir index 22d4419177..114f107340 100644 --- a/test_cases/unassigned_expression/out/Unassigned.destructured.ir +++ b/test_cases/unassigned_expression/out/Unassigned.destructured.ir @@ -15,25 +15,25 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@2: // discard_op_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_op() return 1u block@3: // discard_subroutine_route_L9 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_subroutine() return 1u block@4: // discard_constants_route_L13 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@7: // bare_routing_L4 let tmp%15#0: uint64 = (txn OnCompletion) @@ -41,7 +41,7 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@8: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@11: // after_if_else_L4 return 0u diff --git a/test_cases/unassigned_expression/out/Unassigned.ssa.ir b/test_cases/unassigned_expression/out/Unassigned.ssa.ir index 24fb911c6c..26894fa5c0 100644 --- a/test_cases/unassigned_expression/out/Unassigned.ssa.ir +++ b/test_cases/unassigned_expression/out/Unassigned.ssa.ir @@ -16,28 +16,28 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@2: // discard_op_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_op() return 1u block@3: // discard_subroutine_route_L9 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_subroutine() return 1u block@4: // discard_constants_route_L13 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_constants() return 1u block@5: // switch_case_default_L4 @@ -50,7 +50,7 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@8: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.unassigned_expression.contract.Unassigned.__algopy_default_create() return 1u block@9: // switch_case_default_L4 diff --git a/test_cases/unassigned_expression/out/Unassigned.ssa.opt_pass_1.ir b/test_cases/unassigned_expression/out/Unassigned.ssa.opt_pass_1.ir index 22d4419177..114f107340 100644 --- a/test_cases/unassigned_expression/out/Unassigned.ssa.opt_pass_1.ir +++ b/test_cases/unassigned_expression/out/Unassigned.ssa.opt_pass_1.ir @@ -15,25 +15,25 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@2: // discard_op_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_op() return 1u block@3: // discard_subroutine_route_L9 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_subroutine() return 1u block@4: // discard_constants_route_L13 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@7: // bare_routing_L4 let tmp%15#0: uint64 = (txn OnCompletion) @@ -41,7 +41,7 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@8: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@11: // after_if_else_L4 return 0u diff --git a/test_cases/unassigned_expression/out_O2/Unassigned.approval.teal b/test_cases/unassigned_expression/out_O2/Unassigned.approval.teal index e28669112d..b8d67005b9 100644 --- a/test_cases/unassigned_expression/out_O2/Unassigned.approval.teal +++ b/test_cases/unassigned_expression/out_O2/Unassigned.approval.teal @@ -20,9 +20,9 @@ __puya_arc4_router__: __puya_arc4_router___discard_op_route@2: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub discard_op intc_0 // 1 retsub @@ -30,9 +30,9 @@ __puya_arc4_router___discard_op_route@2: __puya_arc4_router___discard_subroutine_route@3: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub discard_subroutine intc_0 // 1 retsub @@ -40,9 +40,9 @@ __puya_arc4_router___discard_subroutine_route@3: __puya_arc4_router___discard_constants_route@4: txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating + assert // can only call when not creating intc_0 // 1 retsub @@ -51,7 +51,7 @@ __puya_arc4_router___bare_routing@7: bnz __puya_arc4_router___after_if_else@11 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub diff --git a/test_cases/unassigned_expression/out_O2/Unassigned.destructured.ir b/test_cases/unassigned_expression/out_O2/Unassigned.destructured.ir index 22d4419177..114f107340 100644 --- a/test_cases/unassigned_expression/out_O2/Unassigned.destructured.ir +++ b/test_cases/unassigned_expression/out_O2/Unassigned.destructured.ir @@ -15,25 +15,25 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@2: // discard_op_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) - (assert tmp%5#0) // is not creating + (assert tmp%5#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_op() return 1u block@3: // discard_subroutine_route_L9 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (! tmp%7#0) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating + (assert tmp%9#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_subroutine() return 1u block@4: // discard_constants_route_L13 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating + (assert tmp%13#0) // can only call when not creating return 1u block@7: // bare_routing_L4 let tmp%15#0: uint64 = (txn OnCompletion) @@ -41,7 +41,7 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@8: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (! tmp%16#0) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating return 1u block@11: // after_if_else_L4 return 0u diff --git a/test_cases/unassigned_expression/out_unoptimized/Unassigned.approval.teal b/test_cases/unassigned_expression/out_unoptimized/Unassigned.approval.teal index 62bc319b35..aa633bbfa6 100644 --- a/test_cases/unassigned_expression/out_unoptimized/Unassigned.approval.teal +++ b/test_cases/unassigned_expression/out_unoptimized/Unassigned.approval.teal @@ -29,11 +29,11 @@ __puya_arc4_router___discard_op_route@2: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub discard_op intc_1 // 1 retsub @@ -44,11 +44,11 @@ __puya_arc4_router___discard_subroutine_route@3: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub discard_subroutine intc_1 // 1 retsub @@ -59,11 +59,11 @@ __puya_arc4_router___discard_constants_route@4: txn OnCompletion intc_0 // NoOp == - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID intc_0 // 0 != - assert // is not creating + assert // can only call when not creating callsub discard_constants intc_1 // 1 retsub @@ -84,7 +84,7 @@ __puya_arc4_router_____algopy_default_create@8: txn ApplicationID intc_0 // 0 == - assert // is creating + assert // can only call when creating callsub __algopy_default_create intc_1 // 1 retsub diff --git a/test_cases/unassigned_expression/out_unoptimized/Unassigned.destructured.ir b/test_cases/unassigned_expression/out_unoptimized/Unassigned.destructured.ir index 24fb911c6c..26894fa5c0 100644 --- a/test_cases/unassigned_expression/out_unoptimized/Unassigned.destructured.ir +++ b/test_cases/unassigned_expression/out_unoptimized/Unassigned.destructured.ir @@ -16,28 +16,28 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@2: // discard_op_route_L5 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) - (assert tmp%4#0) // OnCompletion is NoOp + (assert tmp%4#0) // OnCompletion is not NoOp let tmp%5#0: uint64 = (txn ApplicationID) let tmp%6#0: bool = (!= tmp%5#0 0u) - (assert tmp%6#0) // is not creating + (assert tmp%6#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_op() return 1u block@3: // discard_subroutine_route_L9 let tmp%7#0: uint64 = (txn OnCompletion) let tmp%8#0: bool = (== tmp%7#0 NoOp) - (assert tmp%8#0) // OnCompletion is NoOp + (assert tmp%8#0) // OnCompletion is not NoOp let tmp%9#0: uint64 = (txn ApplicationID) let tmp%10#0: bool = (!= tmp%9#0 0u) - (assert tmp%10#0) // is not creating + (assert tmp%10#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_subroutine() return 1u block@4: // discard_constants_route_L13 let tmp%11#0: uint64 = (txn OnCompletion) let tmp%12#0: bool = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp + (assert tmp%12#0) // OnCompletion is not NoOp let tmp%13#0: uint64 = (txn ApplicationID) let tmp%14#0: bool = (!= tmp%13#0 0u) - (assert tmp%14#0) // is not creating + (assert tmp%14#0) // can only call when not creating test_cases.unassigned_expression.contract.Unassigned.discard_constants() return 1u block@5: // switch_case_default_L4 @@ -50,7 +50,7 @@ contract test_cases.unassigned_expression.contract.Unassigned: block@8: // __algopy_default_create_L1 let tmp%16#0: uint64 = (txn ApplicationID) let tmp%17#0: bool = (== tmp%16#0 0u) - (assert tmp%17#0) // is creating + (assert tmp%17#0) // can only call when creating test_cases.unassigned_expression.contract.Unassigned.__algopy_default_create() return 1u block@9: // switch_case_default_L4 diff --git a/test_cases/unassigned_expression/puya.log b/test_cases/unassigned_expression/puya.log index bb1d03c4c2..57760f8c04 100644 --- a/test_cases/unassigned_expression/puya.log +++ b/test_cases/unassigned_expression/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unassigned_expression'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unassigned_expression'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv unassigned_expression/contract.py:7:9 warning: expression result is ignored unassigned_expression/contract.py:11:9 warning: expression result is ignored @@ -673,6 +673,7 @@ debug: Inserted __puya_arc4_router_____algopy_default_create@8.ops[5]: 'l-store- debug: Replaced __puya_arc4_router_____algopy_default_create@8.ops[7]: 'v-load tmp%17#0' with 'l-load tmp%17#0' debug: Found 3 edge set/s for test_cases.unassigned_expression.contract.Unassigned.__puya_arc4_router__ info: Writing unassigned_expression/out/Unassigned.arc32.json +info: Writing unassigned_expression/out/Unassigned.arc56.json info: Writing unassigned_expression/out/Unassigned.approval.teal info: Writing unassigned_expression/out/Unassigned.clear.teal info: Writing unassigned_expression/out/Unassigned.approval.bin diff --git a/test_cases/undefined_phi_args/puya.log b/test_cases/undefined_phi_args/puya.log index 33b74c7f66..52c7093a00 100644 --- a/test_cases/undefined_phi_args/puya.log +++ b/test_cases/undefined_phi_args/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['undefined_phi_args'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['undefined_phi_args'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing undefined_phi_args/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/unssa/puya.log b/test_cases/unssa/puya.log index bb4c4bb2e0..c5131152fd 100644 --- a/test_cases/unssa/puya.log +++ b/test_cases/unssa/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv unssa/contract.py:6:9 warning: expression result is ignored unssa/contract.py:13:9 warning: expression result is ignored diff --git a/test_cases/with_reentrancy/puya.log b/test_cases/with_reentrancy/puya.log index bc676ebf62..25430d3d29 100644 --- a/test_cases/with_reentrancy/puya.log +++ b/test_cases/with_reentrancy/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['with_reentrancy'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['with_reentrancy'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv with_reentrancy/contract.py:9:9 warning: expression result is ignored info: writing with_reentrancy/out/module.awst diff --git a/tests/test_cli.py b/tests/test_cli.py index 1768620046..b66c708dd2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -45,6 +45,7 @@ def run_puyapy( def run_puyapy_clientgen( path: Path, + *flags: str, ) -> subprocess.CompletedProcess[str]: puyapy_clientgen = shutil.which("puyapy-clientgen") assert puyapy_clientgen is not None @@ -52,6 +53,7 @@ def run_puyapy_clientgen( [ puyapy_clientgen, str(path), + *flags, ], text=True, # capture stdout @@ -100,13 +102,27 @@ def test_run_directory() -> None: run_puyapy([TEST_CASES_DIR / "simple"]) +@pytest.mark.parametrize( + "case", + [ + pytest.param(path, id=str(path.relative_to(VCS_ROOT))) + for test_dir in ("arc_56", "abi_routing") + for path in (TEST_CASES_DIR / test_dir).rglob("out/*.arc32.json") + ], +) +def test_puyapy_clientgen_arc32(case: Path, tmpdir: Path) -> None: + # ARC-32 output differs slightly from ARC-56, so we are just checking it doesn't error + # and ignore the generated artifact + run_puyapy_clientgen(case, "--out-dir", str(tmpdir)) + + @pytest.mark.parametrize( "case", [ pytest.param(path, id=str(path.relative_to(VCS_ROOT))) for test_dir in (EXAMPLES_DIR, TEST_CASES_DIR) - for path in test_dir.rglob("out/*.arc32.json") + for path in test_dir.rglob("out/*.arc56.json") ], ) -def test_puyapy_clientgen(case: Path) -> None: +def test_puyapy_clientgen_arc56(case: Path) -> None: run_puyapy_clientgen(case) diff --git a/tests/test_compile.py b/tests/test_compile.py index bb222b8205..12966bd6fa 100644 --- a/tests/test_compile.py +++ b/tests/test_compile.py @@ -1,3 +1,4 @@ +import json import os import shutil import subprocess @@ -40,6 +41,7 @@ def _should_output(path: Path, puyapy_options: PuyaPyOptions) -> bool: for pattern, include_in_output in { "*.teal": puyapy_options.output_teal, "*.arc32.json": puyapy_options.output_arc32, + "*.arc56.json": puyapy_options.output_arc56, "*.awst": puyapy_options.output_awst, "*.ssa.ir": puyapy_options.output_ssa_ir, "*.ssa.opt_pass_*.ir": puyapy_options.output_optimization_ir, @@ -81,6 +83,10 @@ def compile_test_case( encoding="utf8", ) + # normalize ARC-56 output + for arc56_file in dst_out_dir.rglob("*.arc56.json"): + _normalize_arc56(arc56_file) + def _normalize_path(path: Path | str) -> str: return str(path).replace("\\", "/") @@ -124,6 +130,7 @@ def compile_with_level1_optimizations(test_case: PuyaTestCase) -> None: output_bytecode=True, output_source_map=True, output_arc32=True, + output_arc56=True, output_awst=True, output_ssa_ir=True, output_optimization_ir=True, @@ -173,3 +180,12 @@ def check_for_diff(path: Path) -> str | None: ) stdout += result.stdout.decode("utf8") return stdout or None + + +def _normalize_arc56(path: Path) -> None: + arc56 = json.loads(path.read_text()) + compiler_version = arc56.get("compilerInfo", {}).get("compilerVersion", {}) + compiler_version["major"] = 99 + compiler_version["minor"] = 99 + compiler_version["patch"] = 99 + path.write_text(json.dumps(arc56, indent=4), encoding="utf8") diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py index e9c657145b..69d61deaed 100644 --- a/tests/utils/__init__.py +++ b/tests/utils/__init__.py @@ -20,7 +20,7 @@ from tests import EXAMPLES_DIR, TEST_CASES_DIR -APPROVAL_EXTENSIONS = frozenset((".teal", ".awst", ".ir", ".mir", ".arc32.json")) +APPROVAL_EXTENSIONS = frozenset((".teal", ".awst", ".ir", ".mir", ".arc32.json", ".arc56.json")) UNSTABLE_LOG_PREFIXES = { LogLevel.debug: ( "Building AWST for ", @@ -188,7 +188,9 @@ def compile_src_from_options(options: PuyaPyOptions) -> CompilationResult: filtered_teal = [t for t in teal if t.id in narrow_compilation_set] if options.output_client: - write_arc32_clients(narrow_compilation_set, filtered_teal) + write_arc32_clients( + options.template_vars_prefix, narrow_compilation_set, filtered_teal + ) return CompilationResult( module_awst=awst,