diff --git a/examples/sizes.txt b/examples/sizes.txt index f8312d59ee..e80140f0a6 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -35,7 +35,7 @@ chained_assignment/ChainedAssignment 88 87 - | 30 30 - compile/Hello 219 181 - | 105 85 - compile/HelloBase 200 156 - | 96 74 - - compile/HelloFactory 7113 6555 - | 921 697 - + compile/HelloFactory 7275 6674 - | 1011 760 - compile/HelloOtherConstants 306 277 - | 135 121 - compile/HelloPrfx 213 168 - | 100 77 - compile/HelloTmpl 213 168 - | 100 77 - diff --git a/stubs/algopy-stubs/arc4.pyi b/stubs/algopy-stubs/arc4.pyi index ff3e2bb392..14d8371fd7 100644 --- a/stubs/algopy-stubs/arc4.pyi +++ b/stubs/algopy-stubs/arc4.pyi @@ -515,11 +515,11 @@ class _ABICallWithReturnProtocol(typing.Protocol[_TABIResult_co]): on_completion: algopy.OnCompleteAction = ..., approval_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., clear_state_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., - global_num_uint: UInt64 | int = ..., - global_num_bytes: UInt64 | int = ..., - local_num_uint: UInt64 | int = ..., - local_num_bytes: UInt64 | int = ..., - extra_program_pages: UInt64 | int = ..., + global_num_uint: algopy.UInt64 | int = ..., + global_num_bytes: algopy.UInt64 | int = ..., + local_num_uint: algopy.UInt64 | int = ..., + local_num_bytes: algopy.UInt64 | int = ..., + extra_program_pages: algopy.UInt64 | int = ..., fee: algopy.UInt64 | int = 0, sender: algopy.Account | str = ..., note: algopy.Bytes | bytes | str = ..., @@ -537,11 +537,11 @@ class _ABICallProtocolType(typing.Protocol): on_completion: algopy.OnCompleteAction = ..., approval_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., clear_state_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., - global_num_uint: UInt64 | int = ..., - global_num_bytes: UInt64 | int = ..., - local_num_uint: UInt64 | int = ..., - local_num_bytes: UInt64 | int = ..., - extra_program_pages: UInt64 | int = ..., + global_num_uint: algopy.UInt64 | int = ..., + global_num_bytes: algopy.UInt64 | int = ..., + local_num_uint: algopy.UInt64 | int = ..., + local_num_bytes: algopy.UInt64 | int = ..., + extra_program_pages: algopy.UInt64 | int = ..., fee: algopy.UInt64 | int = 0, sender: algopy.Account | str = ..., note: algopy.Bytes | bytes | str = ..., @@ -557,11 +557,11 @@ class _ABICallProtocolType(typing.Protocol): on_completion: algopy.OnCompleteAction = ..., approval_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., clear_state_program: algopy.Bytes | bytes | tuple[algopy.Bytes, ...] = ..., - global_num_uint: UInt64 | int = ..., - global_num_bytes: UInt64 | int = ..., - local_num_uint: UInt64 | int = ..., - local_num_bytes: UInt64 | int = ..., - extra_program_pages: UInt64 | int = ..., + global_num_uint: algopy.UInt64 | int = ..., + global_num_bytes: algopy.UInt64 | int = ..., + local_num_uint: algopy.UInt64 | int = ..., + local_num_bytes: algopy.UInt64 | int = ..., + extra_program_pages: algopy.UInt64 | int = ..., fee: algopy.UInt64 | int = 0, sender: algopy.Account | str = ..., note: algopy.Bytes | algopy.String | bytes | str = ..., diff --git a/stubs/pyproject.toml b/stubs/pyproject.toml index 4525fd900b..52c1999d18 100644 --- a/stubs/pyproject.toml +++ b/stubs/pyproject.toml @@ -3,7 +3,7 @@ name = "algorand-python" # this version represents the version of the stub API's and should follow semver semantics # when updating this value also update src/compile.py:MAX_SUPPORTED_ALGOPY_VERSION_EX if it is a major/minor change # also see stubs/README.md#versioning -version = "2.1.0" +version = "2.1.1" description = "API for writing Algorand Python Smart contracts" authors = ["Algorand Foundation "] readme = "README.md" diff --git a/test_cases/compile/factory.py b/test_cases/compile/factory.py index e185e71cc7..67c349a960 100644 --- a/test_cases/compile/factory.py +++ b/test_cases/compile/factory.py @@ -292,3 +292,25 @@ def test_other_constants(self) -> None: # delete the app arc4.abi_call(HelloOtherConstants.delete, app_id=app) + + @arc4.abimethod() + def test_abi_call_create_params(self) -> None: + compiled = compile_contract(Hello) + app = arc4.abi_call( + Hello.create, + String("hey"), + approval_program=compiled.approval_program, + clear_state_program=compiled.clear_state_program, + global_num_uint=compiled.global_uints, + global_num_bytes=compiled.global_bytes, + local_num_uint=compiled.local_uints, + local_num_bytes=compiled.local_bytes, + extra_program_pages=compiled.extra_program_pages, + ).created_app + + result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) + + assert result == "hey there" + + # delete the app + arc4.abi_call(Hello.delete, app_id=app) diff --git a/test_cases/compile/out/HelloFactory.approval.mir b/test_cases/compile/out/HelloFactory.approval.mir index 7fb663d770..20bdabb5c9 100644 --- a/test_cases/compile/out/HelloFactory.approval.mir +++ b/test_cases/compile/out/HelloFactory.approval.mir @@ -18,7 +18,7 @@ __puya_arc4_router___block@0: txn NumAppArgs // {txn} class HelloFactory(ARC4Contract): compile/factory.py:24 // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 class HelloFactory(ARC4Contract): compile/factory.py:24 // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - bz __puya_arc4_router___bare_routing@15 // class HelloFactory(ARC4Contract): compile/factory.py:24 + bz __puya_arc4_router___bare_routing@16 // class HelloFactory(ARC4Contract): compile/factory.py:24 // Implicit fall through to __puya_arc4_router___abi_routing@1 // class HelloFactory(ARC4Contract): compile/factory.py:24 __puya_arc4_router___abi_routing@1: @@ -35,8 +35,9 @@ __puya_arc4_router___abi_routing@1: method "test_arc4_create_large()void" // tmp%2#0,method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void"> class HelloFactory(ARC4Contract): compile/factory.py:24 method "test_arc4_update()void" // tmp%2#0,method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void">,method<"test_arc4_update()void"> class HelloFactory(ARC4Contract): compile/factory.py:24 method "test_other_constants()void" // tmp%2#0,method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void">,method<"test_arc4_update()void">,method<"test_other_constants()void"> class HelloFactory(ARC4Contract): compile/factory.py:24 - uncover 11 // load tmp%2#0 from l-stack (no copy) method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void">,method<"test_arc4_update()void">,method<"test_other_constants()void">,tmp%2#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 // class HelloFactory(ARC4Contract): compile/factory.py:24 + method "test_abi_call_create_params()void" // tmp%2#0,method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void">,method<"test_arc4_update()void">,method<"test_other_constants()void">,method<"test_abi_call_create_params()void"> class HelloFactory(ARC4Contract): compile/factory.py:24 + uncover 12 // load tmp%2#0 from l-stack (no copy) method<"test_logicsig()address">,method<"test_compile_contract()void">,method<"test_compile_contract_tmpl()void">,method<"test_compile_contract_prfx()void">,method<"test_compile_contract_large()void">,method<"test_arc4_create()void">,method<"test_arc4_create_tmpl()void">,method<"test_arc4_create_prfx()void">,method<"test_arc4_create_large()void">,method<"test_arc4_update()void">,method<"test_other_constants()void">,method<"test_abi_call_create_params()void">,tmp%2#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 __puya_arc4_router___test_abi_call_create_params_route@13 // class HelloFactory(ARC4Contract): compile/factory.py:24 int 0 // 0 class HelloFactory(ARC4Contract): compile/factory.py:24 retsub // 0 class HelloFactory(ARC4Contract): compile/factory.py:24 @@ -223,25 +224,41 @@ __puya_arc4_router___test_other_constants_route@12: int 1 // 1 arc4.abimethod() compile/factory.py:270 retsub // 1 arc4.abimethod() compile/factory.py:270 -__puya_arc4_router___bare_routing@15: +__puya_arc4_router___test_abi_call_create_params_route@13: + txn OnCompletion // {txn} arc4.abimethod() compile/factory.py:296 + // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 arc4.abimethod() compile/factory.py:296 + // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 arc4.abimethod() compile/factory.py:296 + ! // {!} arc4.abimethod() compile/factory.py:296 + // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 arc4.abimethod() compile/factory.py:296 + // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 arc4.abimethod() compile/factory.py:296 + assert // OnCompletion is NoOp // arc4.abimethod() compile/factory.py:296 + txn ApplicationID // {txn} arc4.abimethod() compile/factory.py:296 + // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 arc4.abimethod() compile/factory.py:296 + // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 arc4.abimethod() compile/factory.py:296 + assert // is not creating // arc4.abimethod() compile/factory.py:296 + callsub test_abi_call_create_params // arc4.abimethod() compile/factory.py:296 + int 1 // 1 arc4.abimethod() compile/factory.py:296 + retsub // 1 arc4.abimethod() compile/factory.py:296 + +__puya_arc4_router___bare_routing@16: txn OnCompletion // {txn} class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - bnz __puya_arc4_router___after_if_else@19 // class HelloFactory(ARC4Contract): compile/factory.py:24 - // Implicit fall through to __puya_arc4_router_____algopy_default_create@16 // class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: store tmp%53#0 to l-stack (no copy) tmp%53#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: load tmp%53#0 from l-stack (no copy) tmp%53#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + bnz __puya_arc4_router___after_if_else@20 // class HelloFactory(ARC4Contract): compile/factory.py:24 + // Implicit fall through to __puya_arc4_router_____algopy_default_create@17 // class HelloFactory(ARC4Contract): compile/factory.py:24 -__puya_arc4_router_____algopy_default_create@16: +__puya_arc4_router_____algopy_default_create@17: txn ApplicationID // {txn} class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 class HelloFactory(ARC4Contract): compile/factory.py:24 ! // {!} class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 class HelloFactory(ARC4Contract): compile/factory.py:24 - // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: store tmp%55#0 to l-stack (no copy) tmp%55#0 class HelloFactory(ARC4Contract): compile/factory.py:24 + // virtual: load tmp%55#0 from l-stack (no copy) tmp%55#0 class HelloFactory(ARC4Contract): compile/factory.py:24 assert // is creating // class HelloFactory(ARC4Contract): compile/factory.py:24 int 1 // 1 class HelloFactory(ARC4Contract): compile/factory.py:24 retsub // 1 class HelloFactory(ARC4Contract): compile/factory.py:24 -__puya_arc4_router___after_if_else@19: +__puya_arc4_router___after_if_else@20: int 0 // 0 class HelloFactory(ARC4Contract): compile/factory.py:24 retsub // 0 class HelloFactory(ARC4Contract): compile/factory.py:24 @@ -1013,3 +1030,76 @@ test_other_constants_block@0: itxn_submit // arc4.abi_call(HelloOtherConstants.delete, app_id=app) compile/factory.py:294 retsub // + +// test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: +test_abi_call_create_params: + proto 0 0 // @arc4.abimethod()\ndef test_abi_call_create_params(self) -> None: compile/factory.py:296-297 + +test_abi_call_create_params_block@0: + itxn_begin // arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + int 1 // 1 compile_contract(Hello) compile/factory.py:298 + itxn_field GlobalNumByteSlice // + byte base64 CoEBQw== // CoEBQw== compile_contract(Hello) compile/factory.py:298 + itxn_field ClearStateProgramPages // + byte base64 CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ // CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ compile_contract(Hello) compile/factory.py:298 + itxn_field ApprovalProgramPages // + method "create(string)void" // method<"create(string)void"> arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + itxn_field ApplicationArgs // + byte 0x0003686579 // 0x0003686579 String("hey") compile/factory.py:301 + itxn_field ApplicationArgs // + int appl // appl arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + itxn_field TypeEnum // + int 0 // 0 arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + itxn_field Fee // + itxn_submit // arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + itxn CreatedApplicationID // {itxn} arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\nclear... compile/factory.py:299-309 + // virtual: store app#0 to l-stack (no copy) app#0 app = arc4.abi_call(\nHello.create,\nString("hey"),\napproval_program=compiled.approval_program,\... compile/factory.py:299-309 + itxn_begin // app#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + dup // load app#0 from l-stack (copy) app#0,app#0 + itxn_field ApplicationID // app#0 + method "greet(string)string" // app#0,method<"greet(string)string"> arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + itxn_field ApplicationArgs // app#0 + byte 0x00057468657265 // app#0,0x00057468657265 "there" compile/factory.py:311 + itxn_field ApplicationArgs // app#0 + int appl // app#0,appl arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + itxn_field TypeEnum // app#0 + int 0 // app#0,0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + itxn_field Fee // app#0 + itxn_submit // app#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + itxn LastLog // app#0,{itxn} arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: store awst_tmp%0#0 to l-stack (no copy) app#0,awst_tmp%0#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + dup // load awst_tmp%0#0 from l-stack (copy) app#0,awst_tmp%0#0,awst_tmp%0#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + extract 4 0 // app#0,awst_tmp%0#0,{extract} arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + cover 1 // store tmp%0#0 to l-stack (no copy) app#0,tmp%0#0,awst_tmp%0#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: load awst_tmp%0#0 from l-stack (no copy) app#0,tmp%0#0,awst_tmp%0#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + extract 0 4 // app#0,tmp%0#0,{extract} arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: store tmp%1#0 to l-stack (no copy) app#0,tmp%0#0,tmp%1#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: load tmp%1#0 from l-stack (no copy) app#0,tmp%0#0,tmp%1#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + byte 0x151f7c75 // app#0,tmp%0#0,tmp%1#0,0x151f7c75 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + == // app#0,tmp%0#0,{==} arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: store tmp%2#0 to l-stack (no copy) app#0,tmp%0#0,tmp%2#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: load tmp%2#0 from l-stack (no copy) app#0,tmp%0#0,tmp%2#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + assert // ARC4 prefix is valid // app#0,tmp%0#0 arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: load tmp%0#0 from l-stack (no copy) app#0,tmp%0#0 result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + extract 2 0 // app#0,{extract} arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: store result#0 to l-stack (no copy) app#0,result#0 result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) compile/factory.py:311 + // virtual: load result#0 from l-stack (no copy) app#0,result#0 result == "hey there" compile/factory.py:313 + byte "hey there" // app#0,result#0,"hey there" "hey there" compile/factory.py:313 + == // app#0,{==} result == "hey there" compile/factory.py:313 + // virtual: store tmp%3#0 to l-stack (no copy) app#0,tmp%3#0 result == "hey there" compile/factory.py:313 + // virtual: load tmp%3#0 from l-stack (no copy) app#0,tmp%3#0 assert result == "hey there" compile/factory.py:313 + assert // app#0 assert result == "hey there" compile/factory.py:313 + itxn_begin // app#0 arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + int DeleteApplication // app#0,DeleteApplication arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + itxn_field OnCompletion // app#0 + // virtual: load app#0 from l-stack (no copy) app#0 + itxn_field ApplicationID // + method "delete()void" // method<"delete()void"> arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + itxn_field ApplicationArgs // + int appl // appl arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + itxn_field TypeEnum // + int 0 // 0 arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + itxn_field Fee // + itxn_submit // arc4.abi_call(Hello.delete, app_id=app) compile/factory.py:316 + retsub // + diff --git a/test_cases/compile/out/HelloFactory.approval.teal b/test_cases/compile/out/HelloFactory.approval.teal index e005c5b52f..9ce51b73ea 100644 --- a/test_cases/compile/out/HelloFactory.approval.teal +++ b/test_cases/compile/out/HelloFactory.approval.teal @@ -11,7 +11,7 @@ __puya_arc4_router__: // class HelloFactory(ARC4Contract): proto 0 1 txn NumAppArgs - bz __puya_arc4_router___bare_routing@15 + bz __puya_arc4_router___bare_routing@16 method "test_logicsig()address" method "test_compile_contract()void" method "test_compile_contract_tmpl()void" @@ -23,8 +23,9 @@ __puya_arc4_router__: method "test_arc4_create_large()void" method "test_arc4_update()void" method "test_other_constants()void" + method "test_abi_call_create_params()void" txna ApplicationArgs 0 - match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 + match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 __puya_arc4_router___test_abi_call_create_params_route@13 int 0 retsub @@ -164,18 +165,30 @@ __puya_arc4_router___test_other_constants_route@12: int 1 retsub -__puya_arc4_router___bare_routing@15: +__puya_arc4_router___test_abi_call_create_params_route@13: + // compile/factory.py:296 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is NoOp + txn ApplicationID + assert // is not creating + callsub test_abi_call_create_params + int 1 + retsub + +__puya_arc4_router___bare_routing@16: // compile/factory.py:24 // class HelloFactory(ARC4Contract): txn OnCompletion - bnz __puya_arc4_router___after_if_else@19 + bnz __puya_arc4_router___after_if_else@20 txn ApplicationID ! assert // is creating int 1 retsub -__puya_arc4_router___after_if_else@19: +__puya_arc4_router___after_if_else@20: // compile/factory.py:24 // class HelloFactory(ARC4Contract): int 0 @@ -1348,3 +1361,111 @@ test_other_constants: itxn_field Fee itxn_submit retsub + + +// test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: +test_abi_call_create_params: + // compile/factory.py:296-297 + // @arc4.abimethod() + // def test_abi_call_create_params(self) -> None: + proto 0 0 + // compile/factory.py:299-309 + // app = arc4.abi_call( + // Hello.create, + // String("hey"), + // approval_program=compiled.approval_program, + // clear_state_program=compiled.clear_state_program, + // global_num_uint=compiled.global_uints, + // global_num_bytes=compiled.global_bytes, + // local_num_uint=compiled.local_uints, + // local_num_bytes=compiled.local_bytes, + // extra_program_pages=compiled.extra_program_pages, + // ).created_app + itxn_begin + // compile/factory.py:298 + // compiled = compile_contract(Hello) + int 1 + itxn_field GlobalNumByteSlice + byte base64 CoEBQw== + itxn_field ClearStateProgramPages + byte base64 CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ + itxn_field ApprovalProgramPages + // compile/factory.py:299-309 + // app = arc4.abi_call( + // Hello.create, + // String("hey"), + // approval_program=compiled.approval_program, + // clear_state_program=compiled.clear_state_program, + // global_num_uint=compiled.global_uints, + // global_num_bytes=compiled.global_bytes, + // local_num_uint=compiled.local_uints, + // local_num_bytes=compiled.local_bytes, + // extra_program_pages=compiled.extra_program_pages, + // ).created_app + method "create(string)void" + itxn_field ApplicationArgs + // compile/factory.py:301 + // String("hey"), + byte 0x0003686579 + itxn_field ApplicationArgs + // compile/factory.py:299-309 + // app = arc4.abi_call( + // Hello.create, + // String("hey"), + // approval_program=compiled.approval_program, + // clear_state_program=compiled.clear_state_program, + // global_num_uint=compiled.global_uints, + // global_num_bytes=compiled.global_bytes, + // local_num_uint=compiled.local_uints, + // local_num_bytes=compiled.local_bytes, + // extra_program_pages=compiled.extra_program_pages, + // ).created_app + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn CreatedApplicationID + // compile/factory.py:311 + // result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) + itxn_begin + dup + itxn_field ApplicationID + method "greet(string)string" + itxn_field ApplicationArgs + byte 0x00057468657265 + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn LastLog + dup + extract 4 0 + swap + extract 0 4 + byte 0x151f7c75 + == + assert // ARC4 prefix is valid + extract 2 0 + // compile/factory.py:313 + // assert result == "hey there" + byte "hey there" + == + assert + // compile/factory.py:315-316 + // # delete the app + // arc4.abi_call(Hello.delete, app_id=app) + itxn_begin + int DeleteApplication + itxn_field OnCompletion + itxn_field ApplicationID + method "delete()void" + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + retsub diff --git a/test_cases/compile/out/HelloFactory.arc32.json b/test_cases/compile/out/HelloFactory.arc32.json index a246ecaf23..73b65572ed 100644 --- a/test_cases/compile/out/HelloFactory.arc32.json +++ b/test_cases/compile/out/HelloFactory.arc32.json @@ -54,10 +54,15 @@ "call_config": { "no_op": "CALL" } + }, + "test_abi_call_create_params()void": { + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE1CiAgICBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiCiAgICBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIKICAgIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIKICAgIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbG9naWNzaWdfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3Rfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4X3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcHJmeF9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X3VwZGF0ZV9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X290aGVyX2NvbnN0YW50c19yb3V0ZUAxMgogICAgaW50IDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2xvZ2ljc2lnCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3Rfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbAogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZngKICAgIGludCAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZV9yb3V0ZUA2OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3RtcGxfcm91dGVAODoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfdG1wbAogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDk6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludCAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDExOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X3VwZGF0ZQogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0CiAgICAvLyBjbGFzcyBIZWxsb0ZhY3RvcnkoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0CiAgICAvLyBjbGFzcyBIZWxsb0ZhY3RvcnkoQVJDNENvbnRyYWN0KToKICAgIGludCAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9sb2dpY3NpZygpIC0+IGJ5dGVzOgp0ZXN0X2xvZ2ljc2lnOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2LTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbG9naWNzaWcoc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoY29tcGlsZV9sb2dpY3NpZyhhbHdheXNfYXBwcm92ZV9zaWcpLmFjY291bnQpCiAgICBhZGRyIFUzWlhFVU5GUlNVRFBQTkZDNlU3T0JZTzRTNEFVT0VQNFJEQkkyM0wyUTVUWDNLNUxUU1ZXUU9LRk0KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3QoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3Q6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAtMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNS00MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozOQogICAgLy8gZ2xvYmFsX251bV9ieXRlcz0xLAogICAgaW50IDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzItMzMKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ1JpQUFCUTRvQUFURWJRUUJmZ2dNRUlOODZWQVFrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQlVBSUNPSk1Sa1VSREVZRkVRMkdnRlhBZ0NJQUQ4aWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUtra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRQW9pLzluaVlvQkFTTW9aVVNBQVNCUWkvOVFpWW9BQUNpQUFHZUoKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNgogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzUKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM1LTQxCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNS00MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ5CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0NS00NgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0NS00OQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1MAogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUyLTU3CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1NgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUyLTUzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1Mi01NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZWxsbyB3b3JsZCIKICAgIGJ5dGUgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjEtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY3LTc2CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjUKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludCAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ0FpQUFCUTRvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSW1LQUFBb2dBUjBiWEJzWjRrPQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjctNzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjctNzcKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjgwLTg0CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MgogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MC04MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MC04NAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg3LTkyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkwCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg3LTg4CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4Ny05MgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk0CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgd29ybGQiCiAgICBieXRlIDB4MDAwOTY4NjU3OTIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZng6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTYtOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZngoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwMy0xMDkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5OC0xMDEKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIgogICAgLy8gKQogICAgaW50IDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDQWlBQUJRNG9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJbUtBQUFvZ0FKb2FXZUoKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwMwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTAzLTEwOQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDMtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTMtMTE3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTUKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTEzLTExNAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTMtMTE3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOAogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjAtMTIxCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjAtMTI1CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTI3CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoaSB3b3JsZCIKICAgIGJ5dGUgMHgwMDA4Njg2OTIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZSgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjktMTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0LTE0MAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzEtMTMyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChMYXJnZVByb2dyYW0pCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBFeHRyYVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0LTE0MAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NC0xNDgKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NgogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDQtMTQ1CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NC0xNDgKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTQ5CiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1NgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU0CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1MS0xNTIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1MS0xNTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNTgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gNDA5NgogICAgYnl0ZSAweDAwMDAwMDAwMDAwMDEwMDAKICAgIGI9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYwLTE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjItMTYzCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoSGVsbG8uY3JlYXRlLCAiaGVsbG8iKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgaW50IDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjUtMTY2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTY4LTE3MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5kZWxldGUsCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICAjIG9uX2NvbXBsZXRlIGlzIGluZmVycmVkIGZyb20gSGVsbG8uZGVsZXRlIEFSQzQgZGVmaW5pdGlvbgogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3NQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBieXRlICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc3LTE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4MS0xODQKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzktMTgwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9nQVIwYlhCc1o0az0KICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODEtMTg0CiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvVG1wbC5jcmVhdGUsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Ni0xODcKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb1RtcGwuZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTg5LTE5NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludCBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gInRtcGwyIHdvcmxkIgogICAgYnl0ZSAidG1wbDIgd29ybGQiCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCkgLT4gdm9pZDoKdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5OC0xOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMDQtMjA3CiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvUHJmeC5jcmVhdGUsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjAwLTIwMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgSGVsbG9QcmZ4LCB0ZW1wbGF0ZV92YXJzX3ByZWZpeD0iUFJGWF8iLCB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoInByZngyIil9CiAgICAvLyApCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9nQVZ3Y21aNE1tZUoKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMDQtMjA3CiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvUHJmeC5jcmVhdGUsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwOS0yMTAKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb1ByZnguZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEyLTIxNwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludCBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gInByZngyIHdvcmxkIgogICAgYnl0ZSAicHJmeDIgd29ybGQiCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9sYXJnZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIxLTIyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMjMtMjI0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoTGFyZ2VQcm9ncmFtKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgaW50IDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0KICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJaz0KICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI2LTIyNwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBpbnQgNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMC0yMzQKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF91cGRhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfdXBkYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzNi0yMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM4LTI1MAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgICAgICBIZWxsb1RtcGwsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sCiAgICAvLyAgICAgICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPTIsCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz0yLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz0yLAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBsb2NhbF91aW50cz0yLAogICAgaW50IDIKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ3CiAgICAvLyBsb2NhbF9ieXRlcz0yLAogICAgaW50IDIKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDUKICAgIC8vIGdsb2JhbF91aW50cz0yLAogICAgaW50IDIKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0NgogICAgLy8gZ2xvYmFsX2J5dGVzPTIsCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIGludCAxCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQxLTI0OQogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1RtcGwsCiAgICAvLyAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPTEsCiAgICAvLyAgICAgZ2xvYmFsX3VpbnRzPTIsCiAgICAvLyAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgbG9jYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF91aW50cz0yLAogICAgLy8gKSwKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9nQVIwYlhCc1o0az0KICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDAKICAgIC8vIEhlbGxvVG1wbCwKICAgIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzgtMjUwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUyLTI1MwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZSAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU2LTI1NwogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNSaUFBQlE0b0FBVEViUVFCZmdnTUVJTjg2VkFRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUJVQUlDT0pNUmtVUkRFWUZFUTJHZ0ZYQWdDSUFEOGlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FLa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUFvaS85bmlZb0JBU01vWlVTQUFTQlFpLzlRaVlvQUFDaUFBR2VKCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBpbnQgVXBkYXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTktMjYwCiAgICAvLyAjIGNhbGwgdGhlIHVwZGF0ZWQgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlICJoaSB0aGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjMtMjY4CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9vdGhlcl9jb25zdGFudHMoKSAtPiB2b2lkOgp0ZXN0X290aGVyX2NvbnN0YW50czoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzAtMjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3Rfb3RoZXJfY29uc3RhbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzItMjg1CiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICAgICAgSGVsbG9PdGhlckNvbnN0YW50cywKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17CiAgICAvLyAgICAgICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgICAgICJHUkVFVElORyI6IFN0cmluZygiaGVsbG8iKSwKICAgIC8vICAgICAgICAgICAgICJBQ0NPVU5UIjogQWNjb3VudCgKICAgIC8vICAgICAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgICAgICksCiAgICAvLyAgICAgICAgICAgICAiTUVUSE9EIjogYXJjNC5hcmM0X3NpZ25hdHVyZSgic29tZXRoaW5nKCl2b2lkIiksCiAgICAvLyAgICAgICAgIH0sCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzQtMjg0CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgdGVtcGxhdGVfdmFycz17CiAgICAvLyAgICAgICAgICJOVU0iOiBCaWdVSW50KDUpLAogICAgLy8gICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICJBQ0NPVU5UIjogQWNjb3VudCgKICAgIC8vICAgICAgICAgICAgICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRIgogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICAiTUVUSE9EIjogYXJjNC5hcmM0X3NpZ25hdHVyZSgic29tZXRoaW5nKCl2b2lkIiksCiAgICAvLyAgICAgfSwKICAgIC8vICksCiAgICBpbnQgNAogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBQUVtQmdOdWRXMEVGUjk4ZFFFd0NHZHlaV1YwYVc1bkIyRmtaSEpsYzNNR2JXVjBhRzlrTVJoQUFBT0lBS0NJQUFGRGlnQUJNUnRCQUZtQ0F3VFpLRnAwQkNRM2pUd0VXd3dqZFRZYUFJNERBQUlBRkFBZklva3hHUlJFTVJnVVJJZ0FNaFlwVEZDd0k0a3hHWUVGRWtReEdFUWppVEVaRkVReEdFUTJHZ0ZYQWdDSUFCVkpGUlpYQmdKTVVDbE1VTEFqaVNLSmlnQUJJNG1LQVFFaUtHVkVLcUFWSXdraUtHVkVLcUJMQVNNSVRFNENVaUlyWlVTQUFTQlFpLzlRVEZBaUp3UmxSRkFpSndWbFJGQ0ppZ0FBSzRBRWRHMXdiR2NvZ0FGQ1p5Y0VnQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHY25CWUFFQUFBQUFHZUoKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzMKICAgIC8vIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICBtZXRob2QgImNyZWF0ZSgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzItMjg1CiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICAgICAgSGVsbG9PdGhlckNvbnN0YW50cywKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17CiAgICAvLyAgICAgICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgICAgICJHUkVFVElORyI6IFN0cmluZygiaGVsbG8iKSwKICAgIC8vICAgICAgICAgICAgICJBQ0NPVU5UIjogQWNjb3VudCgKICAgIC8vICAgICAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgICAgICksCiAgICAvLyAgICAgICAgICAgICAiTUVUSE9EIjogYXJjNC5hcmM0X3NpZ25hdHVyZSgic29tZXRoaW5nKCl2b2lkIiksCiAgICAvLyAgICAgICAgIH0sCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQsICJKb2hubnkiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjkwCiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBieXRlIGJhc2UzMiBOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKICAgIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg5LTI5MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODktMjkxCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOTMtMjk0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE2CiAgICBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiCiAgICBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIKICAgIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiCiAgICBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIKICAgIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIgogICAgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIKICAgIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYWJpX2NhbGxfY3JlYXRlX3BhcmFtc19yb3V0ZUAxMwogICAgaW50IDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2xvZ2ljc2lnCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3Rfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbAogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZngKICAgIGludCAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZV9yb3V0ZUA2OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3RtcGxfcm91dGVAODoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfdG1wbAogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDk6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludCAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDExOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X3VwZGF0ZQogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50IDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zCiAgICBpbnQgMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludCAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50IDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjYtMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOAogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIGFkZHIgVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTVldRT0tGTQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMC0zMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM1LTQxCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM5CiAgICAvLyBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMi0zMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoSGVsbG8pCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Njg2NTZjNmM2ZgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzUtNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM1LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDUtNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ3CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ5CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTItNTcKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTUKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTItNTMKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUyLTU3CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgYnl0ZSAweDAwMGI2ODY1NmM2YzZmMjA3NzZmNzI2YzY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MS02MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjctNzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2NQogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvVG1wbCwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogZ3JlZXRpbmd9KQogICAgaW50IDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDQWlBQUJRNG9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJbUtBQUFvZ0FSMGJYQnNaNGs9CiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2Ny03NgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX3VpbnQ9Y29tcGlsZWQuZ2xvYmFsX3VpbnRzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gICAgIGxvY2FsX251bV91aW50PWNvbXBpbGVkLmxvY2FsX3VpbnRzLAogICAgLy8gICAgIGxvY2FsX251bV9ieXRlcz1jb21waWxlZC5sb2NhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2Ny03NwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX3VpbnQ9Y29tcGlsZWQuZ2xvYmFsX3VpbnRzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gICAgIGxvY2FsX251bV91aW50PWNvbXBpbGVkLmxvY2FsX3VpbnRzLAogICAgLy8gICAgIGxvY2FsX251bV9ieXRlcz1jb21waWxlZC5sb2NhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODAtODQKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjgyCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjgwLTgxCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjgwLTg0CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODctOTIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTAKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODctODgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg3LTkyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTQKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIGJ5dGUgMHgwMDA5Njg2NTc5MjA3NzZmNzI2YzY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZngoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5Ni05NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTAzLTEwOQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk4LTEwMQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgSGVsbG9QcmZ4LCB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LCB0ZW1wbGF0ZV92YXJzX3ByZWZpeD0iUFJGWF8iCiAgICAvLyApCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9nQUpvYVdlSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTAzCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDMtMTA5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwMy0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExMy0xMTcKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTMtMTE0CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExMy0xMTcKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE4CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTIwLTEyNQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTI0CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTIzCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjcKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgYnl0ZSAweDAwMDg2ODY5MjA3NzZmNzI2YzY0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyOS0xMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzQtMTQwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzMS0xMzIKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KExhcmdlUHJvZ3JhbSkKICAgIGludCAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09CiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9CiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzQtMTQwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzQtMTQxCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTQ0LTE0OAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIpLCksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTQ2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIpLCksCiAgICBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NC0xNDUKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTQ0LTE0OAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIpLCksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDkKICAgIC8vIHJlc3VsdCA9IGFyYzQuVUludDY0LmZyb21fbG9nKHR4bi5sYXN0X2xvZykKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNTEtMTU2CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNTUKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludCBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNTQKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1MgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1NgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBieXRlIDB4MDAwMDAwMDAwMDAwMTAwMAogICAgYj09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2NyZWF0ZToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2Mi0xNjMKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZShIZWxsby5jcmVhdGUsICJoZWxsbyIpLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGUgYmFzZTY0IENvRUJRdz09CiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGUgYmFzZTY0IENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNSaUFBQlE0b0FBVEViUVFCZmdnTUVJTjg2VkFRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUJVQUlDT0pNUmtVUkRFWUZFUTJHZ0ZYQWdDSUFEOGlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FLa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUFvaS85bmlZb0JBU01vWlVTQUFTQlFpLzlRaVlvQUFDaUFBR2VKCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2NS0xNjYKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsby5ncmVldCwgIndvcmxkIiwgYXBwX2lkPWhlbGxvX2FwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjgtMTczCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc1CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZWxsbyB3b3JsZCIKICAgIGJ5dGUgImhlbGxvIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfdG1wbDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzctMTc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfdG1wbChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTgxLTE4NAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1RtcGwuY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OS0xODAKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvVG1wbCwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJ0bXBsMiIpfSkKICAgIGludCAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ0FpQUFCUTRvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSW1LQUFBb2dBUjBiWEJzWjRrPQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4MS0xODQKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTg2LTE4NwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgIndvcmxkIiwgYXBwX2lkPWhlbGxvX2FwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODktMTk0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvVG1wbC5kZWxldGUsCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICAjIG9uX2NvbXBsZXRlIGlzIGluZmVycmVkIGZyb20gSGVsbG8uZGVsZXRlIEFSQzQgZGVmaW5pdGlvbgogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBieXRlICJ0bXBsMiB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3ByZngoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3ByZng6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTk4LTE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNC0yMDcKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMDAtMjAzCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygicHJmeDIiKX0KICAgIC8vICkKICAgIGludCAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ0FpQUFCUTRvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSW1LQUFBb2dBVndjbVo0TW1lSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNC0yMDcKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA5LTIxMAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvUHJmeC5ncmVldCwgIndvcmxkIiwgYXBwX2lkPWhlbGxvX2FwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZSAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTItMjE3CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvUHJmeC5kZWxldGUsCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICAjIG9uX2NvbXBsZXRlIGlzIGluZmVycmVkIGZyb20gSGVsbG8uZGVsZXRlIEFSQzQgZGVmaW5pdGlvbgogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIxOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBieXRlICJwcmZ4MiB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMjEtMjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMy0yMjQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZShMYXJnZVByb2dyYW0pLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBFeHRyYVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMjYtMjI3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTGFyZ2VQcm9ncmFtLmdldF9iaWdfYnl0ZXNfbGVuZ3RoLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI4CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09IDQwOTYKICAgIGludCA0MDk2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjMwLTIzNAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMYXJnZVByb2dyYW0uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM2LTIzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzgtMjUwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDgKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDcKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0NQogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBpbnQgMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ2CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIGludCAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0NAogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50IDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDEtMjQ5CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ0FpQUFCUTRvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSW1LQUFBb2dBUjBiWEJzWjRrPQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MAogICAgLy8gSGVsbG9UbXBsLAogICAgbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzOC0yNTAKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1RtcGwsCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPTEsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz0yLAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9MiwKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9MiwKICAgIC8vICAgICApLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTItMjUzCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1NAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlICJoaSB0aGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTYtMjU3CiAgICAvLyAjIHVwZGF0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFyYzRfdXBkYXRlKEhlbGxvLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ1JpQUFCUTRvQUFURWJRUUJmZ2dNRUlOODZWQVFrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQlVBSUNPSk1Sa1VSREVZRkVRMkdnRlhBZ0NJQUQ4aWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUtra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRQW9pLzluaVlvQkFTTW9aVVNBQVNCUWkvOVFpWW9BQUNpQUFHZUoKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludCBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1OS0yNjAKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjYxCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoaSB0aGVyZSIKICAgIGJ5dGUgImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2My0yNjgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludCBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X290aGVyX2NvbnN0YW50cygpIC0+IHZvaWQ6CnRlc3Rfb3RoZXJfY29uc3RhbnRzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9vdGhlcl9jb25zdGFudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3Mi0yODUKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9PdGhlckNvbnN0YW50cywKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgICAgICB0ZW1wbGF0ZV92YXJzPXsKICAgIC8vICAgICAgICAgICAgICJOVU0iOiBCaWdVSW50KDUpLAogICAgLy8gICAgICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAgICAgIkFDQ09VTlQiOiBBY2NvdW50KAogICAgLy8gICAgICAgICAgICAgICAgICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRIgogICAgLy8gICAgICAgICAgICAgKSwKICAgIC8vICAgICAgICAgICAgICJNRVRIT0QiOiBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKSwKICAgIC8vICAgICAgICAgfSwKICAgIC8vICAgICApLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3NC0yODQKICAgIC8vIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgSGVsbG9PdGhlckNvbnN0YW50cywKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsKICAgIC8vICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICJHUkVFVElORyI6IFN0cmluZygiaGVsbG8iKSwKICAgIC8vICAgICAgICAgIkFDQ09VTlQiOiBBY2NvdW50KAogICAgLy8gICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgICJNRVRIT0QiOiBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKSwKICAgIC8vICAgICB9LAogICAgLy8gKSwKICAgIGludCA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZSBiYXNlNjQgQ29FQlF3PT0KICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZSBiYXNlNjQgQ2lBQ0FBRW1CZ051ZFcwRUZSOThkUUV3Q0dkeVpXVjBhVzVuQjJGa1pISmxjM01HYldWMGFHOWtNUmhBQUFPSUFLQ0lBQUZEaWdBQk1SdEJBRm1DQXdUWktGcDBCQ1EzalR3RVd3d2pkVFlhQUk0REFBSUFGQUFmSW9reEdSUkVNUmdVUklnQU1oWXBURkN3STRreEdZRUZFa1F4R0VRamlURVpGRVF4R0VRMkdnRlhBZ0NJQUJWSkZSWlhCZ0pNVUNsTVVMQWppU0tKaWdBQkk0bUtBUUVpS0dWRUtxQVZJd2tpS0dWRUtxQkxBU01JVEU0Q1VpSXJaVVNBQVNCUWkvOVFURkFpSndSbFJGQWlKd1ZsUkZDSmlnQUFLNEFFZEcxd2JHY29nQUZDWnljRWdDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdjbkJZQUVBQUFBQUdlSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gSGVsbG9PdGhlckNvbnN0YW50cywKICAgIG1ldGhvZCAiY3JlYXRlKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3Mi0yODUKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9PdGhlckNvbnN0YW50cywKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgICAgICB0ZW1wbGF0ZV92YXJzPXsKICAgIC8vICAgICAgICAgICAgICJOVU0iOiBCaWdVSW50KDUpLAogICAgLy8gICAgICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAgICAgIkFDQ09VTlQiOiBBY2NvdW50KAogICAgLy8gICAgICAgICAgICAgICAgICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRIgogICAgLy8gICAgICAgICAgICAgKSwKICAgIC8vICAgICAgICAgICAgICJNRVRIT0QiOiBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKSwKICAgIC8vICAgICAgICAgfSwKICAgIC8vICAgICApLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODcKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9PdGhlckNvbnN0YW50cy5ncmVldCwgIkpvaG5ueSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGUgMHgwMDA2NGE2ZjY4NmU2ZTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOTAKICAgIC8vIGIiaGVsbG8gSm9obm55NSIgKyBHbG9iYWwuemVyb19hZGRyZXNzLmJ5dGVzICsgYXJjNC5hcmM0X3NpZ25hdHVyZSgic29tZXRoaW5nKCl2b2lkIikKICAgIGJ5dGUgYmFzZTMyIE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQogICAgbWV0aG9kICJzb21ldGhpbmcoKXZvaWQiCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODktMjkwCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICA9PQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4OS0yOTEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gKAogICAgLy8gICAgIGIiaGVsbG8gSm9obm55NSIgKyBHbG9iYWwuemVyb19hZGRyZXNzLmJ5dGVzICsgYXJjNC5hcmM0X3NpZ25hdHVyZSgic29tZXRoaW5nKCl2b2lkIikKICAgIC8vICkKICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5My0yOTQKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG9PdGhlckNvbnN0YW50cy5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5Ni0yOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOTktMzA5CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50IDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlIGJhc2U2NCBDb0VCUXc9PQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlIGJhc2U2NCBDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OS0zMDkKICAgIC8vIGFwcCA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX3VpbnQ9Y29tcGlsZWQuZ2xvYmFsX3VpbnRzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gICAgIGxvY2FsX251bV91aW50PWNvbXBpbGVkLmxvY2FsX3VpbnRzLAogICAgLy8gICAgIGxvY2FsX251bV9ieXRlcz1jb21waWxlZC5sb2NhbF9ieXRlcywKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZSAweDAwMDM2ODY1NzkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk5LTMwOQogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzExCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxMwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGV5IHRoZXJlIgogICAgYnl0ZSAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNS0zMTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50IERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIGludCAxCiAgICByZXR1cm4K" }, "state": { @@ -170,6 +175,14 @@ "returns": { "type": "void" } + }, + { + "name": "test_abi_call_create_params", + "args": [], + "readonly": false, + "returns": { + "type": "void" + } } ], "networks": {} diff --git a/test_cases/compile/out/HelloFactory.destructured.ir b/test_cases/compile/out/HelloFactory.destructured.ir index d13ef7f751..2087401bd8 100644 --- a/test_cases/compile/out/HelloFactory.destructured.ir +++ b/test_cases/compile/out/HelloFactory.destructured.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -490,6 +498,42 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + ((itxn_field ApprovalProgramPages) CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) 0x0003686579) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) 0x00057468657265) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: diff --git a/test_cases/compile/out/HelloFactory.ssa.ir b/test_cases/compile/out/HelloFactory.ssa.ir index 82c17791f3..707afa7a15 100644 --- a/test_cases/compile/out/HelloFactory.ssa.ir +++ b/test_cases/compile/out/HelloFactory.ssa.ir @@ -9,10 +9,10 @@ contract test_cases.compile.factory.HelloFactory: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) let tmp%1#0: bool = (!= tmp%0#0 0u) - goto tmp%1#0 ? block@1 : block@15 + goto tmp%1#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@13} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@14} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) @@ -114,24 +114,33 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%48#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@13: // switch_case_default_L24 - goto block@14 - block@14: // switch_case_next_L24 - goto block@19 - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - switch tmp%49#0 {0u => block@16, * => block@17} - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (== tmp%50#0 0u) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (== tmp%49#0 NoOp) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + let tmp%52#0: bool = (!= tmp%51#0 0u) + (assert tmp%52#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() + return 1u + block@14: // switch_case_default_L24 + goto block@15 + block@15: // switch_case_next_L24 + goto block@20 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + switch tmp%53#0 {0u => block@17, * => block@18} + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (== tmp%54#0 0u) + (assert tmp%55#0) // is creating test_cases.compile.factory.HelloFactory.__algopy_default_create() return 1u - block@17: // switch_case_default_L24 - goto block@18 - block@18: // switch_case_next_L24 + block@18: // switch_case_default_L24 goto block@19 - block@19: // after_if_else_L24 + block@19: // switch_case_next_L24 + goto block@20 + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -3263,6 +3272,305 @@ contract test_cases.compile.factory.HelloFactory: itxn_submit return + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + let (compiled.0#0: bytes, compiled.1#0: bytes, compiled.2#0: bytes, compiled.3#0: bytes, compiled.4#0: uint64, compiled.5#0: uint64, compiled.6#0: uint64, compiled.7#0: uint64, compiled.8#0: uint64) = (compiled_contract('test_cases.compile.apps.Hello', field=ApprovalProgramPages, program_page=0), compiled_contract('test_cases.compile.apps.Hello', field=ApprovalProgramPages, program_page=1), compiled_contract('test_cases.compile.apps.Hello', field=ClearStateProgramPages, program_page=0), compiled_contract('test_cases.compile.apps.Hello', field=ClearStateProgramPages, program_page=1), compiled_contract('test_cases.compile.apps.Hello', field=ExtraProgramPages, program_page=None), compiled_contract('test_cases.compile.apps.Hello', field=GlobalNumUint, program_page=None), compiled_contract('test_cases.compile.apps.Hello', field=GlobalNumByteSlice, program_page=None), compiled_contract('test_cases.compile.apps.Hello', field=LocalNumUint, program_page=None), compiled_contract('test_cases.compile.apps.Hello', field=LocalNumByteSlice, program_page=None)) + itxn_begin + let inner_txn_params%0#0: itxn_field_set = itxn_field_set(0) + let inner_txn_params%0%%param_Fee_idx_0#0: uint64 = 0u + let inner_txn_params%0%%Fee_length#0: uint64 = 1u + let inner_txn_params%0%%param_TypeEnum_idx_0#0: uint64 = appl + let inner_txn_params%0%%TypeEnum_length#0: uint64 = 1u + let length%0#0: uint64 = (len "hey") + 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 "hey") + let inner_txn_params%0%%param_ApplicationArgs_idx_0#0: bytes = method "create(string)void" + let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = encoded_value%0#0 + let inner_txn_params%0%%ApplicationArgs_length#0: uint64 = 2u + let inner_txn_params%0%%param_ApprovalProgramPages_idx_0#0: bytes = compiled.0#0 + let inner_txn_params%0%%param_ApprovalProgramPages_idx_1#0: bytes = compiled.1#0 + let inner_txn_params%0%%ApprovalProgramPages_length#0: uint64 = 2u + let inner_txn_params%0%%param_ClearStateProgramPages_idx_0#0: bytes = compiled.2#0 + let inner_txn_params%0%%param_ClearStateProgramPages_idx_1#0: bytes = compiled.3#0 + let inner_txn_params%0%%ClearStateProgramPages_length#0: uint64 = 2u + let inner_txn_params%0%%param_GlobalNumUint_idx_0#0: uint64 = compiled.5#0 + let inner_txn_params%0%%GlobalNumUint_length#0: uint64 = 1u + let inner_txn_params%0%%param_GlobalNumByteSlice_idx_0#0: uint64 = compiled.6#0 + let inner_txn_params%0%%GlobalNumByteSlice_length#0: uint64 = 1u + let inner_txn_params%0%%param_LocalNumUint_idx_0#0: uint64 = compiled.7#0 + let inner_txn_params%0%%LocalNumUint_length#0: uint64 = 1u + let inner_txn_params%0%%param_LocalNumByteSlice_idx_0#0: uint64 = compiled.8#0 + let inner_txn_params%0%%LocalNumByteSlice_length#0: uint64 = 1u + let inner_txn_params%0%%param_ExtraProgramPages_idx_0#0: uint64 = compiled.4#0 + let inner_txn_params%0%%ExtraProgramPages_length#0: uint64 = 1u + let inner_txn_params%0%%Sender_length#0: uint64 = 0u + let inner_txn_params%0%%Note_length#0: uint64 = 0u + let inner_txn_params%0%%Receiver_length#0: uint64 = 0u + let inner_txn_params%0%%Amount_length#0: uint64 = 0u + let inner_txn_params%0%%CloseRemainderTo_length#0: uint64 = 0u + let inner_txn_params%0%%VotePK_length#0: uint64 = 0u + let inner_txn_params%0%%SelectionPK_length#0: uint64 = 0u + let inner_txn_params%0%%VoteFirst_length#0: uint64 = 0u + let inner_txn_params%0%%VoteLast_length#0: uint64 = 0u + let inner_txn_params%0%%VoteKeyDilution_length#0: uint64 = 0u + let inner_txn_params%0%%Type_length#0: uint64 = 0u + let inner_txn_params%0%%XferAsset_length#0: uint64 = 0u + let inner_txn_params%0%%AssetAmount_length#0: uint64 = 0u + let inner_txn_params%0%%AssetSender_length#0: uint64 = 0u + let inner_txn_params%0%%AssetReceiver_length#0: uint64 = 0u + let inner_txn_params%0%%AssetCloseTo_length#0: uint64 = 0u + let inner_txn_params%0%%ApplicationID_length#0: uint64 = 0u + let inner_txn_params%0%%OnCompletion_length#0: uint64 = 0u + let inner_txn_params%0%%ApprovalProgram_length#0: uint64 = 0u + let inner_txn_params%0%%ClearStateProgram_length#0: uint64 = 0u + let inner_txn_params%0%%RekeyTo_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAsset_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetTotal_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetDecimals_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetDefaultFrozen_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetUnitName_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetName_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetURL_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetMetadataHash_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetManager_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetReserve_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetFreeze_length#0: uint64 = 0u + let inner_txn_params%0%%ConfigAssetClawback_length#0: uint64 = 0u + let inner_txn_params%0%%FreezeAsset_length#0: uint64 = 0u + let inner_txn_params%0%%FreezeAssetAccount_length#0: uint64 = 0u + let inner_txn_params%0%%FreezeAssetFrozen_length#0: uint64 = 0u + let inner_txn_params%0%%Nonparticipation_length#0: uint64 = 0u + let inner_txn_params%0%%StateProofPK_length#0: uint64 = 0u + let inner_txn_params%0%%Accounts_length#0: uint64 = 0u + let inner_txn_params%0%%Assets_length#0: uint64 = 0u + let inner_txn_params%0%%Applications_length#0: uint64 = 0u + ((itxn_field ExtraProgramPages) inner_txn_params%0%%param_ExtraProgramPages_idx_0#0) + ((itxn_field LocalNumByteSlice) inner_txn_params%0%%param_LocalNumByteSlice_idx_0#0) + ((itxn_field LocalNumUint) inner_txn_params%0%%param_LocalNumUint_idx_0#0) + ((itxn_field GlobalNumByteSlice) inner_txn_params%0%%param_GlobalNumByteSlice_idx_0#0) + ((itxn_field GlobalNumUint) inner_txn_params%0%%param_GlobalNumUint_idx_0#0) + ((itxn_field ClearStateProgramPages) inner_txn_params%0%%param_ClearStateProgramPages_idx_0#0) + ((itxn_field ClearStateProgramPages) inner_txn_params%0%%param_ClearStateProgramPages_idx_1#0) + ((itxn_field ApprovalProgramPages) inner_txn_params%0%%param_ApprovalProgramPages_idx_0#0) + ((itxn_field ApprovalProgramPages) inner_txn_params%0%%param_ApprovalProgramPages_idx_1#0) + ((itxn_field ApplicationArgs) inner_txn_params%0%%param_ApplicationArgs_idx_0#0) + ((itxn_field ApplicationArgs) inner_txn_params%0%%param_ApplicationArgs_idx_1#0) + ((itxn_field TypeEnum) inner_txn_params%0%%param_TypeEnum_idx_0#0) + ((itxn_field Fee) inner_txn_params%0%%param_Fee_idx_0#0) + goto block@1 + block@1: // next_txn_L299 + itxn_submit + let app#0: uint64 = itxn[itxn_group_idx(0)].CreatedApplicationID + itxn_begin + let inner_txn_params%1#0: itxn_field_set = itxn_field_set(1) + let inner_txn_params%1%%param_Fee_idx_0#0: uint64 = 0u + let inner_txn_params%1%%Fee_length#0: uint64 = 1u + let inner_txn_params%1%%param_TypeEnum_idx_0#0: uint64 = appl + let inner_txn_params%1%%TypeEnum_length#0: uint64 = 1u + let length%1#0: uint64 = (len "there") + let as_bytes%1#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "there") + let inner_txn_params%1%%param_ApplicationArgs_idx_0#0: bytes = method "greet(string)string" + let inner_txn_params%1%%param_ApplicationArgs_idx_1#0: bytes = encoded_value%1#0 + let inner_txn_params%1%%ApplicationArgs_length#0: uint64 = 2u + let inner_txn_params%1%%param_ApplicationID_idx_0#0: uint64 = app#0 + let inner_txn_params%1%%ApplicationID_length#0: uint64 = 1u + let inner_txn_params%1%%Sender_length#0: uint64 = 0u + let inner_txn_params%1%%Note_length#0: uint64 = 0u + let inner_txn_params%1%%Receiver_length#0: uint64 = 0u + let inner_txn_params%1%%Amount_length#0: uint64 = 0u + let inner_txn_params%1%%CloseRemainderTo_length#0: uint64 = 0u + let inner_txn_params%1%%VotePK_length#0: uint64 = 0u + let inner_txn_params%1%%SelectionPK_length#0: uint64 = 0u + let inner_txn_params%1%%VoteFirst_length#0: uint64 = 0u + let inner_txn_params%1%%VoteLast_length#0: uint64 = 0u + let inner_txn_params%1%%VoteKeyDilution_length#0: uint64 = 0u + let inner_txn_params%1%%Type_length#0: uint64 = 0u + let inner_txn_params%1%%XferAsset_length#0: uint64 = 0u + let inner_txn_params%1%%AssetAmount_length#0: uint64 = 0u + let inner_txn_params%1%%AssetSender_length#0: uint64 = 0u + let inner_txn_params%1%%AssetReceiver_length#0: uint64 = 0u + let inner_txn_params%1%%AssetCloseTo_length#0: uint64 = 0u + let inner_txn_params%1%%OnCompletion_length#0: uint64 = 0u + let inner_txn_params%1%%ApprovalProgram_length#0: uint64 = 0u + let inner_txn_params%1%%ClearStateProgram_length#0: uint64 = 0u + let inner_txn_params%1%%RekeyTo_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAsset_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetTotal_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetDecimals_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetDefaultFrozen_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetUnitName_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetName_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetURL_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetMetadataHash_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetManager_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetReserve_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetFreeze_length#0: uint64 = 0u + let inner_txn_params%1%%ConfigAssetClawback_length#0: uint64 = 0u + let inner_txn_params%1%%FreezeAsset_length#0: uint64 = 0u + let inner_txn_params%1%%FreezeAssetAccount_length#0: uint64 = 0u + let inner_txn_params%1%%FreezeAssetFrozen_length#0: uint64 = 0u + let inner_txn_params%1%%GlobalNumUint_length#0: uint64 = 0u + let inner_txn_params%1%%GlobalNumByteSlice_length#0: uint64 = 0u + let inner_txn_params%1%%LocalNumUint_length#0: uint64 = 0u + let inner_txn_params%1%%LocalNumByteSlice_length#0: uint64 = 0u + let inner_txn_params%1%%ExtraProgramPages_length#0: uint64 = 0u + let inner_txn_params%1%%Nonparticipation_length#0: uint64 = 0u + let inner_txn_params%1%%StateProofPK_length#0: uint64 = 0u + let inner_txn_params%1%%Accounts_length#0: uint64 = 0u + let inner_txn_params%1%%Assets_length#0: uint64 = 0u + let inner_txn_params%1%%Applications_length#0: uint64 = 0u + let inner_txn_params%1%%ApprovalProgramPages_length#0: uint64 = 0u + let inner_txn_params%1%%ClearStateProgramPages_length#0: uint64 = 0u + ((itxn_field ApplicationID) inner_txn_params%1%%param_ApplicationID_idx_0#0) + ((itxn_field ApplicationArgs) inner_txn_params%1%%param_ApplicationArgs_idx_0#0) + ((itxn_field ApplicationArgs) inner_txn_params%1%%param_ApplicationArgs_idx_1#0) + ((itxn_field TypeEnum) inner_txn_params%1%%param_TypeEnum_idx_0#0) + ((itxn_field Fee) inner_txn_params%1%%param_Fee_idx_0#0) + goto block@2 + block@2: // next_txn_L311 + itxn_submit + let awst_tmp%0#0: bytes = itxn[itxn_group_idx(0)].LastLog + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let _txn#0: itxn_group_idx = itxn_group_idx(0) + let _txn._is_last#0: bool = 1u + let _txn.Sender#0: bytes = itxn[_txn#0].Sender + let _txn.Fee#0: uint64 = itxn[_txn#0].Fee + let _txn.FirstValid#0: uint64 = itxn[_txn#0].FirstValid + let _txn.FirstValidTime#0: uint64 = itxn[_txn#0].FirstValidTime + let _txn.LastValid#0: uint64 = itxn[_txn#0].LastValid + let _txn.Note#0: bytes = itxn[_txn#0].Note + let _txn.Lease#0: bytes = itxn[_txn#0].Lease + let _txn.Receiver#0: bytes = itxn[_txn#0].Receiver + let _txn.Amount#0: uint64 = itxn[_txn#0].Amount + let _txn.CloseRemainderTo#0: bytes = itxn[_txn#0].CloseRemainderTo + let _txn.VotePK#0: bytes = itxn[_txn#0].VotePK + let _txn.SelectionPK#0: bytes = itxn[_txn#0].SelectionPK + let _txn.VoteFirst#0: uint64 = itxn[_txn#0].VoteFirst + let _txn.VoteLast#0: uint64 = itxn[_txn#0].VoteLast + let _txn.VoteKeyDilution#0: uint64 = itxn[_txn#0].VoteKeyDilution + let _txn.Type#0: bytes = itxn[_txn#0].Type + let _txn.TypeEnum#0: uint64 = itxn[_txn#0].TypeEnum + let _txn.XferAsset#0: uint64 = itxn[_txn#0].XferAsset + let _txn.AssetAmount#0: uint64 = itxn[_txn#0].AssetAmount + let _txn.AssetSender#0: bytes = itxn[_txn#0].AssetSender + let _txn.AssetReceiver#0: bytes = itxn[_txn#0].AssetReceiver + let _txn.AssetCloseTo#0: bytes = itxn[_txn#0].AssetCloseTo + let _txn.GroupIndex#0: uint64 = itxn[_txn#0].GroupIndex + let _txn.TxID#0: bytes = itxn[_txn#0].TxID + let _txn.ApplicationID#0: uint64 = itxn[_txn#0].ApplicationID + let _txn.OnCompletion#0: uint64 = itxn[_txn#0].OnCompletion + let _txn.NumAppArgs#0: uint64 = itxn[_txn#0].NumAppArgs + let _txn.NumAccounts#0: uint64 = itxn[_txn#0].NumAccounts + let _txn.ApprovalProgram#0: bytes = itxn[_txn#0].ApprovalProgram + let _txn.ClearStateProgram#0: bytes = itxn[_txn#0].ClearStateProgram + let _txn.RekeyTo#0: bytes = itxn[_txn#0].RekeyTo + let _txn.ConfigAsset#0: uint64 = itxn[_txn#0].ConfigAsset + let _txn.ConfigAssetTotal#0: uint64 = itxn[_txn#0].ConfigAssetTotal + let _txn.ConfigAssetDecimals#0: uint64 = itxn[_txn#0].ConfigAssetDecimals + let _txn.ConfigAssetDefaultFrozen#0: bool = itxn[_txn#0].ConfigAssetDefaultFrozen + let _txn.ConfigAssetUnitName#0: bytes = itxn[_txn#0].ConfigAssetUnitName + let _txn.ConfigAssetName#0: bytes = itxn[_txn#0].ConfigAssetName + let _txn.ConfigAssetURL#0: bytes = itxn[_txn#0].ConfigAssetURL + let _txn.ConfigAssetMetadataHash#0: bytes = itxn[_txn#0].ConfigAssetMetadataHash + let _txn.ConfigAssetManager#0: bytes = itxn[_txn#0].ConfigAssetManager + let _txn.ConfigAssetReserve#0: bytes = itxn[_txn#0].ConfigAssetReserve + let _txn.ConfigAssetFreeze#0: bytes = itxn[_txn#0].ConfigAssetFreeze + let _txn.ConfigAssetClawback#0: bytes = itxn[_txn#0].ConfigAssetClawback + let _txn.FreezeAsset#0: uint64 = itxn[_txn#0].FreezeAsset + let _txn.FreezeAssetAccount#0: bytes = itxn[_txn#0].FreezeAssetAccount + let _txn.FreezeAssetFrozen#0: bool = itxn[_txn#0].FreezeAssetFrozen + let _txn.NumAssets#0: uint64 = itxn[_txn#0].NumAssets + let _txn.NumApplications#0: uint64 = itxn[_txn#0].NumApplications + let _txn.GlobalNumUint#0: uint64 = itxn[_txn#0].GlobalNumUint + let _txn.GlobalNumByteSlice#0: uint64 = itxn[_txn#0].GlobalNumByteSlice + let _txn.LocalNumUint#0: uint64 = itxn[_txn#0].LocalNumUint + let _txn.LocalNumByteSlice#0: uint64 = itxn[_txn#0].LocalNumByteSlice + let _txn.ExtraProgramPages#0: uint64 = itxn[_txn#0].ExtraProgramPages + let _txn.Nonparticipation#0: bool = itxn[_txn#0].Nonparticipation + let _txn.NumLogs#0: uint64 = itxn[_txn#0].NumLogs + let _txn.CreatedAssetID#0: uint64 = itxn[_txn#0].CreatedAssetID + let _txn.CreatedApplicationID#0: uint64 = itxn[_txn#0].CreatedApplicationID + let _txn.LastLog#0: bytes = itxn[_txn#0].LastLog + let _txn.StateProofPK#0: bytes = itxn[_txn#0].StateProofPK + let _txn.NumApprovalProgramPages#0: uint64 = itxn[_txn#0].NumApprovalProgramPages + let _txn.NumClearStateProgramPages#0: uint64 = itxn[_txn#0].NumClearStateProgramPages + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + let inner_txn_params%2#0: itxn_field_set = itxn_field_set(2) + let inner_txn_params%2%%param_Fee_idx_0#0: uint64 = 0u + let inner_txn_params%2%%Fee_length#0: uint64 = 1u + let inner_txn_params%2%%param_TypeEnum_idx_0#0: uint64 = appl + let inner_txn_params%2%%TypeEnum_length#0: uint64 = 1u + let inner_txn_params%2%%param_ApplicationArgs_idx_0#0: bytes = method "delete()void" + let inner_txn_params%2%%ApplicationArgs_length#0: uint64 = 1u + let inner_txn_params%2%%param_ApplicationID_idx_0#0: uint64 = app#0 + let inner_txn_params%2%%ApplicationID_length#0: uint64 = 1u + let inner_txn_params%2%%param_OnCompletion_idx_0#0: uint64 = DeleteApplication + let inner_txn_params%2%%OnCompletion_length#0: uint64 = 1u + let inner_txn_params%2%%Sender_length#0: uint64 = 0u + let inner_txn_params%2%%Note_length#0: uint64 = 0u + let inner_txn_params%2%%Receiver_length#0: uint64 = 0u + let inner_txn_params%2%%Amount_length#0: uint64 = 0u + let inner_txn_params%2%%CloseRemainderTo_length#0: uint64 = 0u + let inner_txn_params%2%%VotePK_length#0: uint64 = 0u + let inner_txn_params%2%%SelectionPK_length#0: uint64 = 0u + let inner_txn_params%2%%VoteFirst_length#0: uint64 = 0u + let inner_txn_params%2%%VoteLast_length#0: uint64 = 0u + let inner_txn_params%2%%VoteKeyDilution_length#0: uint64 = 0u + let inner_txn_params%2%%Type_length#0: uint64 = 0u + let inner_txn_params%2%%XferAsset_length#0: uint64 = 0u + let inner_txn_params%2%%AssetAmount_length#0: uint64 = 0u + let inner_txn_params%2%%AssetSender_length#0: uint64 = 0u + let inner_txn_params%2%%AssetReceiver_length#0: uint64 = 0u + let inner_txn_params%2%%AssetCloseTo_length#0: uint64 = 0u + let inner_txn_params%2%%ApprovalProgram_length#0: uint64 = 0u + let inner_txn_params%2%%ClearStateProgram_length#0: uint64 = 0u + let inner_txn_params%2%%RekeyTo_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAsset_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetTotal_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetDecimals_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetDefaultFrozen_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetUnitName_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetName_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetURL_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetMetadataHash_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetManager_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetReserve_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetFreeze_length#0: uint64 = 0u + let inner_txn_params%2%%ConfigAssetClawback_length#0: uint64 = 0u + let inner_txn_params%2%%FreezeAsset_length#0: uint64 = 0u + let inner_txn_params%2%%FreezeAssetAccount_length#0: uint64 = 0u + let inner_txn_params%2%%FreezeAssetFrozen_length#0: uint64 = 0u + let inner_txn_params%2%%GlobalNumUint_length#0: uint64 = 0u + let inner_txn_params%2%%GlobalNumByteSlice_length#0: uint64 = 0u + let inner_txn_params%2%%LocalNumUint_length#0: uint64 = 0u + let inner_txn_params%2%%LocalNumByteSlice_length#0: uint64 = 0u + let inner_txn_params%2%%ExtraProgramPages_length#0: uint64 = 0u + let inner_txn_params%2%%Nonparticipation_length#0: uint64 = 0u + let inner_txn_params%2%%StateProofPK_length#0: uint64 = 0u + let inner_txn_params%2%%Accounts_length#0: uint64 = 0u + let inner_txn_params%2%%Assets_length#0: uint64 = 0u + let inner_txn_params%2%%Applications_length#0: uint64 = 0u + let inner_txn_params%2%%ApprovalProgramPages_length#0: uint64 = 0u + let inner_txn_params%2%%ClearStateProgramPages_length#0: uint64 = 0u + ((itxn_field OnCompletion) inner_txn_params%2%%param_OnCompletion_idx_0#0) + ((itxn_field ApplicationID) inner_txn_params%2%%param_ApplicationID_idx_0#0) + ((itxn_field ApplicationArgs) inner_txn_params%2%%param_ApplicationArgs_idx_0#0) + ((itxn_field TypeEnum) inner_txn_params%2%%param_TypeEnum_idx_0#0) + ((itxn_field Fee) inner_txn_params%2%%param_Fee_idx_0#0) + goto block@3 + block@3: // next_txn_L316 + itxn_submit + return + subroutine test_cases.compile.factory.HelloFactory.__algopy_default_create() -> void: block@0: // L24 return 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 b01cac687e..c72d59ca29 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -667,6 +675,65 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + let compiled.0#0: bytes = CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ + let compiled.1#0: bytes = + let compiled.2#0: bytes = CoEBQw== + let compiled.3#0: bytes = + let compiled.4#0: uint64 = 0u + let compiled.5#0: uint64 = 0u + let compiled.6#0: uint64 = 1u + let compiled.7#0: uint64 = 0u + let compiled.8#0: uint64 = 0u + itxn_begin + let length%0#0: uint64 = 3u + 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 "hey") + ((itxn_field ExtraProgramPages) compiled.4#0) + ((itxn_field LocalNumByteSlice) compiled.8#0) + ((itxn_field LocalNumUint) compiled.7#0) + ((itxn_field GlobalNumByteSlice) compiled.6#0) + ((itxn_field GlobalNumUint) compiled.5#0) + ((itxn_field ClearStateProgramPages) compiled.2#0) + ((itxn_field ClearStateProgramPages) compiled.3#0) + ((itxn_field ApprovalProgramPages) compiled.0#0) + ((itxn_field ApprovalProgramPages) compiled.1#0) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) encoded_value%0#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + let length%1#0: uint64 = 5u + let as_bytes%1#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "there") + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) encoded_value%1#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: 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 311a21f4c1..7272f576c7 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -518,6 +526,46 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + let length_uint16%0#0: bytes = 0x0003 + let encoded_value%0#0: bytes = (concat length_uint16%0#0 "hey") + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + ((itxn_field ApprovalProgramPages) CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) encoded_value%0#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + let length_uint16%1#0: bytes = 0x0005 + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "there") + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) encoded_value%1#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: 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 5aaf966239..7cdedc0b7d 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -504,6 +512,44 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + let encoded_value%0#0: bytes = 0x0003686579 + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + ((itxn_field ApprovalProgramPages) CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) encoded_value%0#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + let encoded_value%1#0: bytes = 0x00057468657265 + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) encoded_value%1#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: 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 0de81e102e..f332afd0ac 100644 --- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir +++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -490,6 +498,42 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + ((itxn_field ApprovalProgramPages) CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) 0x0003686579) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) 0x00057468657265) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: diff --git a/test_cases/compile/out/client_HelloFactory.py b/test_cases/compile/out/client_HelloFactory.py index d220a40323..3fb50a10a5 100644 --- a/test_cases/compile/out/client_HelloFactory.py +++ b/test_cases/compile/out/client_HelloFactory.py @@ -61,3 +61,8 @@ def test_arc4_update( def test_other_constants( self, ) -> None: ... + + @algopy.arc4.abimethod + def test_abi_call_create_params( + self, + ) -> None: ... diff --git a/test_cases/compile/out/module.awst b/test_cases/compile/out/module.awst index dc6de56be0..b018fe7a10 100644 --- a/test_cases/compile/out/module.awst +++ b/test_cases/compile/out/module.awst @@ -222,4 +222,13 @@ contract HelloFactory extends (algopy.arc4.ARC4Contract) assert(result == hex<"68656C6C6F204A6F686E6E7935"> + reinterpret_cast(global()) + Method("something()void")) submit_txn(create_inner_transaction(Fee=0u, TypeEnum=appl, ApplicationArgs=(Method("delete()void")), ApplicationID=app, OnCompletion=DeleteApplication)) } + + abimethod test_abi_call_create_params(): void + { + compiled: tuple = compiled_contract(test_cases.compile.apps.Hello,,, prefix=None, variables={}) + app: application = submit_txn(create_inner_transaction(Fee=0u, TypeEnum=appl, ApplicationArgs=(Method("create(string)void"), arc4_encode('hey', arc4.dynamic_array)), ApprovalProgramPages=(SINGLE_EVAL(id=45, source=(compiled[0], compiled[1]))[0], SINGLE_EVAL(id=45)[1]), ClearStateProgramPages=(SINGLE_EVAL(id=46, source=(compiled[2], compiled[3]))[0], SINGLE_EVAL(id=46)[1]), GlobalNumUint=compiled[5], GlobalNumByteSlice=compiled[6], LocalNumUint=compiled[7], LocalNumByteSlice=compiled[8], ExtraProgramPages=compiled[4])).CreatedApplicationID + (result, _txn): tuple = (arc4_decode(checked_maybe((extract<4, 0>(SINGLE_EVAL(id=48, source=SINGLE_EVAL(id=47, source=submit_txn(create_inner_transaction(Fee=0u, TypeEnum=appl, ApplicationArgs=(Method("greet(string)string"), arc4_encode('there', arc4.dynamic_array)), ApplicationID=app))).LastLog)), extract<0, 4>(SINGLE_EVAL(id=48)) == hex<"151F7C75">)), string), SINGLE_EVAL(id=47)) + assert(result == 'hey there') + submit_txn(create_inner_transaction(Fee=0u, TypeEnum=appl, ApplicationArgs=(Method("delete()void")), ApplicationID=app, OnCompletion=DeleteApplication)) + } } \ No newline at end of file diff --git a/test_cases/compile/out_O2/HelloFactory.approval.teal b/test_cases/compile/out_O2/HelloFactory.approval.teal index 14b489aa23..b64cb70690 100644 --- a/test_cases/compile/out_O2/HelloFactory.approval.teal +++ b/test_cases/compile/out_O2/HelloFactory.approval.teal @@ -9,7 +9,7 @@ test_cases.compile.factory.HelloFactory.approval_program: __puya_arc4_router__: proto 0 1 txn NumAppArgs - bz __puya_arc4_router___bare_routing@15 + bz __puya_arc4_router___bare_routing@16 method "test_logicsig()address" method "test_compile_contract()void" method "test_compile_contract_tmpl()void" @@ -21,8 +21,9 @@ __puya_arc4_router__: method "test_arc4_create_large()void" method "test_arc4_update()void" method "test_other_constants()void" + method "test_abi_call_create_params()void" txna ApplicationArgs 0 - match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 + match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 __puya_arc4_router___test_abi_call_create_params_route@13 int 0 retsub @@ -140,16 +141,26 @@ __puya_arc4_router___test_other_constants_route@12: int 1 retsub -__puya_arc4_router___bare_routing@15: +__puya_arc4_router___test_abi_call_create_params_route@13: txn OnCompletion - bnz __puya_arc4_router___after_if_else@19 + ! + assert // OnCompletion is NoOp + txn ApplicationID + assert // is not creating + callsub test_abi_call_create_params + int 1 + retsub + +__puya_arc4_router___bare_routing@16: + txn OnCompletion + bnz __puya_arc4_router___after_if_else@20 txn ApplicationID ! assert // is creating int 1 retsub -__puya_arc4_router___after_if_else@19: +__puya_arc4_router___after_if_else@20: int 0 retsub @@ -770,3 +781,61 @@ test_other_constants: itxn_field Fee itxn_submit retsub + + +// test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: +test_abi_call_create_params: + proto 0 0 + itxn_begin + int 1 + itxn_field GlobalNumByteSlice + byte base64 CoEBQw== + itxn_field ClearStateProgramPages + byte base64 CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ + itxn_field ApprovalProgramPages + method "create(string)void" + itxn_field ApplicationArgs + byte 0x0003686579 + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn CreatedApplicationID + itxn_begin + dup + itxn_field ApplicationID + method "greet(string)string" + itxn_field ApplicationArgs + byte 0x00057468657265 + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn LastLog + dup + extract 4 0 + swap + extract 0 4 + byte 0x151f7c75 + == + assert // ARC4 prefix is valid + extract 2 0 + byte "hey there" + == + assert + itxn_begin + int DeleteApplication + itxn_field OnCompletion + itxn_field ApplicationID + method "delete()void" + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + retsub diff --git a/test_cases/compile/out_O2/HelloFactory.destructured.ir b/test_cases/compile/out_O2/HelloFactory.destructured.ir index d13ef7f751..2087401bd8 100644 --- a/test_cases/compile/out_O2/HelloFactory.destructured.ir +++ b/test_cases/compile/out_O2/HelloFactory.destructured.ir @@ -8,10 +8,10 @@ contract test_cases.compile.factory.HelloFactory: subroutine test_cases.compile.factory.HelloFactory.__puya_arc4_router__() -> bool: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) - goto tmp%0#0 ? block@1 : block@15 + goto tmp%0#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (! tmp%3#0) @@ -102,15 +102,23 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%47#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - goto tmp%49#0 ? block@19 : block@16 - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (! tmp%50#0) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (! tmp%49#0) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + (assert tmp%51#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() return 1u - block@19: // after_if_else_L24 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + goto tmp%53#0 ? block@20 : block@17 + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (! tmp%54#0) + (assert tmp%55#0) // is creating + return 1u + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -490,6 +498,42 @@ contract test_cases.compile.factory.HelloFactory: ((itxn_field Fee) 0u) itxn_submit return + + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + ((itxn_field ApprovalProgramPages) CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) 0x0003686579) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) 0x00057468657265) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) app#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + itxn_submit + return program clear-state: subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool: diff --git a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal index 36ad4d2edb..20bb3cb183 100644 --- a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal +++ b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal @@ -13,7 +13,7 @@ __puya_arc4_router__: txn NumAppArgs int 0 != - bz __puya_arc4_router___bare_routing@15 + bz __puya_arc4_router___bare_routing@16 txna ApplicationArgs 0 method "test_logicsig()address" method "test_compile_contract()void" @@ -26,9 +26,10 @@ __puya_arc4_router__: method "test_arc4_create_large()void" method "test_arc4_update()void" method "test_other_constants()void" - uncover 11 - match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 - b __puya_arc4_router___switch_case_default@13 + method "test_abi_call_create_params()void" + uncover 12 + match __puya_arc4_router___test_logicsig_route@2 __puya_arc4_router___test_compile_contract_route@3 __puya_arc4_router___test_compile_contract_tmpl_route@4 __puya_arc4_router___test_compile_contract_prfx_route@5 __puya_arc4_router___test_compile_contract_large_route@6 __puya_arc4_router___test_arc4_create_route@7 __puya_arc4_router___test_arc4_create_tmpl_route@8 __puya_arc4_router___test_arc4_create_prfx_route@9 __puya_arc4_router___test_arc4_create_large_route@10 __puya_arc4_router___test_arc4_update_route@11 __puya_arc4_router___test_other_constants_route@12 __puya_arc4_router___test_abi_call_create_params_route@13 + b __puya_arc4_router___switch_case_default@14 __puya_arc4_router___test_logicsig_route@2: // compile/factory.py:26 @@ -199,19 +200,34 @@ __puya_arc4_router___test_other_constants_route@12: int 1 retsub -__puya_arc4_router___switch_case_default@13: - b __puya_arc4_router___after_if_else@19 +__puya_arc4_router___test_abi_call_create_params_route@13: + // compile/factory.py:296 + // @arc4.abimethod() + txn OnCompletion + int NoOp + == + assert // OnCompletion is NoOp + txn ApplicationID + int 0 + != + assert // is not creating + callsub test_abi_call_create_params + int 1 + retsub -__puya_arc4_router___bare_routing@15: +__puya_arc4_router___switch_case_default@14: + b __puya_arc4_router___after_if_else@20 + +__puya_arc4_router___bare_routing@16: // compile/factory.py:24 // class HelloFactory(ARC4Contract): txn OnCompletion int 0 uncover 1 - match __puya_arc4_router_____algopy_default_create@16 - b __puya_arc4_router___switch_case_default@17 + match __puya_arc4_router_____algopy_default_create@17 + b __puya_arc4_router___switch_case_default@18 -__puya_arc4_router_____algopy_default_create@16: +__puya_arc4_router_____algopy_default_create@17: // compile/factory.py:24 // class HelloFactory(ARC4Contract): txn ApplicationID @@ -222,9 +238,9 @@ __puya_arc4_router_____algopy_default_create@16: int 1 retsub -__puya_arc4_router___switch_case_default@17: +__puya_arc4_router___switch_case_default@18: -__puya_arc4_router___after_if_else@19: +__puya_arc4_router___after_if_else@20: // compile/factory.py:24 // class HelloFactory(ARC4Contract): int 0 @@ -1689,6 +1705,130 @@ test_other_constants: retsub +// test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: +test_abi_call_create_params: + // compile/factory.py:296-297 + // @arc4.abimethod() + // def test_abi_call_create_params(self) -> None: + proto 0 0 + // compile/factory.py:299-309 + // app = arc4.abi_call( + // Hello.create, + // String("hey"), + // approval_program=compiled.approval_program, + // clear_state_program=compiled.clear_state_program, + // global_num_uint=compiled.global_uints, + // global_num_bytes=compiled.global_bytes, + // local_num_uint=compiled.local_uints, + // local_num_bytes=compiled.local_bytes, + // extra_program_pages=compiled.extra_program_pages, + // ).created_app + itxn_begin + // compile/factory.py:301 + // String("hey"), + byte "hey" + len + itob + extract 6 2 + byte "hey" + concat + // compile/factory.py:298 + // compiled = compile_contract(Hello) + int 0 + itxn_field ExtraProgramPages + int 0 + itxn_field LocalNumByteSlice + int 0 + itxn_field LocalNumUint + int 1 + itxn_field GlobalNumByteSlice + int 0 + itxn_field GlobalNumUint + byte base64 CoEBQw== + itxn_field ClearStateProgramPages + byte 0x + itxn_field ClearStateProgramPages + byte base64 CiACAAEmAQhncmVldGluZzEYQAADiAC3iAABQ4oAATEbIhNBAHE2GgCCAwQg3zpUBCQ3jTwE0KKCAE8DjgMAAwAYAChCAE0xGSISRDEYIhJENhoBVwIAiABWI4kxGYEFEkQxGCITRIgATiOJMRkiEkQxGCITRDYaAVcCAIgAPUkVFlcGAk8BUIAEFR98dU8BULAjiUIAFzEZgQRPAY4BAANCAAoxGCITRIgAHyOJIomKAQAoi/9niYoAAImKAQEiKGVEgAEgUIv/UImKAACJigAAKIAAZ4k= + itxn_field ApprovalProgramPages + byte 0x + itxn_field ApprovalProgramPages + // compile/factory.py:299-309 + // app = arc4.abi_call( + // Hello.create, + // String("hey"), + // approval_program=compiled.approval_program, + // clear_state_program=compiled.clear_state_program, + // global_num_uint=compiled.global_uints, + // global_num_bytes=compiled.global_bytes, + // local_num_uint=compiled.local_uints, + // local_num_bytes=compiled.local_bytes, + // extra_program_pages=compiled.extra_program_pages, + // ).created_app + method "create(string)void" + itxn_field ApplicationArgs + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn CreatedApplicationID + dup + cover 1 + // compile/factory.py:311 + // result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) + itxn_begin + byte "there" + len + itob + extract 6 2 + byte "there" + concat + // compile/factory.py:299 + // app = arc4.abi_call( + uncover 1 + itxn_field ApplicationID + // compile/factory.py:311 + // result, _txn = arc4.abi_call(Hello.greet, "there", app_id=app) + method "greet(string)string" + itxn_field ApplicationArgs + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + itxn LastLog + dup + extract 4 0 + cover 1 + extract 0 4 + byte 0x151f7c75 + == + assert // ARC4 prefix is valid + extract 2 0 + // compile/factory.py:313 + // assert result == "hey there" + byte "hey there" + == + assert + // compile/factory.py:315-316 + // # delete the app + // arc4.abi_call(Hello.delete, app_id=app) + itxn_begin + int DeleteApplication + itxn_field OnCompletion + itxn_field ApplicationID + method "delete()void" + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + int 0 + itxn_field Fee + itxn_submit + retsub + + // test_cases.compile.factory.HelloFactory.__algopy_default_create() -> void: __algopy_default_create: // compile/factory.py:24 diff --git a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir index 32a3b4f953..58d25ab238 100644 --- a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir +++ b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir @@ -9,10 +9,10 @@ contract test_cases.compile.factory.HelloFactory: block@0: // L24 let tmp%0#0: uint64 = (txn NumAppArgs) let tmp%1#0: bool = (!= tmp%0#0 0u) - goto tmp%1#0 ? block@1 : block@15 + goto tmp%1#0 ? block@1 : block@16 block@1: // abi_routing_L24 let tmp%2#0: bytes = (txna ApplicationArgs 0) - switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@13} + switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@14} block@2: // test_logicsig_route_L26 let tmp%3#0: uint64 = (txn OnCompletion) let tmp%4#0: bool = (== tmp%3#0 NoOp) @@ -114,24 +114,33 @@ contract test_cases.compile.factory.HelloFactory: (assert tmp%48#0) // is not creating test_cases.compile.factory.HelloFactory.test_other_constants() return 1u - block@13: // switch_case_default_L24 - goto block@14 - block@14: // switch_case_next_L24 - goto block@19 - block@15: // bare_routing_L24 + block@13: // test_abi_call_create_params_route_L296 let tmp%49#0: uint64 = (txn OnCompletion) - switch tmp%49#0 {0u => block@16, * => block@17} - block@16: // __algopy_default_create_L24 - let tmp%50#0: uint64 = (txn ApplicationID) - let tmp%51#0: bool = (== tmp%50#0 0u) - (assert tmp%51#0) // is creating + let tmp%50#0: bool = (== tmp%49#0 NoOp) + (assert tmp%50#0) // OnCompletion is NoOp + let tmp%51#0: uint64 = (txn ApplicationID) + let tmp%52#0: bool = (!= tmp%51#0 0u) + (assert tmp%52#0) // is not creating + test_cases.compile.factory.HelloFactory.test_abi_call_create_params() + return 1u + block@14: // switch_case_default_L24 + goto block@15 + block@15: // switch_case_next_L24 + goto block@20 + block@16: // bare_routing_L24 + let tmp%53#0: uint64 = (txn OnCompletion) + switch tmp%53#0 {0u => block@17, * => block@18} + block@17: // __algopy_default_create_L24 + let tmp%54#0: uint64 = (txn ApplicationID) + let tmp%55#0: bool = (== tmp%54#0 0u) + (assert tmp%55#0) // is creating test_cases.compile.factory.HelloFactory.__algopy_default_create() return 1u - block@17: // switch_case_default_L24 - goto block@18 - block@18: // switch_case_next_L24 + block@18: // switch_case_default_L24 goto block@19 - block@19: // after_if_else_L24 + block@19: // switch_case_next_L24 + goto block@20 + block@20: // after_if_else_L24 return 0u subroutine test_cases.compile.factory.HelloFactory.test_logicsig() -> bytes: @@ -716,6 +725,66 @@ contract test_cases.compile.factory.HelloFactory: itxn_submit return + subroutine test_cases.compile.factory.HelloFactory.test_abi_call_create_params() -> void: + block@0: // L296 + itxn_begin + let length%0#0: uint64 = (len "hey") + 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 "hey") + let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = encoded_value%0#0 + ((itxn_field ExtraProgramPages) 0u) + ((itxn_field LocalNumByteSlice) 0u) + ((itxn_field LocalNumUint) 0u) + ((itxn_field GlobalNumByteSlice) 1u) + ((itxn_field GlobalNumUint) 0u) + ((itxn_field ClearStateProgramPages) CoEBQw==) + (itxn_field ClearStateProgramPages) + ((itxn_field ApprovalProgramPages) CiACAAEmAQhncmVldGluZzEYQAADiAC3iAABQ4oAATEbIhNBAHE2GgCCAwQg3zpUBCQ3jTwE0KKCAE8DjgMAAwAYAChCAE0xGSISRDEYIhJENhoBVwIAiABWI4kxGYEFEkQxGCITRIgATiOJMRkiEkQxGCITRDYaAVcCAIgAPUkVFlcGAk8BUIAEFR98dU8BULAjiUIAFzEZgQRPAY4BAANCAAoxGCITRIgAHyOJIomKAQAoi/9niYoAAImKAQEiKGVEgAEgUIv/UImKAACJigAAKIAAZ4k=) + (itxn_field ApprovalProgramPages) + ((itxn_field ApplicationArgs) method "create(string)void") + ((itxn_field ApplicationArgs) inner_txn_params%0%%param_ApplicationArgs_idx_1#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + goto block@1 + block@1: // next_txn_L299 + itxn_submit + let app#0: uint64 = (itxn CreatedApplicationID) + itxn_begin + let length%1#0: uint64 = (len "there") + let as_bytes%1#0: bytes = (itob length%1#0) + let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%1#0) + let encoded_value%1#0: bytes = (concat length_uint16%1#0 "there") + let inner_txn_params%1%%param_ApplicationArgs_idx_1#0: bytes = encoded_value%1#0 + let inner_txn_params%1%%param_ApplicationID_idx_0#0: uint64 = app#0 + ((itxn_field ApplicationID) inner_txn_params%1%%param_ApplicationID_idx_0#0) + ((itxn_field ApplicationArgs) method "greet(string)string") + ((itxn_field ApplicationArgs) inner_txn_params%1%%param_ApplicationArgs_idx_1#0) + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + goto block@2 + block@2: // next_txn_L311 + itxn_submit + let awst_tmp%0#0: bytes = (itxn LastLog) + let tmp%0#0: bytes = ((extract 4 0) awst_tmp%0#0) + let tmp%1#0: bytes = ((extract 0 4) awst_tmp%0#0) + let tmp%2#0: bool = (== tmp%1#0 0x151f7c75) + (assert tmp%2#0) // ARC4 prefix is valid + let result#0: bytes = ((extract 2 0) tmp%0#0) + let tmp%3#0: bool = (== result#0 "hey there") + (assert tmp%3#0) + itxn_begin + let inner_txn_params%2%%param_ApplicationID_idx_0#0: uint64 = app#0 + ((itxn_field OnCompletion) DeleteApplication) + ((itxn_field ApplicationID) inner_txn_params%2%%param_ApplicationID_idx_0#0) + ((itxn_field ApplicationArgs) method "delete()void") + ((itxn_field TypeEnum) appl) + ((itxn_field Fee) 0u) + goto block@3 + block@3: // next_txn_L316 + itxn_submit + return + subroutine test_cases.compile.factory.HelloFactory.__algopy_default_create() -> void: block@0: // L24 return diff --git a/test_cases/compile/puya.log b/test_cases/compile/puya.log index 4a1f3d85cc..1f01e8706c 100644 --- a/test_cases/compile/puya.log +++ b/test_cases/compile/puya.log @@ -614,20 +614,22 @@ debug: Sealing block@11: // test_arc4_update_route_L236 debug: Terminated block@11: // test_arc4_update_route_L236 debug: Sealing block@12: // test_other_constants_route_L270 debug: Terminated block@12: // test_other_constants_route_L270 -debug: Sealing block@13: // switch_case_default_L24 -debug: Terminated block@13: // switch_case_default_L24 -debug: Sealing block@14: // switch_case_next_L24 -debug: Terminated block@14: // switch_case_next_L24 -debug: Sealing block@15: // bare_routing_L24 -debug: Terminated block@15: // bare_routing_L24 -debug: Sealing block@16: // __algopy_default_create_L24 -debug: Terminated block@16: // __algopy_default_create_L24 -debug: Sealing block@17: // switch_case_default_L24 -debug: Terminated block@17: // switch_case_default_L24 -debug: Sealing block@18: // switch_case_next_L24 -debug: Terminated block@18: // switch_case_next_L24 -debug: Sealing block@19: // after_if_else_L24 -debug: Terminated block@19: // after_if_else_L24 +debug: Sealing block@13: // test_abi_call_create_params_route_L296 +debug: Terminated block@13: // test_abi_call_create_params_route_L296 +debug: Sealing block@14: // switch_case_default_L24 +debug: Terminated block@14: // switch_case_default_L24 +debug: Sealing block@15: // switch_case_next_L24 +debug: Terminated block@15: // switch_case_next_L24 +debug: Sealing block@16: // bare_routing_L24 +debug: Terminated block@16: // bare_routing_L24 +debug: Sealing block@17: // __algopy_default_create_L24 +debug: Terminated block@17: // __algopy_default_create_L24 +debug: Sealing block@18: // switch_case_default_L24 +debug: Terminated block@18: // switch_case_default_L24 +debug: Sealing block@19: // switch_case_next_L24 +debug: Terminated block@19: // switch_case_next_L24 +debug: Sealing block@20: // after_if_else_L24 +debug: Terminated block@20: // after_if_else_L24 debug: Sealing block@0: // L26 debug: Terminated block@0: // L26 debug: Sealing block@0: // L30 @@ -714,6 +716,14 @@ debug: Sealing block@2: // next_txn_L287 debug: Terminated block@2: // next_txn_L287 debug: Sealing block@3: // next_txn_L294 debug: Terminated block@3: // next_txn_L294 +debug: Sealing block@0: // L296 +debug: Terminated block@0: // L296 +debug: Sealing block@1: // next_txn_L299 +debug: Terminated block@1: // next_txn_L299 +debug: Sealing block@2: // next_txn_L311 +debug: Terminated block@2: // next_txn_L311 +debug: Sealing block@3: // next_txn_L316 +debug: Terminated block@3: // next_txn_L316 debug: Sealing block@0: // L24 debug: Terminated block@0: // L24 debug: Sealing block@0: // L1 @@ -2546,7 +2556,8 @@ debug: Simplified (== tmp%33#0 NoOp) to (! tmp%33#0) debug: Simplified (== tmp%37#0 NoOp) to (! tmp%37#0) debug: Simplified (== tmp%41#0 NoOp) to (! tmp%41#0) debug: Simplified (== tmp%45#0 NoOp) to (! tmp%45#0) -debug: Simplified (== tmp%50#0 0u) to (! tmp%50#0) +debug: Simplified (== tmp%49#0 NoOp) to (! tmp%49#0) +debug: Simplified (== tmp%54#0 0u) to (! tmp%54#0) debug: Optimizer: Remove Unused Variables debug: Removing unused variable tmp%1#0 debug: Removing unused variable tmp%6#0 @@ -2560,29 +2571,30 @@ debug: Removing unused variable tmp%36#0 debug: Removing unused variable tmp%40#0 debug: Removing unused variable tmp%44#0 debug: Removing unused variable tmp%48#0 +debug: Removing unused variable tmp%52#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_L24 as a predecessor of block@14: // switch_case_next_L24 due to inlining of block@13: // switch_case_default_L24 -debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@13} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@14} +debug: adding block@1: // abi_routing_L24 as a predecessor of block@15: // switch_case_next_L24 due to inlining of block@14: // switch_case_default_L24 +debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@14} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@15} debug: simplifying a switch with constants into goto nth -debug: simplified terminator of block@15: // bare_routing_L24 from switch tmp%49#0 {0u => block@16, * => block@17} to goto_nth [block@16][tmp%49#0] else goto block@17 +debug: simplified terminator of block@16: // bare_routing_L24 from switch tmp%53#0 {0u => block@17, * => block@18} to goto_nth [block@17][tmp%53#0] else goto block@18 debug: inlining the default target of a switch/goto nth -debug: adding block@1: // abi_routing_L24 as a predecessor of block@19: // after_if_else_L24 due to inlining of block@14: // switch_case_next_L24 -debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@14} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@19} +debug: adding block@1: // abi_routing_L24 as a predecessor of block@20: // after_if_else_L24 due to inlining of block@15: // switch_case_next_L24 +debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@15} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@20} debug: simplifying a goto nth with two targets into a conditional branch -debug: simplified terminator of block@15: // bare_routing_L24 from goto_nth [block@16][tmp%49#0] else goto block@17 to goto tmp%49#0 ? block@17 : block@16 +debug: simplified terminator of block@16: // bare_routing_L24 from goto_nth [block@17][tmp%53#0] else goto block@18 to goto tmp%53#0 ? block@18 : block@17 debug: inlining the default target of a switch/goto nth -debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => block@19} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, * => return 0u} +debug: simplified terminator of block@1: // abi_routing_L24 from switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => block@20} to switch tmp%2#0 {method "test_logicsig()address" => block@2, method "test_compile_contract()void" => block@3, method "test_compile_contract_tmpl()void" => block@4, method "test_compile_contract_prfx()void" => block@5, method "test_compile_contract_large()void" => block@6, method "test_arc4_create()void" => block@7, method "test_arc4_create_tmpl()void" => block@8, method "test_arc4_create_prfx()void" => block@9, method "test_arc4_create_large()void" => block@10, method "test_arc4_update()void" => block@11, method "test_other_constants()void" => block@12, method "test_abi_call_create_params()void" => block@13, * => return 0u} debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@14: // switch_case_next_L24 with block@13: // switch_case_default_L24 in block@19: // after_if_else_L24 -debug: Merged linear block@14: // switch_case_next_L24 into block@13: // switch_case_default_L24 -debug: Replaced predecessor block@18: // switch_case_next_L24 with block@17: // switch_case_default_L24 in block@19: // after_if_else_L24 -debug: Merged linear block@18: // switch_case_next_L24 into block@17: // switch_case_default_L24 +debug: Replaced predecessor block@15: // switch_case_next_L24 with block@14: // switch_case_default_L24 in block@20: // after_if_else_L24 +debug: Merged linear block@15: // switch_case_next_L24 into block@14: // switch_case_default_L24 +debug: Replaced predecessor block@19: // switch_case_next_L24 with block@18: // switch_case_default_L24 in block@20: // after_if_else_L24 +debug: Merged linear block@19: // switch_case_next_L24 into block@18: // switch_case_default_L24 debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@13: // switch_case_default_L24 -debug: Removed empty block: block@17: // switch_case_default_L24 +debug: Removed empty block: block@14: // switch_case_default_L24 +debug: Removed empty block: block@18: // switch_case_default_L24 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizer: Remove Calls To No Op Subroutines @@ -5420,6 +5432,280 @@ 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.compile.factory.HelloFactory.test_abi_call_create_params +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Found equivalence set: encoded_value%0#0, inner_txn_params%0%%param_ApplicationArgs_idx_1#0 +debug: Replacing {inner_txn_params%0%%param_ApplicationArgs_idx_1#0} with encoded_value%0#0 made 1 modifications +debug: Found equivalence set: compiled.0#0, inner_txn_params%0%%param_ApprovalProgramPages_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_ApprovalProgramPages_idx_0#0} with compiled.0#0 made 1 modifications +debug: Found equivalence set: compiled.1#0, inner_txn_params%0%%param_ApprovalProgramPages_idx_1#0 +debug: Replacing {inner_txn_params%0%%param_ApprovalProgramPages_idx_1#0} with compiled.1#0 made 1 modifications +debug: Found equivalence set: compiled.2#0, inner_txn_params%0%%param_ClearStateProgramPages_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_ClearStateProgramPages_idx_0#0} with compiled.2#0 made 1 modifications +debug: Found equivalence set: compiled.3#0, inner_txn_params%0%%param_ClearStateProgramPages_idx_1#0 +debug: Replacing {inner_txn_params%0%%param_ClearStateProgramPages_idx_1#0} with compiled.3#0 made 1 modifications +debug: Found equivalence set: compiled.5#0, inner_txn_params%0%%param_GlobalNumUint_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_GlobalNumUint_idx_0#0} with compiled.5#0 made 1 modifications +debug: Found equivalence set: compiled.6#0, inner_txn_params%0%%param_GlobalNumByteSlice_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_GlobalNumByteSlice_idx_0#0} with compiled.6#0 made 1 modifications +debug: Found equivalence set: compiled.7#0, inner_txn_params%0%%param_LocalNumUint_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_LocalNumUint_idx_0#0} with compiled.7#0 made 1 modifications +debug: Found equivalence set: compiled.8#0, inner_txn_params%0%%param_LocalNumByteSlice_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_LocalNumByteSlice_idx_0#0} with compiled.8#0 made 1 modifications +debug: Found equivalence set: compiled.4#0, inner_txn_params%0%%param_ExtraProgramPages_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_ExtraProgramPages_idx_0#0} with compiled.4#0 made 1 modifications +debug: Found equivalence set: encoded_value%1#0, inner_txn_params%1%%param_ApplicationArgs_idx_1#0 +debug: Replacing {inner_txn_params%1%%param_ApplicationArgs_idx_1#0} with encoded_value%1#0 made 1 modifications +debug: Found equivalence set: app#0, inner_txn_params%1%%param_ApplicationID_idx_0#0, inner_txn_params%2%%param_ApplicationID_idx_0#0 +debug: Replacing {inner_txn_params%1%%param_ApplicationID_idx_0#0, inner_txn_params%2%%param_ApplicationID_idx_0#0} with app#0 made 2 modifications +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (len "hey") to 3u +debug: Simplified (len "there") to 5u +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable inner_txn_params%0#0 +debug: Removing unused variable inner_txn_params%0%%param_Fee_idx_0#0 +debug: Removing unused variable inner_txn_params%0%%Fee_length#0 +debug: Removing unused variable inner_txn_params%0%%param_TypeEnum_idx_0#0 +debug: Removing unused variable inner_txn_params%0%%TypeEnum_length#0 +debug: Removing unused variable inner_txn_params%0%%param_ApplicationArgs_idx_0#0 +debug: Removing unused variable inner_txn_params%0%%ApplicationArgs_length#0 +debug: Removing unused variable inner_txn_params%0%%ApprovalProgramPages_length#0 +debug: Removing unused variable inner_txn_params%0%%ClearStateProgramPages_length#0 +debug: Removing unused variable inner_txn_params%0%%GlobalNumUint_length#0 +debug: Removing unused variable inner_txn_params%0%%GlobalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%0%%LocalNumUint_length#0 +debug: Removing unused variable inner_txn_params%0%%LocalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%0%%ExtraProgramPages_length#0 +debug: Removing unused variable inner_txn_params%0%%Sender_length#0 +debug: Removing unused variable inner_txn_params%0%%Note_length#0 +debug: Removing unused variable inner_txn_params%0%%Receiver_length#0 +debug: Removing unused variable inner_txn_params%0%%Amount_length#0 +debug: Removing unused variable inner_txn_params%0%%CloseRemainderTo_length#0 +debug: Removing unused variable inner_txn_params%0%%VotePK_length#0 +debug: Removing unused variable inner_txn_params%0%%SelectionPK_length#0 +debug: Removing unused variable inner_txn_params%0%%VoteFirst_length#0 +debug: Removing unused variable inner_txn_params%0%%VoteLast_length#0 +debug: Removing unused variable inner_txn_params%0%%VoteKeyDilution_length#0 +debug: Removing unused variable inner_txn_params%0%%Type_length#0 +debug: Removing unused variable inner_txn_params%0%%XferAsset_length#0 +debug: Removing unused variable inner_txn_params%0%%AssetAmount_length#0 +debug: Removing unused variable inner_txn_params%0%%AssetSender_length#0 +debug: Removing unused variable inner_txn_params%0%%AssetReceiver_length#0 +debug: Removing unused variable inner_txn_params%0%%AssetCloseTo_length#0 +debug: Removing unused variable inner_txn_params%0%%ApplicationID_length#0 +debug: Removing unused variable inner_txn_params%0%%OnCompletion_length#0 +debug: Removing unused variable inner_txn_params%0%%ApprovalProgram_length#0 +debug: Removing unused variable inner_txn_params%0%%ClearStateProgram_length#0 +debug: Removing unused variable inner_txn_params%0%%RekeyTo_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAsset_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetTotal_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetDecimals_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetDefaultFrozen_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetUnitName_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetName_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetURL_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetMetadataHash_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetManager_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetReserve_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetFreeze_length#0 +debug: Removing unused variable inner_txn_params%0%%ConfigAssetClawback_length#0 +debug: Removing unused variable inner_txn_params%0%%FreezeAsset_length#0 +debug: Removing unused variable inner_txn_params%0%%FreezeAssetAccount_length#0 +debug: Removing unused variable inner_txn_params%0%%FreezeAssetFrozen_length#0 +debug: Removing unused variable inner_txn_params%0%%Nonparticipation_length#0 +debug: Removing unused variable inner_txn_params%0%%StateProofPK_length#0 +debug: Removing unused variable inner_txn_params%0%%Accounts_length#0 +debug: Removing unused variable inner_txn_params%0%%Assets_length#0 +debug: Removing unused variable inner_txn_params%0%%Applications_length#0 +debug: Removing unused variable inner_txn_params%1#0 +debug: Removing unused variable inner_txn_params%1%%param_Fee_idx_0#0 +debug: Removing unused variable inner_txn_params%1%%Fee_length#0 +debug: Removing unused variable inner_txn_params%1%%param_TypeEnum_idx_0#0 +debug: Removing unused variable inner_txn_params%1%%TypeEnum_length#0 +debug: Removing unused variable inner_txn_params%1%%param_ApplicationArgs_idx_0#0 +debug: Removing unused variable inner_txn_params%1%%ApplicationArgs_length#0 +debug: Removing unused variable inner_txn_params%1%%ApplicationID_length#0 +debug: Removing unused variable inner_txn_params%1%%Sender_length#0 +debug: Removing unused variable inner_txn_params%1%%Note_length#0 +debug: Removing unused variable inner_txn_params%1%%Receiver_length#0 +debug: Removing unused variable inner_txn_params%1%%Amount_length#0 +debug: Removing unused variable inner_txn_params%1%%CloseRemainderTo_length#0 +debug: Removing unused variable inner_txn_params%1%%VotePK_length#0 +debug: Removing unused variable inner_txn_params%1%%SelectionPK_length#0 +debug: Removing unused variable inner_txn_params%1%%VoteFirst_length#0 +debug: Removing unused variable inner_txn_params%1%%VoteLast_length#0 +debug: Removing unused variable inner_txn_params%1%%VoteKeyDilution_length#0 +debug: Removing unused variable inner_txn_params%1%%Type_length#0 +debug: Removing unused variable inner_txn_params%1%%XferAsset_length#0 +debug: Removing unused variable inner_txn_params%1%%AssetAmount_length#0 +debug: Removing unused variable inner_txn_params%1%%AssetSender_length#0 +debug: Removing unused variable inner_txn_params%1%%AssetReceiver_length#0 +debug: Removing unused variable inner_txn_params%1%%AssetCloseTo_length#0 +debug: Removing unused variable inner_txn_params%1%%OnCompletion_length#0 +debug: Removing unused variable inner_txn_params%1%%ApprovalProgram_length#0 +debug: Removing unused variable inner_txn_params%1%%ClearStateProgram_length#0 +debug: Removing unused variable inner_txn_params%1%%RekeyTo_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAsset_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetTotal_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetDecimals_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetDefaultFrozen_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetUnitName_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetName_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetURL_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetMetadataHash_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetManager_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetReserve_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetFreeze_length#0 +debug: Removing unused variable inner_txn_params%1%%ConfigAssetClawback_length#0 +debug: Removing unused variable inner_txn_params%1%%FreezeAsset_length#0 +debug: Removing unused variable inner_txn_params%1%%FreezeAssetAccount_length#0 +debug: Removing unused variable inner_txn_params%1%%FreezeAssetFrozen_length#0 +debug: Removing unused variable inner_txn_params%1%%GlobalNumUint_length#0 +debug: Removing unused variable inner_txn_params%1%%GlobalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%1%%LocalNumUint_length#0 +debug: Removing unused variable inner_txn_params%1%%LocalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%1%%ExtraProgramPages_length#0 +debug: Removing unused variable inner_txn_params%1%%Nonparticipation_length#0 +debug: Removing unused variable inner_txn_params%1%%StateProofPK_length#0 +debug: Removing unused variable inner_txn_params%1%%Accounts_length#0 +debug: Removing unused variable inner_txn_params%1%%Assets_length#0 +debug: Removing unused variable inner_txn_params%1%%Applications_length#0 +debug: Removing unused variable inner_txn_params%1%%ApprovalProgramPages_length#0 +debug: Removing unused variable inner_txn_params%1%%ClearStateProgramPages_length#0 +debug: Removing unused variable _txn#0 +debug: Removing unused variable _txn._is_last#0 +debug: Removing unused variable _txn.Sender#0 +debug: Removing unused variable _txn.Fee#0 +debug: Removing unused variable _txn.FirstValid#0 +debug: Removing unused variable _txn.FirstValidTime#0 +debug: Removing unused variable _txn.LastValid#0 +debug: Removing unused variable _txn.Note#0 +debug: Removing unused variable _txn.Lease#0 +debug: Removing unused variable _txn.Receiver#0 +debug: Removing unused variable _txn.Amount#0 +debug: Removing unused variable _txn.CloseRemainderTo#0 +debug: Removing unused variable _txn.VotePK#0 +debug: Removing unused variable _txn.SelectionPK#0 +debug: Removing unused variable _txn.VoteFirst#0 +debug: Removing unused variable _txn.VoteLast#0 +debug: Removing unused variable _txn.VoteKeyDilution#0 +debug: Removing unused variable _txn.Type#0 +debug: Removing unused variable _txn.TypeEnum#0 +debug: Removing unused variable _txn.XferAsset#0 +debug: Removing unused variable _txn.AssetAmount#0 +debug: Removing unused variable _txn.AssetSender#0 +debug: Removing unused variable _txn.AssetReceiver#0 +debug: Removing unused variable _txn.AssetCloseTo#0 +debug: Removing unused variable _txn.GroupIndex#0 +debug: Removing unused variable _txn.TxID#0 +debug: Removing unused variable _txn.ApplicationID#0 +debug: Removing unused variable _txn.OnCompletion#0 +debug: Removing unused variable _txn.NumAppArgs#0 +debug: Removing unused variable _txn.NumAccounts#0 +debug: Removing unused variable _txn.ApprovalProgram#0 +debug: Removing unused variable _txn.ClearStateProgram#0 +debug: Removing unused variable _txn.RekeyTo#0 +debug: Removing unused variable _txn.ConfigAsset#0 +debug: Removing unused variable _txn.ConfigAssetTotal#0 +debug: Removing unused variable _txn.ConfigAssetDecimals#0 +debug: Removing unused variable _txn.ConfigAssetDefaultFrozen#0 +debug: Removing unused variable _txn.ConfigAssetUnitName#0 +debug: Removing unused variable _txn.ConfigAssetName#0 +debug: Removing unused variable _txn.ConfigAssetURL#0 +debug: Removing unused variable _txn.ConfigAssetMetadataHash#0 +debug: Removing unused variable _txn.ConfigAssetManager#0 +debug: Removing unused variable _txn.ConfigAssetReserve#0 +debug: Removing unused variable _txn.ConfigAssetFreeze#0 +debug: Removing unused variable _txn.ConfigAssetClawback#0 +debug: Removing unused variable _txn.FreezeAsset#0 +debug: Removing unused variable _txn.FreezeAssetAccount#0 +debug: Removing unused variable _txn.FreezeAssetFrozen#0 +debug: Removing unused variable _txn.NumAssets#0 +debug: Removing unused variable _txn.NumApplications#0 +debug: Removing unused variable _txn.GlobalNumUint#0 +debug: Removing unused variable _txn.GlobalNumByteSlice#0 +debug: Removing unused variable _txn.LocalNumUint#0 +debug: Removing unused variable _txn.LocalNumByteSlice#0 +debug: Removing unused variable _txn.ExtraProgramPages#0 +debug: Removing unused variable _txn.Nonparticipation#0 +debug: Removing unused variable _txn.NumLogs#0 +debug: Removing unused variable _txn.CreatedAssetID#0 +debug: Removing unused variable _txn.CreatedApplicationID#0 +debug: Removing unused variable _txn.LastLog#0 +debug: Removing unused variable _txn.StateProofPK#0 +debug: Removing unused variable _txn.NumApprovalProgramPages#0 +debug: Removing unused variable _txn.NumClearStateProgramPages#0 +debug: Removing unused variable inner_txn_params%2#0 +debug: Removing unused variable inner_txn_params%2%%param_Fee_idx_0#0 +debug: Removing unused variable inner_txn_params%2%%Fee_length#0 +debug: Removing unused variable inner_txn_params%2%%param_TypeEnum_idx_0#0 +debug: Removing unused variable inner_txn_params%2%%TypeEnum_length#0 +debug: Removing unused variable inner_txn_params%2%%param_ApplicationArgs_idx_0#0 +debug: Removing unused variable inner_txn_params%2%%ApplicationArgs_length#0 +debug: Removing unused variable inner_txn_params%2%%ApplicationID_length#0 +debug: Removing unused variable inner_txn_params%2%%param_OnCompletion_idx_0#0 +debug: Removing unused variable inner_txn_params%2%%OnCompletion_length#0 +debug: Removing unused variable inner_txn_params%2%%Sender_length#0 +debug: Removing unused variable inner_txn_params%2%%Note_length#0 +debug: Removing unused variable inner_txn_params%2%%Receiver_length#0 +debug: Removing unused variable inner_txn_params%2%%Amount_length#0 +debug: Removing unused variable inner_txn_params%2%%CloseRemainderTo_length#0 +debug: Removing unused variable inner_txn_params%2%%VotePK_length#0 +debug: Removing unused variable inner_txn_params%2%%SelectionPK_length#0 +debug: Removing unused variable inner_txn_params%2%%VoteFirst_length#0 +debug: Removing unused variable inner_txn_params%2%%VoteLast_length#0 +debug: Removing unused variable inner_txn_params%2%%VoteKeyDilution_length#0 +debug: Removing unused variable inner_txn_params%2%%Type_length#0 +debug: Removing unused variable inner_txn_params%2%%XferAsset_length#0 +debug: Removing unused variable inner_txn_params%2%%AssetAmount_length#0 +debug: Removing unused variable inner_txn_params%2%%AssetSender_length#0 +debug: Removing unused variable inner_txn_params%2%%AssetReceiver_length#0 +debug: Removing unused variable inner_txn_params%2%%AssetCloseTo_length#0 +debug: Removing unused variable inner_txn_params%2%%ApprovalProgram_length#0 +debug: Removing unused variable inner_txn_params%2%%ClearStateProgram_length#0 +debug: Removing unused variable inner_txn_params%2%%RekeyTo_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAsset_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetTotal_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetDecimals_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetDefaultFrozen_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetUnitName_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetName_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetURL_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetMetadataHash_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetManager_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetReserve_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetFreeze_length#0 +debug: Removing unused variable inner_txn_params%2%%ConfigAssetClawback_length#0 +debug: Removing unused variable inner_txn_params%2%%FreezeAsset_length#0 +debug: Removing unused variable inner_txn_params%2%%FreezeAssetAccount_length#0 +debug: Removing unused variable inner_txn_params%2%%FreezeAssetFrozen_length#0 +debug: Removing unused variable inner_txn_params%2%%GlobalNumUint_length#0 +debug: Removing unused variable inner_txn_params%2%%GlobalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%2%%LocalNumUint_length#0 +debug: Removing unused variable inner_txn_params%2%%LocalNumByteSlice_length#0 +debug: Removing unused variable inner_txn_params%2%%ExtraProgramPages_length#0 +debug: Removing unused variable inner_txn_params%2%%Nonparticipation_length#0 +debug: Removing unused variable inner_txn_params%2%%StateProofPK_length#0 +debug: Removing unused variable inner_txn_params%2%%Accounts_length#0 +debug: Removing unused variable inner_txn_params%2%%Assets_length#0 +debug: Removing unused variable inner_txn_params%2%%Applications_length#0 +debug: Removing unused variable inner_txn_params%2%%ApprovalProgramPages_length#0 +debug: Removing unused variable inner_txn_params%2%%ClearStateProgramPages_length#0 +debug: Optimizer: Inner Txn Field Replacer +debug: Optimizer: Replace Compiled References +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Replaced predecessor block@1: // next_txn_L299 with block@0: // L296 in block@2: // next_txn_L311 +debug: Merged linear block@1: // next_txn_L299 into block@0: // L296 +debug: Replaced predecessor block@2: // next_txn_L311 with block@0: // L296 in block@3: // next_txn_L316 +debug: Merged linear block@2: // next_txn_L311 into block@0: // L296 +debug: Merged linear block@3: // next_txn_L316 into block@0: // L296 +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.compile.factory.HelloFactory.__algopy_default_create debug: Splitting parallel copies prior to optimization debug: Optimizer: Constant Replacer @@ -5738,6 +6024,34 @@ 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.compile.factory.HelloFactory.test_abi_call_create_params +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified ((extract 6 2) as_bytes%0#0) to 0x0003 +debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x0005 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable compiled.0#0 +debug: Removing unused variable compiled.1#0 +debug: Removing unused variable compiled.2#0 +debug: Removing unused variable compiled.3#0 +debug: Removing unused variable compiled.4#0 +debug: Removing unused variable compiled.5#0 +debug: Removing unused variable compiled.6#0 +debug: Removing unused variable compiled.7#0 +debug: Removing unused variable compiled.8#0 +debug: Removing unused variable length%0#0 +debug: Removing unused variable as_bytes%0#0 +debug: Removing unused variable length%1#0 +debug: Removing unused variable as_bytes%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 algopy.arc4.ARC4Contract.clear_state_program debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation @@ -5950,6 +6264,23 @@ 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.compile.factory.HelloFactory.test_abi_call_create_params +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Simplified (concat 0x0003 "hey") to 0x0003686579 +debug: Simplified (concat 0x0005 "there") to 0x00057468657265 +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable length_uint16%0#0 +debug: Removing unused variable length_uint16%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 algopy.arc4.ARC4Contract.clear_state_program debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation @@ -6148,6 +6479,21 @@ 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.compile.factory.HelloFactory.test_abi_call_create_params +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_value%0#0 +debug: Removing unused variable encoded_value%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 algopy.arc4.ARC4Contract.clear_state_program debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation @@ -6332,6 +6678,19 @@ 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.compile.factory.HelloFactory.test_abi_call_create_params +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 @@ -6359,6 +6718,7 @@ debug: Removing Phis from test_cases.compile.factory.HelloFactory.test_arc4_crea debug: Removing Phis from test_cases.compile.factory.HelloFactory.test_arc4_create_large debug: Removing Phis from test_cases.compile.factory.HelloFactory.test_arc4_update debug: Removing Phis from test_cases.compile.factory.HelloFactory.test_other_constants +debug: Removing Phis from test_cases.compile.factory.HelloFactory.test_abi_call_create_params debug: Removing Phis from algopy.arc4.ARC4Contract.clear_state_program debug: Coalescing local variables in algopy.arc4.ARC4Contract.approval_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -6387,6 +6747,8 @@ debug: Coalescing result#0 with [result#1] debug: Coalescing resulted in 2 replacement/s debug: Coalescing local variables in test_cases.compile.factory.HelloFactory.test_other_constants using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.compile.factory.HelloFactory.test_abi_call_create_params 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 algopy.arc4.ARC4Contract.approval_program @@ -6402,6 +6764,7 @@ debug: Sequentializing parallel copies in test_cases.compile.factory.HelloFactor debug: Sequentializing parallel copies in test_cases.compile.factory.HelloFactory.test_arc4_create_large debug: Sequentializing parallel copies in test_cases.compile.factory.HelloFactory.test_arc4_update debug: Sequentializing parallel copies in test_cases.compile.factory.HelloFactory.test_other_constants +debug: Sequentializing parallel copies in test_cases.compile.factory.HelloFactory.test_abi_call_create_params debug: Sequentializing parallel copies in algopy.arc4.ARC4Contract.clear_state_program debug: Performing post-SSA optimizations debug: Output IR to compile/out/HelloFactory.destructured.ir @@ -6410,7 +6773,7 @@ debug: Replaced main_block@0.ops[3]: 'load tmp%0#0' with 'load tmp%0#0 from l-st debug: Inserted __puya_arc4_router___block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced __puya_arc4_router___block@0.ops[3]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted __puya_arc4_router___abi_routing@1.ops[1]: 'store tmp%2#0 to l-stack (copy)' -debug: Replaced __puya_arc4_router___abi_routing@1.ops[14]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Replaced __puya_arc4_router___abi_routing@1.ops[15]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted __puya_arc4_router___test_logicsig_route@2.ops[1]: 'store tmp%3#0 to l-stack (copy)' debug: Replaced __puya_arc4_router___test_logicsig_route@2.ops[3]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' debug: Inserted __puya_arc4_router___test_logicsig_route@2.ops[5]: 'store tmp%4#0 to l-stack (copy)' @@ -6481,12 +6844,18 @@ debug: Inserted __puya_arc4_router___test_other_constants_route@12.ops[5]: 'stor debug: Replaced __puya_arc4_router___test_other_constants_route@12.ops[7]: 'load tmp%46#0' with 'load tmp%46#0 from l-stack (no copy)' debug: Inserted __puya_arc4_router___test_other_constants_route@12.ops[10]: 'store tmp%47#0 to l-stack (copy)' debug: Replaced __puya_arc4_router___test_other_constants_route@12.ops[12]: 'load tmp%47#0' with 'load tmp%47#0 from l-stack (no copy)' -debug: Inserted __puya_arc4_router___bare_routing@15.ops[1]: 'store tmp%49#0 to l-stack (copy)' -debug: Replaced __puya_arc4_router___bare_routing@15.ops[3]: 'load tmp%49#0' with 'load tmp%49#0 from l-stack (no copy)' -debug: Inserted __puya_arc4_router_____algopy_default_create@16.ops[1]: 'store tmp%50#0 to l-stack (copy)' -debug: Replaced __puya_arc4_router_____algopy_default_create@16.ops[3]: 'load tmp%50#0' with 'load tmp%50#0 from l-stack (no copy)' -debug: Inserted __puya_arc4_router_____algopy_default_create@16.ops[5]: 'store tmp%51#0 to l-stack (copy)' -debug: Replaced __puya_arc4_router_____algopy_default_create@16.ops[7]: 'load tmp%51#0' with 'load tmp%51#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router___test_abi_call_create_params_route@13.ops[1]: 'store tmp%49#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router___test_abi_call_create_params_route@13.ops[3]: 'load tmp%49#0' with 'load tmp%49#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router___test_abi_call_create_params_route@13.ops[5]: 'store tmp%50#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router___test_abi_call_create_params_route@13.ops[7]: 'load tmp%50#0' with 'load tmp%50#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router___test_abi_call_create_params_route@13.ops[10]: 'store tmp%51#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router___test_abi_call_create_params_route@13.ops[12]: 'load tmp%51#0' with 'load tmp%51#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router___bare_routing@16.ops[1]: 'store tmp%53#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router___bare_routing@16.ops[3]: 'load tmp%53#0' with 'load tmp%53#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router_____algopy_default_create@17.ops[1]: 'store tmp%54#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router_____algopy_default_create@17.ops[3]: 'load tmp%54#0' with 'load tmp%54#0 from l-stack (no copy)' +debug: Inserted __puya_arc4_router_____algopy_default_create@17.ops[5]: 'store tmp%55#0 to l-stack (copy)' +debug: Replaced __puya_arc4_router_____algopy_default_create@17.ops[7]: 'load tmp%55#0' with 'load tmp%55#0 from l-stack (no copy)' debug: Found 3 edge set/s for test_cases.compile.factory.HelloFactory.__puya_arc4_router__ debug: Inserted test_compile_contract_block@0.ops[31]: 'store txn.LastLog#0 to l-stack (copy)' debug: Replaced test_compile_contract_block@0.ops[33]: 'load txn.LastLog#0' with 'load txn.LastLog#0 from l-stack (no copy)' @@ -6680,6 +7049,24 @@ debug: Inserted test_other_constants_block@0.ops[35]: 'store tmp%0#0 to l-stack debug: Replaced test_other_constants_block@0.ops[48]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted test_other_constants_block@0.ops[19]: 'store app#0 to l-stack (copy)' debug: Replaced test_other_constants_block@0.ops[68]: 'load app#0' with 'load app#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[31]: 'store awst_tmp%0#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[33]: 'load awst_tmp%0#0' with 'load awst_tmp%0#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[38]: 'store tmp%1#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[40]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[43]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[45]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[49]: 'store result#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[51]: 'load result#0' with 'load result#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[54]: 'store tmp%3#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[56]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[17]: 'store app#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[20]: 'load app#0' with 'load app#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[35]: 'store awst_tmp%0#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[38]: 'load awst_tmp%0#0' with 'load awst_tmp%0#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[37]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[50]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted test_abi_call_create_params_block@0.ops[21]: 'store app#0 to l-stack (copy)' +debug: Replaced test_abi_call_create_params_block@0.ops[65]: 'load app#0' with 'load app#0 from l-stack (no copy)' info: Writing compile/out/always_approve_sig.teal info: Writing compile/out/always_approve_sig.bin info: Writing compile/out/HelloBase.arc32.json diff --git a/tests/test_arc32.py b/tests/test_arc32.py index f34232ff36..99e22713f4 100644 --- a/tests/test_arc32.py +++ b/tests/test_arc32.py @@ -1479,6 +1479,7 @@ def test_compile(algod_client: AlgodClient, account: algokit_utils.Account) -> N app_client.call("test_arc4_create_large", transaction_parameters=txn_params) app_client.call("test_arc4_update", transaction_parameters=txn_params) app_client.call("test_other_constants", transaction_parameters=txn_params) + app_client.call("test_abi_call_create_params", transaction_parameters=txn_params) def test_nested_tuples(