From 3eb4f0410c53786fdf20153ffeb1e86f9c5487e7 Mon Sep 17 00:00:00 2001 From: Bobby Lat Date: Mon, 15 Sep 2025 12:59:20 +0700 Subject: [PATCH] refactor: update params to constructor of ReferenceArray and ImmutableArray to be Iterable for consistency --- pyproject.toml | 8 +- src/_algopy_testing/primitives/array.py | 19 +- src/_algopy_testing/serialize.py | 2 - .../DynamicArrayInitContract.approval.teal | 272 +++ .../data/DynamicArrayInitContract.arc56.json | 144 ++ .../data/DynamicArrayInitContract.clear.teal | 7 + .../data/ImmutableArrayContract.approval.teal | 99 +- .../data/ImmutableArrayContract.arc56.json | 134 +- .../ImmutableArrayInitContract.approval.teal | 272 +++ .../ImmutableArrayInitContract.arc56.json | 144 ++ .../ImmutableArrayInitContract.clear.teal | 7 + .../data/StaticSizeContract.approval.teal | 218 +- .../Arrays/data/StaticSizeContract.arc56.json | 2 +- tests/artifacts/Arrays/immutable.py | 106 +- tests/artifacts/Arrays/static_size.py | 8 +- .../data/BoxContract.approval.teal | 1751 ++++++++++++++++- .../BoxContract/data/BoxContract.arc56.json | 661 ++++++- .../data/StateMutations.approval.teal | 50 +- .../data/StateMutations.arc56.json | 74 +- .../data/GlobalStateContract.approval.teal | 6 +- .../data/GlobalStateContract.arc56.json | 2 +- .../data/LocalStateContract.approval.teal | 6 +- .../data/LocalStateContract.arc56.json | 2 +- .../data/StateAppGlobalContract.approval.teal | 6 +- .../data/StateAppGlobalContract.arc56.json | 2 +- .../StateAppGlobalExContract.approval.teal | 2 +- .../data/StateAppGlobalExContract.arc56.json | 2 +- .../data/StateAppLocalContract.approval.teal | 6 +- .../data/StateAppLocalContract.arc56.json | 2 +- .../StateAppLocalExContract.approval.teal | 2 +- .../data/StateAppLocalExContract.arc56.json | 2 +- tests/models/test_box.py | 2 +- tests/test_array.py | 37 +- 33 files changed, 3681 insertions(+), 376 deletions(-) create mode 100644 tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal create mode 100644 tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json create mode 100644 tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal create mode 100644 tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal create mode 100644 tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json create mode 100644 tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal diff --git a/pyproject.toml b/pyproject.toml index dfb0254..708caa5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ "coincurve>=19.0.1", # TODO: uncomment below and remove direct git reference once puya 5.0 is released # "algorand-python>=3", - "algorand-python@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.10#subdirectory=stubs", + "algorand-python@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.11#subdirectory=stubs", ] [project.urls] @@ -54,7 +54,7 @@ python = "3.12" dependencies = [ # TODO: uncomment below and remove direct git reference once puya 5.0 is released # "puyapy>=5", - "puyapy@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.10", + "puyapy@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.11", "pytest>=7.4", "pytest-mock>=3.10.0", "pytest-xdist[psutil]>=3.3", @@ -138,7 +138,7 @@ dependencies = [ "algokit-utils>=3.0.0", # TODO: uncomment below and remove direct git reference once puya 5.0 is released # "puyapy>=5", - "puyapy@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.10", + "puyapy@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.11", ] [tool.hatch.envs.test.scripts] @@ -191,7 +191,7 @@ post-install-commands = [ dependencies = [ # TODO: uncomment below and remove direct git reference once puya 5.0 is released # "algorand-python>=3", - "algorand-python@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.10#subdirectory=stubs", + "algorand-python@git+https://github.com/algorandfoundation/puya.git@v5.0.0-rc.11#subdirectory=stubs", "pytest>=7.4", "pytest-mock>=3.10.0", "pytest-xdist[psutil]>=3.3", diff --git a/src/_algopy_testing/primitives/array.py b/src/_algopy_testing/primitives/array.py index 875842d..404e9bc 100644 --- a/src/_algopy_testing/primitives/array.py +++ b/src/_algopy_testing/primitives/array.py @@ -281,13 +281,15 @@ class ImmutableArray(Serializable, typing.Generic[_TArrayItem], metaclass=_Immut _element_type: typing.ClassVar[type] # ensure type is fully parameterized by looking up type from metaclass - def __new__(cls, *items: _TArrayItem) -> typing.Self: + + def __new__(cls, values: Iterable[_TArrayItem] = ()) -> typing.Self: from _algopy_testing.serialize import type_of try: assert cls._element_type except AttributeError: try: + items = list(values) item = items[0] except IndexError: raise TypeError("array must have an item type") from None @@ -295,8 +297,9 @@ def __new__(cls, *items: _TArrayItem) -> typing.Self: instance = super().__new__(cls) return instance - def __init__(self, *items: _TArrayItem): + def __init__(self, values: Iterable[_TArrayItem] = ()): super().__init__() + items = list(values) for item in items: if not isinstance(item, typing.get_origin(self._element_type) or self._element_type): raise TypeError(f"expected items of type {self._element_type}") @@ -347,7 +350,7 @@ def _from_iter(self, items: Iterable[_TArrayItem]) -> "ImmutableArray[_TArrayIte preserved.""" el_type = self._element_type typ = ImmutableArray[el_type] # type: ignore[valid-type] - return typ(*items) + return typ(items) def __bool__(self) -> bool: return bool(self._items) @@ -361,8 +364,8 @@ def from_bytes(cls, value: bytes, /) -> typing.Self: class ReferenceArray(Reversible[_TArrayItem]): - def __init__(self, *items: _TArrayItem): - self._items = list(items) + def __init__(self, values: Iterable[_TArrayItem] = ()): + self._items = list(values) def __iter__(self) -> Iterator[_TArrayItem]: return iter(list(self._items)) @@ -391,10 +394,10 @@ def pop(self) -> _TArrayItem: return self._items.pop() def copy(self) -> "ReferenceArray[_TArrayItem]": - return ReferenceArray(*self._items) + return ReferenceArray(self._items) def freeze(self) -> ImmutableArray[_TArrayItem]: - return ImmutableArray(*self._items) + return ImmutableArray(self._items) def __bool__(self) -> bool: return bool(self._items) @@ -488,7 +491,7 @@ def copy(self) -> typing.Self: return self.__class__.from_bytes(self.serialize()) def freeze(self) -> ImmutableArray[_TArrayItem]: - return ImmutableArray(*self._items) + return ImmutableArray(self._items) def _from_iter(self, items: Iterable[_TArrayItem]) -> "Array[_TArrayItem]": """Returns a new array populated with items, also ensures element type info is diff --git a/src/_algopy_testing/serialize.py b/src/_algopy_testing/serialize.py index b4d07ae..14b819a 100644 --- a/src/_algopy_testing/serialize.py +++ b/src/_algopy_testing/serialize.py @@ -81,8 +81,6 @@ def get_native_to_arc4_serializer( # noqa: PLR0911 ), arc4_to_native=lambda arr: ( typ([element_serializer.arc4_to_native(e) for e in arr]) - if issubclass(typ, Array) - else typ(*[element_serializer.arc4_to_native(e) for e in arr]) ), ) if issubclass(typ, FixedArray | ImmutableFixedArray): diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal new file mode 100644 index 0000000..d3a96a0 --- /dev/null +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal @@ -0,0 +1,272 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.approval_program() -> uint64: +main: + intcblock 8 3 1 0 + bytecblock 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:479 + // class DynamicArrayInitContract(arc4.ARC4Contract): + txn NumAppArgs + bz main___algopy_default_create@11 + txn OnCompletion + ! + assert // OnCompletion must be NoOp + txn ApplicationID + assert + pushbytess 0x8434ba2a 0x63aabba0 0xdbaf034e 0xa9d14554 // method "test_immutable_array_init()void", method "test_immutable_array_init_without_type_generic()void", method "test_reference_array_init()void", method "test_reference_array_init_without_type_generic()void" + txna ApplicationArgs 0 + match test_immutable_array_init test_immutable_array_init_without_type_generic test_reference_array_init test_reference_array_init_without_type_generic + err + +main___algopy_default_create@11: + txn OnCompletion + ! + txn ApplicationID + ! + && + return // on error: OnCompletion must be NoOp && can only call when creating + + +// tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_immutable_array_init[routing]() -> void: +test_immutable_array_init: + // tests/artifacts/Arrays/immutable.py:490 + // a3 = ImmutableArray[UInt64](ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:480 + // @arc4.abimethod() + intc_2 // 1 + return + + +// tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_immutable_array_init_without_type_generic[routing]() -> void: +test_immutable_array_init_without_type_generic: + // tests/artifacts/Arrays/immutable.py:512 + // a3 = ImmutableArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:502 + // @arc4.abimethod() + intc_2 // 1 + return + + +// tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_reference_array_init[routing]() -> void: +test_reference_array_init: + // tests/artifacts/Arrays/immutable.py:526 + // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:528 + // a2 = ReferenceArray[UInt64](FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + dup + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:529 + // assert a1.length == a2.length + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:530 + // assert a1[0] == a2[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:531 + // assert a1[1] == a2[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:532 + // assert a1[2] == a2[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:534 + // a3 = ReferenceArray[UInt64](ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:536 + // assert a1[0] == a3[0] + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:537 + // assert a1[1] == a3[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:538 + // assert a1[2] == a3[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:526 + // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:541 + // assert a1.length == a4.length + dup + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:542 + // assert a1[0] == a4[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:543 + // assert a1[1] == a4[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:544 + // assert a1[2] == a4[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + // tests/artifacts/Arrays/immutable.py:524 + // @arc4.abimethod() + return + + +// tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_reference_array_init_without_type_generic[routing]() -> void: +test_reference_array_init_without_type_generic: + // tests/artifacts/Arrays/immutable.py:548 + // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:550 + // a2 = ReferenceArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + dup + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:551 + // assert a1.length == a2.length + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:552 + // assert a1[0] == a2[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:553 + // assert a1[1] == a2[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:554 + // assert a1[2] == a2[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:556 + // a3 = ReferenceArray(ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:558 + // assert a1[0] == a3[0] + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:559 + // assert a1[1] == a3[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:560 + // assert a1[2] == a3[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:548 + // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:563 + // assert a1.length == a4.length + dup + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:564 + // assert a1[0] == a4[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:565 + // assert a1[1] == a4[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:566 + // assert a1[2] == a4[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + // tests/artifacts/Arrays/immutable.py:546 + // @arc4.abimethod() + return diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json new file mode 100644 index 0000000..fbc554e --- /dev/null +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json @@ -0,0 +1,144 @@ +{ + "name": "DynamicArrayInitContract", + "structs": {}, + "methods": [ + { + "name": "test_immutable_array_init", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_immutable_array_init_without_type_generic", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_reference_array_init", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_reference_array_init_without_type_generic", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 42 + ], + "errorMessage": "OnCompletion must be NoOp" + }, + { + "pc": [ + 89 + ], + "errorMessage": "OnCompletion must be NoOp && can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4NDM0YmEyYSAweDYzYWFiYmEwIDB4ZGJhZjAzNGUgMHhhOWQxNDU1NCAvLyBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0IHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTE6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0OTAKICAgIC8vIGEzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XShSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjgKICAgIC8vIGEyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjkKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMwCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMxCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTMyCiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM0CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oSW1tdXRhYmxlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzYKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhM1swXQogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM3CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTNbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM4CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTI2CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhNC5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MgogICAgLy8gYXNzZXJ0IGExWzBdID09IGE0WzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0MwogICAgLy8gYXNzZXJ0IGExWzFdID09IGE0WzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NAogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDgKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUwCiAgICAvLyBhMiA9IFJlZmVyZW5jZUFycmF5KEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTIKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTMKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTQKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTYKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXkoSW1tdXRhYmxlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTgKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhM1swXQogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTNbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYwCiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjMKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhNFsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 5, + "minor": 0, + "patch": 0 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal b/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal new file mode 100644 index 0000000..a433105 --- /dev/null +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal index e5f4e47..e44e5dc 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal @@ -253,19 +253,18 @@ dynamic_array_concat_byte_length_head: * dup intc_0 // 0 - swap dynamic_array_concat_byte_length_head_for_header@2: - frame_dig 3 + frame_dig 4 frame_dig 2 < bz dynamic_array_concat_byte_length_head_after_for@4 - frame_dig 4 + frame_dig 3 dup itob extract 6 2 frame_dig 1 - frame_dig 3 + frame_dig 4 dup cover 4 uncover 2 @@ -277,10 +276,10 @@ dynamic_array_concat_byte_length_head_for_header@2: intc_2 // 2 + + - frame_bury 4 + frame_bury 3 intc_2 // 2 + - frame_bury 3 + frame_bury 4 b dynamic_array_concat_byte_length_head_for_header@2 dynamic_array_concat_byte_length_head_after_for@4: @@ -383,23 +382,23 @@ dynamic_array_concat_dynamic_element_after_for@8: // tests.artifacts.Arrays.immutable.sum_imm_fixed(arr: bytes) -> uint64: sum_imm_fixed: - // tests/artifacts/Arrays/immutable.py:479-480 + // tests/artifacts/Arrays/immutable.py:569-570 // @subroutine // def sum_imm_fixed(arr: NativeStruct3) -> UInt64: proto 1 1 - // tests/artifacts/Arrays/immutable.py:481 + // tests/artifacts/Arrays/immutable.py:571 // total = UInt64(0) intc_0 // 0 dup sum_imm_fixed_for_header@1: - // tests/artifacts/Arrays/immutable.py:482 + // tests/artifacts/Arrays/immutable.py:572 // for item in arr: frame_dig 1 pushint 3 // 3 < bz sum_imm_fixed_after_for@4 - // tests/artifacts/Arrays/immutable.py:482-483 + // tests/artifacts/Arrays/immutable.py:572-573 // for item in arr: // total += item.foo frame_dig 1 @@ -410,19 +409,19 @@ sum_imm_fixed_for_header@1: swap pushint 16 // 16 extract3 // on error: index access is out of bounds - // tests/artifacts/Arrays/immutable.py:483 + // tests/artifacts/Arrays/immutable.py:573 // total += item.foo dup - // tests/artifacts/Arrays/immutable.py:482-483 + // tests/artifacts/Arrays/immutable.py:572-573 // for item in arr: // total += item.foo intc_0 // 0 - // tests/artifacts/Arrays/immutable.py:483 + // tests/artifacts/Arrays/immutable.py:573 // total += item.foo extract_uint64 frame_dig 0 + - // tests/artifacts/Arrays/immutable.py:484 + // tests/artifacts/Arrays/immutable.py:574 // total += item.bar swap intc_3 // 8 @@ -435,38 +434,38 @@ sum_imm_fixed_for_header@1: b sum_imm_fixed_for_header@1 sum_imm_fixed_after_for@4: - // tests/artifacts/Arrays/immutable.py:485 + // tests/artifacts/Arrays/immutable.py:575 // return total retsub // tests.artifacts.Arrays.immutable.times(n: uint64) -> bytes: times: - // tests/artifacts/Arrays/immutable.py:488-489 + // tests/artifacts/Arrays/immutable.py:578-579 // @subroutine // def times(n: UInt64) -> String: proto 1 1 - // tests/artifacts/Arrays/immutable.py:490 + // tests/artifacts/Arrays/immutable.py:580 // result = String() bytec_0 // "" - // tests/artifacts/Arrays/immutable.py:491 + // tests/artifacts/Arrays/immutable.py:581 // for _i in urange(n): intc_0 // 0 times_for_header@1: - // tests/artifacts/Arrays/immutable.py:491 + // tests/artifacts/Arrays/immutable.py:581 // for _i in urange(n): frame_dig 1 frame_dig -1 < bz times_after_for@4 - // tests/artifacts/Arrays/immutable.py:492 + // tests/artifacts/Arrays/immutable.py:582 // result += String(" ") frame_dig 0 pushbytes " " concat frame_bury 0 - // tests/artifacts/Arrays/immutable.py:491 + // tests/artifacts/Arrays/immutable.py:581 // for _i in urange(n): frame_dig 1 intc_1 // 1 @@ -475,29 +474,29 @@ times_for_header@1: b times_for_header@1 times_after_for@4: - // tests/artifacts/Arrays/immutable.py:493 + // tests/artifacts/Arrays/immutable.py:583 // return result retsub // tests.artifacts.Arrays.immutable.add_x(arr: bytes, x: uint64) -> bytes: add_x: - // tests/artifacts/Arrays/immutable.py:496-497 + // tests/artifacts/Arrays/immutable.py:586-587 // @subroutine // def add_x(arr: ImmutableArray[UInt64], x: UInt64) -> ImmutableArray[UInt64]: proto 2 1 - // tests/artifacts/Arrays/immutable.py:498 + // tests/artifacts/Arrays/immutable.py:588 // for i in urange(x): intc_0 // 0 add_x_for_header@1: - // tests/artifacts/Arrays/immutable.py:498 + // tests/artifacts/Arrays/immutable.py:588 // for i in urange(x): frame_dig 0 frame_dig -1 < bz add_x_after_for@4 - // tests/artifacts/Arrays/immutable.py:499 + // tests/artifacts/Arrays/immutable.py:589 // arr = arr.append(i) frame_dig 0 dup @@ -514,7 +513,7 @@ add_x_for_header@1: extract 6 2 replace2 0 frame_bury -2 - // tests/artifacts/Arrays/immutable.py:498 + // tests/artifacts/Arrays/immutable.py:588 // for i in urange(x): intc_1 // 1 + @@ -522,7 +521,7 @@ add_x_for_header@1: b add_x_for_header@1 add_x_after_for@4: - // tests/artifacts/Arrays/immutable.py:500 + // tests/artifacts/Arrays/immutable.py:590 // return arr frame_dig -2 swap @@ -603,29 +602,29 @@ test_uint64_array: pushint 42 // 42 == assert - // tests/artifacts/Arrays/immutable.py:505 + // tests/artifacts/Arrays/immutable.py:595 // for _i in urange(x): intc_0 // 0 test_uint64_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:505 + // tests/artifacts/Arrays/immutable.py:595 // for _i in urange(x): dup // tests/artifacts/Arrays/immutable.py:112 // arr = pop_x(arr, UInt64(3)) pushint 3 // 3 - // tests/artifacts/Arrays/immutable.py:505 + // tests/artifacts/Arrays/immutable.py:595 // for _i in urange(x): < bz test_uint64_array_after_for@4 - // tests/artifacts/Arrays/immutable.py:506 + // tests/artifacts/Arrays/immutable.py:596 // arr = arr.pop() dig 1 intc_3 // 8 callsub dynamic_array_pop_fixed_size bury 3 pop - // tests/artifacts/Arrays/immutable.py:505 + // tests/artifacts/Arrays/immutable.py:595 // for _i in urange(x): dup intc_1 // 1 @@ -796,22 +795,22 @@ test_biguint_array: bytec_0 // 0x b== assert - // tests/artifacts/Arrays/immutable.py:512 + // tests/artifacts/Arrays/immutable.py:602 // for i in urange(x): intc_0 // 0 test_biguint_array_for_header@2: - // tests/artifacts/Arrays/immutable.py:512 + // tests/artifacts/Arrays/immutable.py:602 // for i in urange(x): dup // tests/artifacts/Arrays/immutable.py:139 // arr = add_xb(arr, UInt64(5)) pushint 5 // 5 - // tests/artifacts/Arrays/immutable.py:512 + // tests/artifacts/Arrays/immutable.py:602 // for i in urange(x): < bz test_biguint_array_after_for@4 - // tests/artifacts/Arrays/immutable.py:513 + // tests/artifacts/Arrays/immutable.py:603 // arr = arr.append(BigUInt(i)) dupn 2 itob @@ -830,7 +829,7 @@ test_biguint_array_for_header@2: extract 6 2 replace2 0 bury 3 - // tests/artifacts/Arrays/immutable.py:512 + // tests/artifacts/Arrays/immutable.py:602 // for i in urange(x): intc_1 // 1 + @@ -2086,11 +2085,11 @@ test_nested_array_for_header@10: extract3 dup bury 12 - // tests/artifacts/Arrays/immutable.py:519 + // tests/artifacts/Arrays/immutable.py:609 // total = UInt64() intc_0 // 0 bury 5 - // tests/artifacts/Arrays/immutable.py:520 + // tests/artifacts/Arrays/immutable.py:610 // for i in arr: intc_0 // 0 extract_uint16 @@ -2099,7 +2098,7 @@ test_nested_array_for_header@10: bury 6 test_nested_array_for_header@15: - // tests/artifacts/Arrays/immutable.py:520 + // tests/artifacts/Arrays/immutable.py:610 // for i in arr: dig 5 dig 8 @@ -2113,7 +2112,7 @@ test_nested_array_for_header@15: intc_3 // 8 * extract_uint64 - // tests/artifacts/Arrays/immutable.py:521 + // tests/artifacts/Arrays/immutable.py:611 // total += i dig 5 + @@ -2705,7 +2704,7 @@ test_uint64_return: txna ApplicationArgs 1 btoi // tests/artifacts/Arrays/immutable.py:370 - // arr = ImmutableArray(UInt64(1), UInt64(2), UInt64(3)) + // arr = ImmutableArray((UInt64(1), UInt64(2), UInt64(3))) pushbytes 0x0003000000000000000100000000000000020000000000000003 // tests/artifacts/Arrays/immutable.py:371 // for i in urange(append): @@ -2760,7 +2759,7 @@ test_bool_return: txna ApplicationArgs 1 btoi // tests/artifacts/Arrays/immutable.py:377 - // arr = ImmutableArray(True, False, True, False, True) + // arr = ImmutableArray((True, False, True, False, True)) pushbytes 0x0005a8 // tests/artifacts/Arrays/immutable.py:378 // for i in urange(append): @@ -2814,7 +2813,7 @@ test_tuple_return: txna ApplicationArgs 1 btoi // tests/artifacts/Arrays/immutable.py:384 - // arr = ImmutableArray(MyTuple(UInt64(), True, False)) + // arr = ImmutableArray((MyTuple(UInt64(), True, False),)) pushbytes 0x0001000000000000000080 // tests/artifacts/Arrays/immutable.py:385 // for i in urange(append): @@ -2885,7 +2884,7 @@ test_dynamic_tuple_return: txna ApplicationArgs 1 btoi // tests/artifacts/Arrays/immutable.py:391 - // arr = ImmutableArray(MyDynamicSizedTuple(UInt64(), String("Hello"))) + // arr = ImmutableArray((MyDynamicSizedTuple(UInt64(), String("Hello")),)) pushbytes 0x000100020000000000000000000a000548656c6c6f // tests/artifacts/Arrays/immutable.py:392 // for i in urange(append): @@ -3027,7 +3026,7 @@ test_convert_to_array_and_back_after_for@5: // tests.artifacts.Arrays.immutable.ImmutableArrayContract.test_concat_with_arc4_tuple[routing]() -> void: test_concat_with_arc4_tuple: // tests/artifacts/Arrays/immutable.py:410 - // prefix = ImmutableArray(arc4.UInt64(1), arc4.UInt64(2)) + // prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) bytec 8 // 0x000200000000000000010000000000000002 // tests/artifacts/Arrays/immutable.py:406 // @arc4.abimethod() @@ -3066,7 +3065,7 @@ test_concat_with_native_tuple: // result = prefix + arg concat // tests/artifacts/Arrays/immutable.py:418 - // prefix = ImmutableArray(arc4.UInt64(1), arc4.UInt64(2)) + // prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) bytec 8 // 0x000200000000000000010000000000000002 // tests/artifacts/Arrays/immutable.py:419 // result = prefix + arg @@ -3093,7 +3092,7 @@ test_dynamic_concat_with_arc4_tuple: // result = prefix + arg extract 4 0 // tests/artifacts/Arrays/immutable.py:426 - // prefix = ImmutableArray(arc4.String("a"), arc4.String("b")) + // prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) bytec 9 // 0x000200040007000161000162 // tests/artifacts/Arrays/immutable.py:427 // result = prefix + arg @@ -3135,7 +3134,7 @@ test_dynamic_concat_with_native_tuple: // result = prefix + arg concat // tests/artifacts/Arrays/immutable.py:434 - // prefix = ImmutableArray(arc4.String("a"), arc4.String("b")) + // prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) bytec 9 // 0x000200040007000161000162 // tests/artifacts/Arrays/immutable.py:435 // result = prefix + arg diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json index f460573..c3a8613 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json @@ -607,161 +607,161 @@ }, { "pc": [ - 4105 + 4104 ], "errorMessage": "check self.imm_fixed_arr exists" }, { "pc": [ - 2180, - 2488 + 2179, + 2487 ], "errorMessage": "expected 1, 0" }, { "pc": [ - 2095, - 2403 + 2094, + 2402 ], "errorMessage": "expected 1st element to be correct" }, { "pc": [ - 2100, - 2410 + 2099, + 2409 ], "errorMessage": "expected 2nd element to be correct" }, { "pc": [ - 2241, - 2550 + 2240, + 2549 ], "errorMessage": "expected 4, 3" }, { "pc": [ - 3989 + 3988 ], "errorMessage": "expected arrays to be different" }, { "pc": [ - 4023 + 4022 ], "errorMessage": "expected arrays to be the same" }, { "pc": [ - 1549 + 1548 ], "errorMessage": "expected element 0 to be False" }, { "pc": [ - 1568 + 1567 ], "errorMessage": "expected element 1 to be False" }, { "pc": [ - 1586 + 1585 ], "errorMessage": "expected element 2 to be True" }, { "pc": [ - 4050 + 4049 ], "errorMessage": "expected items on iteration to be the same" }, { "pc": [ - 1612 + 1611 ], "errorMessage": "expected last element to be False" }, { "pc": [ - 3936 + 3935 ], "errorMessage": "expected non empty array" }, { "pc": [ - 3364 + 3363 ], "errorMessage": "expected string length to match index" }, { "pc": [ - 4100 + 4099 ], "errorMessage": "expected sum to be 10" }, { "pc": [ - 4073 + 4072 ], "errorMessage": "expected sum to be 15" }, { "pc": [ - 853, - 1157, - 1222, - 1290, - 1347, - 1457, - 1542, - 1561, - 1580, - 1603, - 1754, - 1818, - 2051, - 2132, - 2197, - 2359, - 2442, - 2505, - 3215, - 3308, - 3951, - 4008, - 4046, - 4092 + 852, + 1156, + 1221, + 1289, + 1346, + 1456, + 1541, + 1560, + 1579, + 1602, + 1753, + 1817, + 2050, + 2131, + 2196, + 2358, + 2441, + 2504, + 3214, + 3307, + 3950, + 4007, + 4045, + 4091 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 924, - 997, - 1121, - 1195, - 1245, - 1315, - 1427, - 1693, - 1882, - 2623, - 2770, - 2834, - 2920, - 2959, - 2990, - 3439, - 3572, - 3746, - 3780, - 3815 + 923, + 996, + 1120, + 1194, + 1244, + 1314, + 1426, + 1692, + 1881, + 2622, + 2769, + 2833, + 2919, + 2958, + 2989, + 3438, + 3571, + 3745, + 3779, + 3814 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 1308 + 1307 ], "errorMessage": "overflow" } @@ -774,11 +774,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NGQ0MmY5OSAweGI3ZWFhNjBiIDB4NzQzZDcwZWQgMHgxYzdlMDQ5NCAweGEyZDU4NjBiIDB4ZTA1ZmM1NjQgMHgxZTA5MmI4MyAweDAxMzEwMjYyIDB4Yzg2NTRhOTggMHg4OWQxOTZmOCAweDZjYjdjOTkxIDB4OTg5OGJmMDIgMHhmNmI2MWVlOCAweDYwYjg2YTdiIDB4NzNhZDI4M2YgMHg1MjlkZmFlOSAweDIwNmQ1MTRmIDB4ZTA2NDY1ZTIgMHhlYzAzMDBhMiAweGVjZGYxNGFmIDB4NTExYWNhNjQgMHgyOTg1MmU0ZiAweDZkNGFhMzU4IDB4YjdjYjk2YmQgLy8gbWV0aG9kICJ0ZXN0X3VpbnQ2NF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9iaWd1aW50X2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9hcnJheSh1aW50NjQsdWludDY0W11bXSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9iaXRfcGFja2VkX3R1cGxlcygpdm9pZCIsIG1ldGhvZCAic3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyh1aW50NjRbXSxib29sW10sKHVpbnQ2NCxib29sLGJvb2wpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInRlc3RfdWludDY0X3JldHVybih1aW50NjQpdWludDY0W10iLCBtZXRob2QgInRlc3RfYm9vbF9yZXR1cm4odWludDY0KWJvb2xbXSIsIG1ldGhvZCAidGVzdF90dXBsZV9yZXR1cm4odWludDY0KSh1aW50NjQsYm9vbCxib29sKVtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrKCh1aW50NjQsYm9vbCxib29sKVtdLHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgoc3RyaW5nLHN0cmluZykpc3RyaW5nW10iLCBtZXRob2QgInRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYygodWludDY0LHN0cmluZylbXSwodWludDY0LHN0cmluZylbXSkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJjNCgodWludDY0LHVpbnQ2NClbXSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9pbW1fZml4ZWRfYXJyKCkodWludDY0LHVpbnQ2NClbM10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X3VpbnQ2NF9hcnJheSB0ZXN0X2JpZ3VpbnRfYXJyYXkgdGVzdF9ib29sX2FycmF5IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nIHRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0IHRlc3RfbmVzdGVkX2FycmF5IHRlc3RfYml0X3BhY2tlZF90dXBsZXMgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyB0ZXN0X3VpbnQ2NF9yZXR1cm4gdGVzdF9ib29sX3JldHVybiB0ZXN0X3R1cGxlX3JldHVybiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuIHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjayB0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZSB0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYyB0ZXN0X2ltbXV0YWJsZV9hcmM0IHRlc3RfaW1tX2ZpeGVkX2FycgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMxOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLnN1bV9pbW1fZml4ZWQoYXJyOiBieXRlcykgLT4gdWludDY0OgpzdW1faW1tX2ZpeGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc5LTQ4MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzdW1faW1tX2ZpeGVkKGFycjogTmF0aXZlU3RydWN0MykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCgpzdW1faW1tX2ZpeGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ4MgogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODItNDgzCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODMKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ4Mi00ODMKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ4MwogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDg0CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODUKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODgtNDg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0OTAKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0OTEKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkxCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ5MgogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ5MQogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0OTMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDk2LTQ5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDk4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDk4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDk5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDk4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MDAKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1IC8vIDUKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQzKSkKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MyAvLyA0MwogICAgPT0KICAgIGFzc2VydAogICAgaW50Y18yIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwNQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MDUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMgogICAgLy8gYXJyID0gcG9wX3goYXJyLCBVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTA1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwNgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwNQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjIKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQ0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNAogICAgLy8gYXJyID0gYXJyLnJlcGxhY2UoMiwgVUludDY0KDIzKSkKICAgIHB1c2hpbnQgMjMgLy8gMjMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI1CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNgogICAgLy8gYXNzZXJ0IGFyclsyXSA9PSAyMwogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyMyAvLyAyMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI4CiAgICAvLyBzZWxmLmEgPSBhcnIKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYmlndWludF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYmlndWludF9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgcHVzaGludCA2NCAvLyA2NAogICAgYnplcm8KICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzMgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbQmlnVUludF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUxMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MTIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUgLy8gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICA8CiAgICBieiB0ZXN0X2JpZ3VpbnRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUxMwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KGkpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgYnwKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MTIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaWd1aW50X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQzCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkgLSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3dhcAogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkaWcgNQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ2CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludCgyKio1MTIgLSAxKSkKICAgIHN3YXAKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0OQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NCAvLyA2NAogICAgKgogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjUKICAgIC8vIGlmIGxlbmd0aCA+IDA6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjYKICAgIC8vIGFzc2VydCBub3QgYXJyWzBdLCAiZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gaWYgbGVuZ3RoID4gMToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBhc3NlcnQgbm90IGFyclsxXSwgImV4cGVjdGVkIGVsZW1lbnQgMSB0byBiZSBGYWxzZSIKICAgIGludGNfMSAvLyAxCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNyAvLyAxNwogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY5CiAgICAvLyBpZiBsZW5ndGggPiAyOgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcwCiAgICAvLyBhc3NlcnQgYXJyWzJdLCAiZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUiCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMiB0byBiZSBUcnVlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MQogICAgLy8gaWYgbGVuZ3RoID4gMzoKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MgogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzQKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCAtIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoKGkgKyAxLCBpICsgMikpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg1KSwgVUludDY0KDYpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gc2VsZi5jID0gYXJyCiAgICBwdXNoYnl0ZXMgImMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk5CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeVR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA2CiAgICAvLyBmb28sIGJhciwgYmF6ID0gYXJyWzBdCiAgICBkdXAKICAgIGV4dHJhY3QgMiA5CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gYXNzZXJ0IGZvbyA9PSAwCiAgICB1bmNvdmVyIDIKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA4CiAgICAvLyBhc3NlcnQgYmFyCiAgICBzd2FwCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhegogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIHNlbGYuZCA9IGFycgogICAgcHVzaGJ5dGVzICJkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxNAogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBCeXRlc11dKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gYXJyID0gYXJyLmFwcGVuZCgoaSArIDEsIG9wLmJ6ZXJvKGkpKSkKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIzCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjUKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgcHVzaGludCAzIC8vIDMKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gc2VsZi5lID0gYXJyCiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMzCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeUR5bmFtaWNTaXplZFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MQogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQyCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdID09IHRpbWVzKGkpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0aW1lcwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ0CiAgICAvLyBhcnIgPSBhcnIucG9wKCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gTXlEeW5hbWljU2l6ZWRUdXBsZShVSW50NjQoMSksIFN0cmluZygpKSwgImV4cGVjdGVkIDEsIDAiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgc3dhcAogICAgZGlnIDMKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBieXRlY18wIC8vICIiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCAxLCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDcKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDQpLCBTdHJpbmcoIiAgICIpKSwgImV4cGVjdGVkIDQsIDMiCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciA0CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIHN3YXAKICAgIHB1c2hieXRlcyAiICAgIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBzZWxmLmYgPSBhcnIKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MgogICAgLy8gbG9nKGFycikKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBwdXNoYnl0ZXMgMHhmYTQwYzA1MzAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY0CiAgICAvLyBleHRyYV9hcnIgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NQogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBleHRyYV9hcnIgPSBleHRyYV9hcnIuYXBwZW5kKGopCiAgICBkaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0Cgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChleHRyYV9hcnIpCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyA0IC8vIDB4MDAwMgogICAgZGlnIDE0CiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2Mi0yNjMKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjktMjcwCiAgICAvLyAjIHN1bSBpbm5lciBhcnJheXMgYW5kIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHN1bXMKICAgIC8vIHRvdGFscyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MQogICAgLy8gZm9yIGlubmVyX2FyciBpbiBhcnI6CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBidXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzEKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDYKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUxOQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTIwCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyMAogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTIxCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MgogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OAogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OS0yODEKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9iaXRfcGFja2VkX3R1cGxlc19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg4CiAgICAvLyBhcnIyID0gYXJyMi5hcHBlbmQoVHdvQm9vbFR1cGxlKGE9aSA9PSAwLCBiPWkgPT0gMSkpCiAgICBkdXBuIDIKICAgICEKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk1CiAgICAvLyBjPWkgPT0gMiwKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5NgogICAgLy8gZD1pID09IDMsCiAgICBkaWcgMgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTcKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk4CiAgICAvLyBmPWkgPT0gNSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZz1pID09IDYsCiAgICBkaWcgNQogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTIKICAgIC8vIGJhcj1pICsgMSwKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg5LTMwMQogICAgLy8gYXJyNyA9IGFycjcuYXBwZW5kKAogICAgLy8gICAgIFNldmVuQm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA4CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCA0IC8vIDQKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBwdXNoaW50IDUgLy8gNQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxMwogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMDItMzE1CiAgICAvLyBhcnI4ID0gYXJyOC5hcHBlbmQoCiAgICAvLyAgICAgRWlnaHRCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMyOAogICAgLy8gaT1pID09IDgsCiAgICB1bmNvdmVyIDMKICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzE2LTMzMAogICAgLy8gYXJyOSA9IGFycjkuYXBwZW5kKAogICAgLy8gICAgIE5pbmVCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICAgICAgaT1pID09IDgsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfYml0X3BhY2tlZF90dXBsZXNfZm9yX2hlYWRlckAyCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMyCiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMzCiAgICAvLyBhc3NlcnQgYXJyNy5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJyOC5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM1CiAgICAvLyBhc3NlcnQgYXJyOS5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM2CiAgICAvLyBzZWxmLmJvb2wyID0gYXJyMgogICAgcHVzaGJ5dGVzICJib29sMiIKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNwogICAgLy8gc2VsZi5ib29sNyA9IGFycjcKICAgIHB1c2hieXRlcyAiYm9vbDciCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzgKICAgIC8vIHNlbGYuYm9vbDggPSBhcnI4CiAgICBwdXNoYnl0ZXMgImJvb2w4IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM5CiAgICAvLyBzZWxmLmJvb2w5ID0gYXJyOQogICAgcHVzaGJ5dGVzICJib29sOSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC5zdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlczoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQ5CiAgICAvLyBzdW0xID0gc3VtMiA9IHN1bTMgPSBzdW00ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MAogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUwCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gc3VtMSArPSBpCiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTQKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTYKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyAxMQogICAgZGlnIDE2CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAxOQogICAgZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAqCiAgICBwdXNoaW50IDkgLy8gOQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gc3VtMyArPSB0dXAuZm9vCiAgICBkaWcgNgogICAgdW5jb3ZlciAyCiAgICArCiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NwogICAgLy8gaWYgdHVwLmJhcjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU4CiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTkKICAgIC8vIGlmIHR1cC5iYXo6CiAgICBkaWcgMTAKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICBkaWcgMTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEyCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyA2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjMKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NAogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpCiAgICBwdXNoYnl0ZXMgMHgwMDAzMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdWludDY0X3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfcmV0dXJuW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9ib29sX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3NwogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAwNWE4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzgKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9yZXR1cm5fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpICUgMiA9PSAwKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGRpZyAzCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzgKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdHVwbGVfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg0CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheShNeVR1cGxlKFVJbnQ2NCgpLCBUcnVlLCBGYWxzZSkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODUKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15VHVwbGUoZm9vPWksIGJhcj1pICUgMiA9PSAwLCBiYXo9aSAlIDMgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICUKICAgICEKICAgIGRpZyAyCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODUKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkxCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheShNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwYTAwMDU0ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeUR5bmFtaWNTaXplZFR1cGxlKGksIHRpbWVzKGkpKSkKICAgIGR1cG4gMgogICAgY2FsbHN1YiB0aW1lcwogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgNiAvLyAweDAwMGEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2s6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDEKICAgIC8vIG11dGFibGUuZXh0ZW5kKGFycikKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIG11dGFibGUuYXBwZW5kKE15VHVwbGUoZm9vPWksIGJhcj1pICUgMiA9PSAwLCBiYXo9aSAlIDMgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA0CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOSAvLyA5CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTAKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOAogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKQogICAgYnl0ZWMgOCAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE5CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyNwogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBleHRyYWN0IDQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI2CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheShhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKQogICAgYnl0ZWMgOSAvLyAweDAwMDIwMDA0MDAwNzAwMDE2MTAwMDE2MgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI3CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzUKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzQKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KGFyYzQuU3RyaW5nKCJhIiksIGFyYzQuU3RyaW5nKCJiIikpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzUKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MgogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbXV0YWJsZV9hcmM0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW11dGFibGVfYXJjNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NgogICAgLy8gYXNzZXJ0IGltbSwgImV4cGVjdGVkIG5vbiBlbXB0eSBhcnJheSIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBub24gZW1wdHkgYXJyYXkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NwogICAgLy8gaW1tID0gaW1tLnJlcGxhY2UoaW1tLmxlbmd0aCAtIDEsIGltbVswXSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDE2CiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbV9maXhlZF9hcnJbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbV9maXhlZF9hcnI6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTIKICAgIC8vIGFycjEgPSB6ZXJvX2J5dGVzKE5hdGl2ZVN0cnVjdDMpCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBiemVybwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTMKICAgIC8vIHN0cnVjdDEyID0gTmF0aXZlU3RydWN0KFR4bi5udW1fYXBwX2FyZ3MgKyAxLCBUeG4ubnVtX2FwcF9hcmdzICsgMikKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBhcnIyID0gTmF0aXZlU3RydWN0Mygoc3RydWN0MTIsIHN0cnVjdDEyLCBzdHJ1Y3QxMikpCiAgICBkdXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTYKICAgIC8vIGFzc2VydCBhcnIxICE9IGFycjIsICJleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50IgogICAgIT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTkKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiB0ZXN0X2ltbV9maXhlZF9hcnJfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gYXJyMSA9IGFycjEucmVwbGFjZShpLCBzdHJ1Y3QxMikKICAgIGR1cG4gMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGRpZyA1CiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDIKCnRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MgogICAgLy8gYXNzZXJ0IGFycjEgPT0gYXJyMiwgImV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZSIKICAgIGRpZyAzCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjQKICAgIC8vIGZvciBzdHJ1Y3RfaXQgaW4gYXJyMToKICAgIGRpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjUKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY3CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzEKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzMKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc2CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NGQ0MmY5OSAweGI3ZWFhNjBiIDB4NzQzZDcwZWQgMHgxYzdlMDQ5NCAweGEyZDU4NjBiIDB4ZTA1ZmM1NjQgMHgxZTA5MmI4MyAweDAxMzEwMjYyIDB4Yzg2NTRhOTggMHg4OWQxOTZmOCAweDZjYjdjOTkxIDB4OTg5OGJmMDIgMHhmNmI2MWVlOCAweDYwYjg2YTdiIDB4NzNhZDI4M2YgMHg1MjlkZmFlOSAweDIwNmQ1MTRmIDB4ZTA2NDY1ZTIgMHhlYzAzMDBhMiAweGVjZGYxNGFmIDB4NTExYWNhNjQgMHgyOTg1MmU0ZiAweDZkNGFhMzU4IDB4YjdjYjk2YmQgLy8gbWV0aG9kICJ0ZXN0X3VpbnQ2NF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9iaWd1aW50X2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9hcnJheSh1aW50NjQsdWludDY0W11bXSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9iaXRfcGFja2VkX3R1cGxlcygpdm9pZCIsIG1ldGhvZCAic3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyh1aW50NjRbXSxib29sW10sKHVpbnQ2NCxib29sLGJvb2wpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInRlc3RfdWludDY0X3JldHVybih1aW50NjQpdWludDY0W10iLCBtZXRob2QgInRlc3RfYm9vbF9yZXR1cm4odWludDY0KWJvb2xbXSIsIG1ldGhvZCAidGVzdF90dXBsZV9yZXR1cm4odWludDY0KSh1aW50NjQsYm9vbCxib29sKVtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrKCh1aW50NjQsYm9vbCxib29sKVtdLHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgoc3RyaW5nLHN0cmluZykpc3RyaW5nW10iLCBtZXRob2QgInRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYygodWludDY0LHN0cmluZylbXSwodWludDY0LHN0cmluZylbXSkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJjNCgodWludDY0LHVpbnQ2NClbXSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9pbW1fZml4ZWRfYXJyKCkodWludDY0LHVpbnQ2NClbM10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X3VpbnQ2NF9hcnJheSB0ZXN0X2JpZ3VpbnRfYXJyYXkgdGVzdF9ib29sX2FycmF5IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nIHRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0IHRlc3RfbmVzdGVkX2FycmF5IHRlc3RfYml0X3BhY2tlZF90dXBsZXMgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyB0ZXN0X3VpbnQ2NF9yZXR1cm4gdGVzdF9ib29sX3JldHVybiB0ZXN0X3R1cGxlX3JldHVybiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuIHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjayB0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZSB0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYyB0ZXN0X2ltbXV0YWJsZV9hcmM0IHRlc3RfaW1tX2ZpeGVkX2FycgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMxOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLnN1bV9pbW1fZml4ZWQoYXJyOiBieXRlcykgLT4gdWludDY0OgpzdW1faW1tX2ZpeGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY5LTU3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzdW1faW1tX2ZpeGVkKGFycjogTmF0aXZlU3RydWN0MykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzEKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCgpzdW1faW1tX2ZpeGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzItNTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3Mi01NzMKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MwogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc0CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzUKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzgtNTc5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODAKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgxCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MQogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg2LTU4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTAKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1IC8vIDUKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQzKSkKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MyAvLyA0MwogICAgPT0KICAgIGFzc2VydAogICAgaW50Y18yIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMgogICAgLy8gYXJyID0gcG9wX3goYXJyLCBVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjIKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQ0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNAogICAgLy8gYXJyID0gYXJyLnJlcGxhY2UoMiwgVUludDY0KDIzKSkKICAgIHB1c2hpbnQgMjMgLy8gMjMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI1CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNgogICAgLy8gYXNzZXJ0IGFyclsyXSA9PSAyMwogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyMyAvLyAyMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI4CiAgICAvLyBzZWxmLmEgPSBhcnIKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYmlndWludF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYmlndWludF9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgcHVzaGludCA2NCAvLyA2NAogICAgYnplcm8KICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzMgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbQmlnVUludF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KFR4bi5udW1fYXBwX2FyZ3MgLSAxKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUgLy8gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICA8CiAgICBieiB0ZXN0X2JpZ3VpbnRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KGkpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgYnwKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDIKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaWd1aW50X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQzCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkgLSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3dhcAogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkaWcgNQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ2CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludCgyKio1MTIgLSAxKSkKICAgIHN3YXAKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0OQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NCAvLyA2NAogICAgKgogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjAKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjUKICAgIC8vIGlmIGxlbmd0aCA+IDA6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjYKICAgIC8vIGFzc2VydCBub3QgYXJyWzBdLCAiZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gaWYgbGVuZ3RoID4gMToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBhc3NlcnQgbm90IGFyclsxXSwgImV4cGVjdGVkIGVsZW1lbnQgMSB0byBiZSBGYWxzZSIKICAgIGludGNfMSAvLyAxCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNyAvLyAxNwogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY5CiAgICAvLyBpZiBsZW5ndGggPiAyOgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcwCiAgICAvLyBhc3NlcnQgYXJyWzJdLCAiZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUiCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMiB0byBiZSBUcnVlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MQogICAgLy8gaWYgbGVuZ3RoID4gMzoKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MgogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzQKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCAtIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoKGkgKyAxLCBpICsgMikpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg1KSwgVUludDY0KDYpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gc2VsZi5jID0gYXJyCiAgICBwdXNoYnl0ZXMgImMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk5CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeVR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA2CiAgICAvLyBmb28sIGJhciwgYmF6ID0gYXJyWzBdCiAgICBkdXAKICAgIGV4dHJhY3QgMiA5CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gYXNzZXJ0IGZvbyA9PSAwCiAgICB1bmNvdmVyIDIKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA4CiAgICAvLyBhc3NlcnQgYmFyCiAgICBzd2FwCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhegogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIHNlbGYuZCA9IGFycgogICAgcHVzaGJ5dGVzICJkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxNAogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBCeXRlc11dKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gYXJyID0gYXJyLmFwcGVuZCgoaSArIDEsIG9wLmJ6ZXJvKGkpKSkKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjIzCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjUKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgcHVzaGludCAzIC8vIDMKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gc2VsZi5lID0gYXJyCiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMzCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeUR5bmFtaWNTaXplZFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzNgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MQogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQyCiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdID09IHRpbWVzKGkpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0aW1lcwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ0CiAgICAvLyBhcnIgPSBhcnIucG9wKCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gTXlEeW5hbWljU2l6ZWRUdXBsZShVSW50NjQoMSksIFN0cmluZygpKSwgImV4cGVjdGVkIDEsIDAiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgc3dhcAogICAgZGlnIDMKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBieXRlY18wIC8vICIiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCAxLCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDcKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDQpLCBTdHJpbmcoIiAgICIpKSwgImV4cGVjdGVkIDQsIDMiCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciA0CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIHN3YXAKICAgIHB1c2hieXRlcyAiICAgIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBzZWxmLmYgPSBhcnIKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MgogICAgLy8gbG9nKGFycikKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBwdXNoYnl0ZXMgMHhmYTQwYzA1MzAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NgogICAgLy8gYXJjNC5lbWl0KCJlbWl0X3Rlc3QiLCBhcnIpCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYyLTI2MwogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY0CiAgICAvLyBleHRyYV9hcnIgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NQogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBleHRyYV9hcnIgPSBleHRyYV9hcnIuYXBwZW5kKGopCiAgICBkaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0Cgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChleHRyYV9hcnIpCiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyA0IC8vIDB4MDAwMgogICAgZGlnIDE0CiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2Mi0yNjMKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjktMjcwCiAgICAvLyAjIHN1bSBpbm5lciBhcnJheXMgYW5kIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHN1bXMKICAgIC8vIHRvdGFscyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MQogICAgLy8gZm9yIGlubmVyX2FyciBpbiBhcnI6CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBidXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzEKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDYKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwOQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEwCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMAogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MgogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OAogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OS0yODEKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9iaXRfcGFja2VkX3R1cGxlc19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg4CiAgICAvLyBhcnIyID0gYXJyMi5hcHBlbmQoVHdvQm9vbFR1cGxlKGE9aSA9PSAwLCBiPWkgPT0gMSkpCiAgICBkdXBuIDIKICAgICEKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk1CiAgICAvLyBjPWkgPT0gMiwKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5NgogICAgLy8gZD1pID09IDMsCiAgICBkaWcgMgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTcKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk4CiAgICAvLyBmPWkgPT0gNSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZz1pID09IDYsCiAgICBkaWcgNQogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTIKICAgIC8vIGJhcj1pICsgMSwKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg5LTMwMQogICAgLy8gYXJyNyA9IGFycjcuYXBwZW5kKAogICAgLy8gICAgIFNldmVuQm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA4CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCA0IC8vIDQKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBwdXNoaW50IDUgLy8gNQogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxMwogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMDItMzE1CiAgICAvLyBhcnI4ID0gYXJyOC5hcHBlbmQoCiAgICAvLyAgICAgRWlnaHRCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMyOAogICAgLy8gaT1pID09IDgsCiAgICB1bmNvdmVyIDMKICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzE2LTMzMAogICAgLy8gYXJyOSA9IGFycjkuYXBwZW5kKAogICAgLy8gICAgIE5pbmVCb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICAgICBoPWkgPT0gNywKICAgIC8vICAgICAgICAgaT1pID09IDgsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfYml0X3BhY2tlZF90dXBsZXNfZm9yX2hlYWRlckAyCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMyCiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzMzCiAgICAvLyBhc3NlcnQgYXJyNy5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM0CiAgICAvLyBhc3NlcnQgYXJyOC5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM1CiAgICAvLyBhc3NlcnQgYXJyOS5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM2CiAgICAvLyBzZWxmLmJvb2wyID0gYXJyMgogICAgcHVzaGJ5dGVzICJib29sMiIKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNwogICAgLy8gc2VsZi5ib29sNyA9IGFycjcKICAgIHB1c2hieXRlcyAiYm9vbDciCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzgKICAgIC8vIHNlbGYuYm9vbDggPSBhcnI4CiAgICBwdXNoYnl0ZXMgImJvb2w4IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM5CiAgICAvLyBzZWxmLmJvb2w5ID0gYXJyOQogICAgcHVzaGJ5dGVzICJib29sOSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC5zdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlczoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQ5CiAgICAvLyBzdW0xID0gc3VtMiA9IHN1bTMgPSBzdW00ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MAogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUwCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gc3VtMSArPSBpCiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUyCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTQKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTYKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyAxMQogICAgZGlnIDE2CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAxOQogICAgZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAqCiAgICBwdXNoaW50IDkgLy8gOQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICBnZXRiaXQKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gc3VtMyArPSB0dXAuZm9vCiAgICBkaWcgNgogICAgdW5jb3ZlciAyCiAgICArCiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NwogICAgLy8gaWYgdHVwLmJhcjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU4CiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTkKICAgIC8vIGlmIHR1cC5iYXo6CiAgICBkaWcgMTAKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBzdW0zICs9IDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICBkaWcgMTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEyCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyA2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjEKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjMKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NAogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc3CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NAogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODUKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF90dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X3R1cGxlX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KCksIFN0cmluZygiSGVsbG8iKSksKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMGEwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShpLCB0aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgdGltZXMKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAxCiAgICAvLyBtdXRhYmxlLmV4dGVuZChhcnIpCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBtdXRhYmxlLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgY292ZXIgMwogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMgoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gcmV0dXJuIG11dGFibGUuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDEwCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOAogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTkKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI3CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjYKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyNwogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM0CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzUKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MgogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbXV0YWJsZV9hcmM0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW11dGFibGVfYXJjNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NgogICAgLy8gYXNzZXJ0IGltbSwgImV4cGVjdGVkIG5vbiBlbXB0eSBhcnJheSIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBub24gZW1wdHkgYXJyYXkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0NwogICAgLy8gaW1tID0gaW1tLnJlcGxhY2UoaW1tLmxlbmd0aCAtIDEsIGltbVswXSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDE2CiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltbV9maXhlZF9hcnJbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbV9maXhlZF9hcnI6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTIKICAgIC8vIGFycjEgPSB6ZXJvX2J5dGVzKE5hdGl2ZVN0cnVjdDMpCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBiemVybwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTMKICAgIC8vIHN0cnVjdDEyID0gTmF0aXZlU3RydWN0KFR4bi5udW1fYXBwX2FyZ3MgKyAxLCBUeG4ubnVtX2FwcF9hcmdzICsgMikKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBhcnIyID0gTmF0aXZlU3RydWN0Mygoc3RydWN0MTIsIHN0cnVjdDEyLCBzdHJ1Y3QxMikpCiAgICBkdXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTYKICAgIC8vIGFzc2VydCBhcnIxICE9IGFycjIsICJleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50IgogICAgIT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgZGlmZmVyZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTkKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiB0ZXN0X2ltbV9maXhlZF9hcnJfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gYXJyMSA9IGFycjEucmVwbGFjZShpLCBzdHJ1Y3QxMikKICAgIGR1cG4gMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGRpZyA1CiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDIKCnRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MgogICAgLy8gYXNzZXJ0IGFycjEgPT0gYXJyMiwgImV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZSIKICAgIGRpZyAzCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcnJheXMgdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjQKICAgIC8vIGZvciBzdHJ1Y3RfaXQgaW4gYXJyMToKICAgIGRpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjUKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY3CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzEKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzMKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc2CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCagNRBHsFNgXmBksHfQiyCLgIxwmkCsIL8ww/DHIMxA0kDXMNjA2oDbsN5A4NDioAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIkyLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAEoSYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBASJJiwGBAwxBAB+LAUmBEAuL/0yBEFhJIluLAAhMJVsIjAAjCIwBQv/ZiYoBASgiiwGL/wxBABGLAIABIFCMAIsBIwiMAUL/54mKAgEiiwCL/wxBAB2LAEkWi/5MUIv+IlkjCBZXBgJcAIz+IwiMAEL/24v+TImACgABAAAAAAAAACqBBYj/wkkiWUmBBhJESSMJSwJXAgBMJQtbgQQSRIErFk8CTFBMIwgWVwYCXABHAiJZSYEHEkQjCUsBVwIATCULW4ErEkQkW4EqEkQiSYEDDEEAEUsBJYj9OkUDSEkjCEUBQv/oSwFJIllJgQQSRCMJSwFXAgBMJQtbJBJEgQqI/0ZJIllJgQ4SREkjCUsCVwIATCULW4EJEkSBLBZPAkxQTCMIFlcGAlwASSJZSYEPEkQjCUsBVwIATCULW4EsEkSBFxZcEkkiWYEPEkRJgRJbgRcSRIABYUxnI0MxGyMJFoFAr0lOAqsqTFCAAgABXABHAiJZSSMSRCMJTFcCAEyBQAuBQFgoqEQiSYEFDEEAIEcCFksEq0sDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/ZSwFJIllJgQYSREkjCUsCVwIATIFAC4FAWIABBKhEMRsWJwVMoUkVgUAOREsFq08CTFBMIwgWVwYCXABJIllJgQcSREkjCUsCVwIATIFAC4FAWIBA/////////////////////////////////////////////////////////////////////////////////////qhESwFXAkAoqERMJwVQTCMIFlcGAlwASSJZSSUSRCMJSwFXAgBMgUALgUBYJwWoRElXAkAoqEQnB7xIJwdMvyNDKDYaARcqIklLAwxBAB4xG0sBSU8CEisiTwJUSwNMIyWI++9FAyMIRQFC/9tLASJZSUUFSwNJTgISREEACksDREsBgRBTFERLAiMNQQAMI0sEDERLAYERUxRESwIkDUEACyRLBAxESwGBElNESwKBAw1BABJLAiMJSUsFDESBEAhLAkxTFESAAWdLAmdLAkEAKEsDIwlJFlcGAEsDTFwASwGBEAgiVEyBBwglCiQIIkxSIllLAyMJEkQjQyoiSYEFDEEAJUcCIwhMJAhLARZMFlBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/9RLAUkiWUmBBRJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEFEkyBBhIQRIEQiPplRQFJIllJgQQSREsBVwIASwJXAhBJIltMJVtMIxJMJBIQREwjCYEQC4EQWEkiW0wlW0yBBBJMgQUSEESAAWNMZyNDKiJJgQUMQQA0RwIkGBRLAYEDCyQYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xUsBSSJZgQUSRElXAglJIltLAYFAU08CgUFTTwIURExERIABZExnI0MoKiJJgQUMQQA1RwIjCEyvSwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j67kUDRQFC/8RLASJZSUUEgQUSRCJFAUmBBQxBAE9LAVcCAEsBSU4CJAtLAUxZSwIjCEsGSwEJSwMVSwIkC0sFTFlPAk1PA08DTwJSSSJbSwElWUsCFU8DTgJSVwIATEsCEkQVTwISREUBQv+qSwGI+ThFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxIir08CEhBESwEkC0sDTFlPAiMITwRLAQlMJAtLBExZTwNMTwJNUkkiW0sBJVlLAhVPA04CUlcCAEyBBBKBA69PAhIQRIABZUxnI0MoKiJJgQUMQQA3RwIjCEyI+o9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPm6RQNFAUL/wksBIllJRQSBBRJEIkUBSYEFDEEAUUsBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRE8CiPoBEkRFAUL/qEsBiPgCRQFJIllJgQQSREsBVwIASSJZSwIjCUsCFUsDJFlLAUxLA01LBE8ETwJSSSJbSwElWUsCFU8DTgJSVwIATCMSTCgSEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEkyAAyAgIBIQRIABZkxnI0M2GgGwI0OABvpAwFMAAjYaAVCwI0MiRwIoRwU2GgEXNhoCIklLAwxBAEwqRQwiRQVLBEsBDEEAHksESRZLDUlPAlBMIlkjCBZXBgJcAEUNIwhFBUL/2ksBSSJZTFcCACcESw5QTgIjTwOI+FNFAkkjCEUBQv+tKkUKSwEiWUUJIkUHSwZLCQxBAGFLAVcCAEsHJAtLAUxZSlklCyQIWElFDCJFBSJZRQgiRQZLBUsIDEEAGUsKVwIASwZJTgIlC1tLBQhFBSMIRQZC/99LAxZLCklPAlBMIlkjCBZXBgJcAEUKSwYjCEUHQv+XKUsKULAjQypHAyJJgQUMQQDGRwIUSwEjEisiTwNUI08CVEsGSU4CSwFQTwIiWSMIFlcGAlwARQdLASQSSwKBAxJLA4EEEksEgQUSSwWBBhJLBiMISwcWTwckTwhUgQNPB1SBBE8GVIEFTwVUgQZPBFRKUEsDFkxLAVBLCUlPAlBMIlkjCBZXBgJcAEUJSwSBBxJPAoEHTwJUTwJMUElLAlBLB0lPAlBMIlkjCBZXBgJcAEUHTwMlEisiTwJUUExQSwNJTwJQTCJZIwgWVwYCXABFA0UBQv8zSwRJIlmBBRJESwRJIlmBBRJESwRJIlmBBRJESwRJIlmBBRJEgAVib29sMk8EZ4AFYm9vbDdPA2eABWJvb2w4TwJngAVib29sOUxnI0MoRwY2GgE2GgI2GgM2GgQiRwM2GgEiWSJJSwIMQQAZSwlXAgBLAUlOAiULW0sECEUEIwhFAUL/4EsIIllFESJFDUsMSxEMQQAbSwyBEAhLCUxTQQAGSwMjCEUESwwjCEUNQv/dSwciWUUQIkUMSwtLEAxBAEBLB1cCAEsMgQkLgQlYSSJbSwGBQFNPAoFBU0UNSwZPAghFBkEABksEIwhFBUsKQQAGSwQjCEUFSwsjCEUMQv+4SwYiWUUPIkUOSw1LDwxBAFZLBlcCAEsOSU4CJAtLAUxZSwIjCEsSSwEJSwMVSwIkC0sFTFlPAk1PA08DTwJSSSJbSwElWUsCFU8DTgJSVwIASwlPAghMFUxLAQhFCU8CEkRFDkL/oksCFksEFlBLBRZQSwYWUClMULAjQzYaAReAGgADAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADIklLAwxBAB1HAhZLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/3ClLAlCwI0M2GgEXgAMABagiSUsDDEEAG0cCJBgUKyJPAlRLA0wjJYj0K0UDIwhFAUL/3ilLAlCwI0M2GgEXgAsAAQAAAAAAAAAAgCJJSwMMQQAyRwIkGBRLAYEDGBRLAhYrIk8EVCNPA1RQSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/8cpSwJQsCNDNhoBF4AVAAEAAgAAAAAAAAAAAAoABUhlbGxvIklLAwxBADZHAoj1MksDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI9F1FAyMIRQFC/8MpSwJQsCNDNhoBNhoCF0xXAgAiSUsDDEEAKUcCJBgUSwGBAxgUSwROA0sCFisiTwRUI08DVFBPAkxQRQMjCEUBQv/QSwFJFYEJChZXBgJMUClMULAjQycINhoBUElXAgAVJQoWVwYCXAApTFCwI0M2GgFJVwAITFcICFAnCExQgAIABFwAKUxQsCNDNhoBVwQAJwlMJIjzUSlMULAjQzYaAUkiWUsBJFlLAk8CSwJSSwIVTwNPA08CUlAnCUwkiPMoKUxQsCNDNhoBNhoCSwEiWU8CVwIASwJXAgBPAyJZTwNPA08CTwOI82opTFCwI0M2GgFJIllJRCMJSwFXAhBMgRALJAhMXSlMULAjQyiBMK9JMRsjCDEbJAhMFkwWUElOAklLAVBMUElOAhNEIkmBAwxBABRHAoEQC0sFTEsFXUUFIwhFAUL/5UsDSwISRCJFBUsEgQMMQQAXSwRJgRALSwVMgRBYSwQSRCMIRQVC/+EnCksESU4CZ0mI81eBDxJEgBAAAAAAAAAAAAAAAAAAAAAAXACI8zyBChJEIicKZUQpTFCwI0M=", + "approval": "CiAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBJBJLAoEDEksDgQQSSwSBBRJLBYEGEksGIwhLBxZPByRPCFSBA08HVIEETwZUgQVPBVSBBk8EVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal new file mode 100644 index 0000000..bf11939 --- /dev/null +++ b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal @@ -0,0 +1,272 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.approval_program() -> uint64: +main: + intcblock 8 3 1 0 + bytecblock 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:479 + // class ImmutableArrayInitContract(arc4.ARC4Contract): + txn NumAppArgs + bz main___algopy_default_create@11 + txn OnCompletion + ! + assert // OnCompletion must be NoOp + txn ApplicationID + assert + pushbytess 0x8434ba2a 0x63aabba0 0xdbaf034e 0xa9d14554 // method "test_immutable_array_init()void", method "test_immutable_array_init_without_type_generic()void", method "test_reference_array_init()void", method "test_reference_array_init_without_type_generic()void" + txna ApplicationArgs 0 + match test_immutable_array_init test_immutable_array_init_without_type_generic test_reference_array_init test_reference_array_init_without_type_generic + err + +main___algopy_default_create@11: + txn OnCompletion + ! + txn ApplicationID + ! + && + return // on error: OnCompletion must be NoOp && can only call when creating + + +// tests.artifacts.Arrays.immutable.ImmutableArrayInitContract.test_immutable_array_init[routing]() -> void: +test_immutable_array_init: + // tests/artifacts/Arrays/immutable.py:490 + // a3 = ImmutableArray[UInt64](ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:480 + // @arc4.abimethod() + intc_2 // 1 + return + + +// tests.artifacts.Arrays.immutable.ImmutableArrayInitContract.test_immutable_array_init_without_type_generic[routing]() -> void: +test_immutable_array_init_without_type_generic: + // tests/artifacts/Arrays/immutable.py:512 + // a3 = ImmutableArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:502 + // @arc4.abimethod() + intc_2 // 1 + return + + +// tests.artifacts.Arrays.immutable.ImmutableArrayInitContract.test_reference_array_init[routing]() -> void: +test_reference_array_init: + // tests/artifacts/Arrays/immutable.py:526 + // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:528 + // a2 = ReferenceArray[UInt64](FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + dup + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:529 + // assert a1.length == a2.length + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:530 + // assert a1[0] == a2[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:531 + // assert a1[1] == a2[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:532 + // assert a1[2] == a2[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:534 + // a3 = ReferenceArray[UInt64](ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:536 + // assert a1[0] == a3[0] + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:537 + // assert a1[1] == a3[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:538 + // assert a1[2] == a3[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:526 + // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:541 + // assert a1.length == a4.length + dup + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:542 + // assert a1[0] == a4[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:543 + // assert a1[1] == a4[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:544 + // assert a1[2] == a4[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + // tests/artifacts/Arrays/immutable.py:524 + // @arc4.abimethod() + return + + +// tests.artifacts.Arrays.immutable.ImmutableArrayInitContract.test_reference_array_init_without_type_generic[routing]() -> void: +test_reference_array_init_without_type_generic: + // tests/artifacts/Arrays/immutable.py:548 + // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + // tests/artifacts/Arrays/immutable.py:550 + // a2 = ReferenceArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + dup + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:551 + // assert a1.length == a2.length + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:552 + // assert a1[0] == a2[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:553 + // assert a1[1] == a2[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:554 + // assert a1[2] == a2[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:556 + // a3 = ReferenceArray(ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + dupn 2 + // tests/artifacts/Arrays/immutable.py:558 + // assert a1[0] == a3[0] + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:559 + // assert a1[1] == a3[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:560 + // assert a1[2] == a3[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:548 + // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + bytec_0 // 0x000000000000000100000000000000020000000000000003 + pop + // tests/artifacts/Arrays/immutable.py:563 + // assert a1.length == a4.length + dup + len + intc_0 // 8 + / + intc_1 // 3 + == + assert + // tests/artifacts/Arrays/immutable.py:564 + // assert a1[0] == a4[0] + dup + intc_3 // 0 + extract_uint64 + intc_2 // 1 + == + assert + // tests/artifacts/Arrays/immutable.py:565 + // assert a1[1] == a4[1] + dup + intc_0 // 8 + extract_uint64 + pushint 2 // 2 + == + assert + // tests/artifacts/Arrays/immutable.py:566 + // assert a1[2] == a4[2] + pushint 16 // 16 + extract_uint64 + intc_1 // 3 + == + // tests/artifacts/Arrays/immutable.py:546 + // @arc4.abimethod() + return diff --git a/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json new file mode 100644 index 0000000..b843b6a --- /dev/null +++ b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json @@ -0,0 +1,144 @@ +{ + "name": "ImmutableArrayInitContract", + "structs": {}, + "methods": [ + { + "name": "test_immutable_array_init", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_immutable_array_init_without_type_generic", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_reference_array_init", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_reference_array_init_without_type_generic", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 42 + ], + "errorMessage": "OnCompletion must be NoOp" + }, + { + "pc": [ + 89 + ], + "errorMessage": "OnCompletion must be NoOp && can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzkKICAgIC8vIGNsYXNzIEltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDg0MzRiYTJhIDB4NjNhYWJiYTAgMHhkYmFmMDM0ZSAweGE5ZDE0NTU0IC8vIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQgdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYyB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0IHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDkwCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTEyCiAgICAvLyBhMyA9IEltbXV0YWJsZUFycmF5KFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNgogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzAKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzQKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNgogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzcKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjYKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQxCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5SW5pdENvbnRyYWN0LnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ4CiAgICAvLyBhMSA9IFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MAogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheShGaXhlZEFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBkdXAKICAgIHBvcAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTIubGVuZ3RoCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTJbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU2CiAgICAvLyBhMyA9IFJlZmVyZW5jZUFycmF5KEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU4CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzJdID09IGEzWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OAogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTYzCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY0CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY1CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY2CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAA0AEQBjADEZFDEYFBBDKEgkQyhIJEMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJDKElIRwIVIgojEkRJJVskEkRJIluBAhJEgRBbIxJEKEhHAiVbJBJESSJbgQISRIEQWyMSRChIKEhJFSIKIxJESSVbJBJESSJbgQISRIEQWyMSQw==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 5, + "minor": 0, + "patch": 0 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal new file mode 100644 index 0000000..a433105 --- /dev/null +++ b/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal index fabbeaf..c5b5700 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +++ b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal @@ -1,7 +1,7 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.Arrays.static_size.StaticSizeContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 0 1 8 16 144 bytecblock 0x 0x151f7c75 "count" 0x00 0x0000 @@ -17,7 +17,7 @@ main_after_if_else@2: // tests/artifacts/Arrays/static_size.py:37 // class StaticSizeContract(arc4.ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@14 + bz main___algopy_default_create@16 txn OnCompletion ! assert // OnCompletion must be NoOp @@ -28,7 +28,7 @@ main_after_if_else@2: match test_array test_extend_from_tuple test_extend_from_arc4_tuple test_bool_array test_arc4_conversion sum_array test_arc4_bool err -main___algopy_default_create@14: +main___algopy_default_create@16: txn OnCompletion ! txn ApplicationID @@ -141,20 +141,22 @@ test_array: bytec_2 // "count" intc_0 // 0 app_global_put - // tests/artifacts/Arrays/static_size.py:45 + // tests/artifacts/Arrays/static_size.py:46 // Point(x=arc4.UInt64(), y=UInt64(), other=self.xtra()), callsub xtra - // tests/artifacts/Arrays/static_size.py:46 + // tests/artifacts/Arrays/static_size.py:47 // Point(x=x1, y=y1, other=self.xtra()), callsub xtra - // tests/artifacts/Arrays/static_size.py:47 + // tests/artifacts/Arrays/static_size.py:48 // Point(x=x2, y=y2, other=self.xtra()), callsub xtra - // tests/artifacts/Arrays/static_size.py:44-48 + // tests/artifacts/Arrays/static_size.py:44-50 // path = ReferenceArray( - // Point(x=arc4.UInt64(), y=UInt64(), other=self.xtra()), - // Point(x=x1, y=y1, other=self.xtra()), - // Point(x=x2, y=y2, other=self.xtra()), + // ( + // Point(x=arc4.UInt64(), y=UInt64(), other=self.xtra()), + // Point(x=x1, y=y1, other=self.xtra()), + // Point(x=x2, y=y2, other=self.xtra()), + // ) // ) uncover 14 itob @@ -231,18 +233,18 @@ test_array: concat concat concat - // tests/artifacts/Arrays/static_size.py:49 + // tests/artifacts/Arrays/static_size.py:51 // for i in urange(3): intc_0 // 0 test_array_for_header@2: - // tests/artifacts/Arrays/static_size.py:49 + // tests/artifacts/Arrays/static_size.py:51 // for i in urange(3): dup pushint 3 // 3 < bz test_array_after_for@5 - // tests/artifacts/Arrays/static_size.py:50 + // tests/artifacts/Arrays/static_size.py:52 // assert path[i].other.b == i + 1 dup2 dup @@ -262,7 +264,7 @@ test_array_for_header@2: dig 1 == assert - // tests/artifacts/Arrays/static_size.py:51 + // tests/artifacts/Arrays/static_size.py:53 // assert path[i].other.d.foo == i + 2 swap extract 48 16 @@ -274,7 +276,7 @@ test_array_for_header@2: itob b== assert - // tests/artifacts/Arrays/static_size.py:52 + // tests/artifacts/Arrays/static_size.py:54 // assert path[i].other.d.bar == (i + 1) * (i + 1) extract 8 8 dig 1 @@ -288,7 +290,7 @@ test_array_for_header@2: test_array_after_for@5: dig 1 - // tests/artifacts/Arrays/static_size.py:54 + // tests/artifacts/Arrays/static_size.py:56 // Box(ImmutableArray[Point], key="a").value = path.freeze() dup len @@ -306,7 +308,7 @@ test_array_after_for@5: pushbytes "a" swap box_put - // tests/artifacts/Arrays/static_size.py:167 + // tests/artifacts/Arrays/static_size.py:169 // last_point = path[0] extract 0 144 // on error: index access is out of bounds dup @@ -317,24 +319,24 @@ test_array_after_for@5: intc_2 // 8 extract_uint64 bury 6 - // tests/artifacts/Arrays/static_size.py:168 + // tests/artifacts/Arrays/static_size.py:170 // length = UInt64() intc_0 // 0 bury 5 - // tests/artifacts/Arrays/static_size.py:169 + // tests/artifacts/Arrays/static_size.py:171 // for point_idx in urange(1, path.length): intc_1 // 1 bury 3 test_array_for_header@7: - // tests/artifacts/Arrays/static_size.py:169 + // tests/artifacts/Arrays/static_size.py:171 // for point_idx in urange(1, path.length): dig 2 dig 8 < bz test_array_after_for@15 dig 1 - // tests/artifacts/Arrays/static_size.py:170 + // tests/artifacts/Arrays/static_size.py:172 // point = path[point_idx] dig 3 intc 4 // 144 @@ -347,45 +349,45 @@ test_array_for_header@7: intc_2 // 8 extract_uint64 bury 6 - // tests/artifacts/Arrays/static_size.py:171 + // tests/artifacts/Arrays/static_size.py:173 // if point.x < last_point.x: dig 10 b< bz test_array_else_body@10 - // tests/artifacts/Arrays/static_size.py:172 + // tests/artifacts/Arrays/static_size.py:174 // dx = last_point.x.as_uint64() - point.x.as_uint64() dig 10 - // tests/artifacts/Arrays/static_size.py:167 + // tests/artifacts/Arrays/static_size.py:169 // last_point = path[0] intc_0 // 0 - // tests/artifacts/Arrays/static_size.py:172 + // tests/artifacts/Arrays/static_size.py:174 // dx = last_point.x.as_uint64() - point.x.as_uint64() extract_uint64 swap - // tests/artifacts/Arrays/static_size.py:170 + // tests/artifacts/Arrays/static_size.py:172 // point = path[point_idx] intc_0 // 0 - // tests/artifacts/Arrays/static_size.py:172 + // tests/artifacts/Arrays/static_size.py:174 // dx = last_point.x.as_uint64() - point.x.as_uint64() extract_uint64 - bury 7 test_array_after_if_else@11: - // tests/artifacts/Arrays/static_size.py:175 + // tests/artifacts/Arrays/static_size.py:177 // if point.y < last_point.y: dig 3 dig 6 < bz test_array_else_body@13 - // tests/artifacts/Arrays/static_size.py:176 + // tests/artifacts/Arrays/static_size.py:178 // dy = last_point.y - point.y dig 5 dig 4 - test_array_after_if_else@14: - // tests/artifacts/Arrays/static_size.py:179 + // tests/artifacts/Arrays/static_size.py:181 // length += op.sqrt(dx * dx + dy * dy) dig 7 dup @@ -398,7 +400,7 @@ test_array_after_if_else@14: dig 5 + bury 5 - // tests/artifacts/Arrays/static_size.py:169 + // tests/artifacts/Arrays/static_size.py:171 // for point_idx in urange(1, path.length): dig 2 intc_1 // 1 @@ -407,7 +409,7 @@ test_array_after_if_else@14: b test_array_for_header@7 test_array_else_body@13: - // tests/artifacts/Arrays/static_size.py:178 + // tests/artifacts/Arrays/static_size.py:180 // dy = point.y - last_point.y dig 3 dig 6 @@ -415,17 +417,17 @@ test_array_else_body@13: b test_array_after_if_else@14 test_array_else_body@10: - // tests/artifacts/Arrays/static_size.py:170 + // tests/artifacts/Arrays/static_size.py:172 // point = path[point_idx] intc_0 // 0 - // tests/artifacts/Arrays/static_size.py:174 + // tests/artifacts/Arrays/static_size.py:176 // dx = point.x.as_uint64() - last_point.x.as_uint64() extract_uint64 dig 10 - // tests/artifacts/Arrays/static_size.py:167 + // tests/artifacts/Arrays/static_size.py:169 // last_point = path[0] intc_0 // 0 - // tests/artifacts/Arrays/static_size.py:174 + // tests/artifacts/Arrays/static_size.py:176 // dx = point.x.as_uint64() - last_point.x.as_uint64() extract_uint64 - @@ -447,19 +449,19 @@ test_array_after_for@15: // tests.artifacts.Arrays.static_size.StaticSizeContract.test_extend_from_tuple[routing]() -> void: test_extend_from_tuple: - // tests/artifacts/Arrays/static_size.py:57 + // tests/artifacts/Arrays/static_size.py:59 // @arc4.abimethod() txna ApplicationArgs 1 dup extract 0 16 swap extract 16 16 - // tests/artifacts/Arrays/static_size.py:60 + // tests/artifacts/Arrays/static_size.py:62 // arr.extend(some_more) swap dig 1 concat - // tests/artifacts/Arrays/static_size.py:61 + // tests/artifacts/Arrays/static_size.py:63 // last = arr[-1] dup len @@ -474,20 +476,20 @@ test_extend_from_tuple: swap intc_3 // 16 extract3 // on error: index access is out of bounds - // tests/artifacts/Arrays/static_size.py:62 + // tests/artifacts/Arrays/static_size.py:64 // assert last == some_more[1] dup uncover 4 == assert - // tests/artifacts/Arrays/static_size.py:63 + // tests/artifacts/Arrays/static_size.py:65 // result = arr.freeze() swap itob extract 6 2 uncover 2 concat - // tests/artifacts/Arrays/static_size.py:64 + // tests/artifacts/Arrays/static_size.py:66 // assert result[-1] == last dup intc_0 // 0 @@ -504,7 +506,7 @@ test_extend_from_tuple: uncover 2 == assert - // tests/artifacts/Arrays/static_size.py:57 + // tests/artifacts/Arrays/static_size.py:59 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -516,14 +518,14 @@ test_extend_from_tuple: // tests.artifacts.Arrays.static_size.StaticSizeContract.test_extend_from_arc4_tuple[routing]() -> void: test_extend_from_arc4_tuple: - // tests/artifacts/Arrays/static_size.py:67 + // tests/artifacts/Arrays/static_size.py:69 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/static_size.py:72 + // tests/artifacts/Arrays/static_size.py:74 // arr.extend(some_more) dup pop - // tests/artifacts/Arrays/static_size.py:73 + // tests/artifacts/Arrays/static_size.py:75 // return arr.freeze() dup len @@ -533,7 +535,7 @@ test_extend_from_arc4_tuple: extract 6 2 swap concat - // tests/artifacts/Arrays/static_size.py:67 + // tests/artifacts/Arrays/static_size.py:69 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -547,29 +549,29 @@ test_extend_from_arc4_tuple: test_bool_array: bytec_0 // "" dupn 2 - // tests/artifacts/Arrays/static_size.py:75 + // tests/artifacts/Arrays/static_size.py:77 // @arc4.abimethod() txna ApplicationArgs 1 btoi dup - // tests/artifacts/Arrays/static_size.py:77 + // tests/artifacts/Arrays/static_size.py:79 // arr = ReferenceArray[bool]() bytec_0 // 0x swap - // tests/artifacts/Arrays/static_size.py:80 + // tests/artifacts/Arrays/static_size.py:82 // for i in urange(1, length + 1): intc_1 // 1 + intc_1 // 1 test_bool_array_for_header@2: - // tests/artifacts/Arrays/static_size.py:80 + // tests/artifacts/Arrays/static_size.py:82 // for i in urange(1, length + 1): dup dig 2 < bz test_bool_array_after_for@5 - // tests/artifacts/Arrays/static_size.py:81 + // tests/artifacts/Arrays/static_size.py:83 // arr.append(i % 2 == 0) dupn 2 pushint 2 // 2 @@ -583,7 +585,7 @@ test_bool_array_for_header@2: setbit concat // on error: max array length exceeded bury 4 - // tests/artifacts/Arrays/static_size.py:80 + // tests/artifacts/Arrays/static_size.py:82 // for i in urange(1, length + 1): intc_1 // 1 + @@ -593,7 +595,7 @@ test_bool_array_for_header@2: test_bool_array_after_for@5: dig 2 dupn 2 - // tests/artifacts/Arrays/static_size.py:82 + // tests/artifacts/Arrays/static_size.py:84 // assert arr.length == length, "expected correct length" len dig 6 @@ -602,10 +604,10 @@ test_bool_array_after_for@5: == assert // expected correct length dig 1 - // tests/artifacts/Arrays/static_size.py:85 + // tests/artifacts/Arrays/static_size.py:87 // arr2.extend(arr) concat // on error: max array length exceeded - // tests/artifacts/Arrays/static_size.py:86 + // tests/artifacts/Arrays/static_size.py:88 // assert arr2.length == length * 2, "expected correct length" len uncover 2 @@ -613,11 +615,11 @@ test_bool_array_after_for@5: * == assert // expected correct length - // tests/artifacts/Arrays/static_size.py:88 + // tests/artifacts/Arrays/static_size.py:90 // count = UInt64(0) intc_0 // 0 bury 7 - // tests/artifacts/Arrays/static_size.py:89 + // tests/artifacts/Arrays/static_size.py:91 // for val in arr: len bury 7 @@ -625,7 +627,7 @@ test_bool_array_after_for@5: bury 5 test_bool_array_for_header@6: - // tests/artifacts/Arrays/static_size.py:89 + // tests/artifacts/Arrays/static_size.py:91 // for val in arr: dig 4 dig 7 @@ -637,10 +639,10 @@ test_bool_array_for_header@6: extract3 // on error: index access is out of bounds intc_0 // 0 getbit - // tests/artifacts/Arrays/static_size.py:90 + // tests/artifacts/Arrays/static_size.py:92 // if val: bz test_bool_array_after_if_else@9 - // tests/artifacts/Arrays/static_size.py:91 + // tests/artifacts/Arrays/static_size.py:93 // count += 1 dig 5 intc_1 // 1 @@ -655,7 +657,7 @@ test_bool_array_after_if_else@9: b test_bool_array_for_header@6 test_bool_array_after_for@11: - // tests/artifacts/Arrays/static_size.py:75 + // tests/artifacts/Arrays/static_size.py:77 // @arc4.abimethod() dig 5 itob @@ -671,29 +673,29 @@ test_bool_array_after_for@11: test_arc4_conversion: bytec_0 // "" dupn 2 - // tests/artifacts/Arrays/static_size.py:94 + // tests/artifacts/Arrays/static_size.py:96 // @arc4.abimethod() txna ApplicationArgs 1 btoi dup - // tests/artifacts/Arrays/static_size.py:96 + // tests/artifacts/Arrays/static_size.py:98 // arr = ReferenceArray[arc4.UInt64]() bytec_0 // 0x swap - // tests/artifacts/Arrays/static_size.py:99 + // tests/artifacts/Arrays/static_size.py:101 // for i in urange(1, length + 1): intc_1 // 1 + intc_1 // 1 test_arc4_conversion_for_header@2: - // tests/artifacts/Arrays/static_size.py:99 + // tests/artifacts/Arrays/static_size.py:101 // for i in urange(1, length + 1): dup dig 2 < bz test_arc4_conversion_after_for@5 - // tests/artifacts/Arrays/static_size.py:100 + // tests/artifacts/Arrays/static_size.py:102 // arr.append(arc4.UInt64(i)) dupn 2 itob @@ -701,7 +703,7 @@ test_arc4_conversion_for_header@2: swap concat // on error: max array length exceeded bury 4 - // tests/artifacts/Arrays/static_size.py:99 + // tests/artifacts/Arrays/static_size.py:101 // for i in urange(1, length + 1): intc_1 // 1 + @@ -710,7 +712,7 @@ test_arc4_conversion_for_header@2: test_arc4_conversion_after_for@5: dig 2 - // tests/artifacts/Arrays/static_size.py:101 + // tests/artifacts/Arrays/static_size.py:103 // assert arr.length == length, "expected correct length" len intc_2 // 8 @@ -720,7 +722,7 @@ test_arc4_conversion_after_for@5: dig 4 == assert // expected correct length - // tests/artifacts/Arrays/static_size.py:102 + // tests/artifacts/Arrays/static_size.py:104 // count = UInt64(0) intc_0 // 0 bury 6 @@ -728,7 +730,7 @@ test_arc4_conversion_after_for@5: bury 5 test_arc4_conversion_for_header@6: - // tests/artifacts/Arrays/static_size.py:103 + // tests/artifacts/Arrays/static_size.py:105 // for val in arr: dig 4 dig 7 @@ -740,12 +742,12 @@ test_arc4_conversion_for_header@6: * intc_2 // 8 extract3 // on error: index access is out of bounds - // tests/artifacts/Arrays/static_size.py:104 + // tests/artifacts/Arrays/static_size.py:106 // if val: bytec_0 // 0x b!= bz test_arc4_conversion_after_if_else@9 - // tests/artifacts/Arrays/static_size.py:105 + // tests/artifacts/Arrays/static_size.py:107 // count += 1 dig 5 intc_1 // 1 @@ -760,11 +762,11 @@ test_arc4_conversion_after_if_else@9: b test_arc4_conversion_for_header@6 test_arc4_conversion_after_for@11: - // tests/artifacts/Arrays/static_size.py:107 + // tests/artifacts/Arrays/static_size.py:109 // arc4_arr = arc4.DynamicArray[arc4.UInt64]() bytec 4 // 0x0000 dig 3 - // tests/artifacts/Arrays/static_size.py:108 + // tests/artifacts/Arrays/static_size.py:110 // arc4_arr.extend(arr) concat // on error: max array length exceeded dup @@ -775,7 +777,7 @@ test_arc4_conversion_after_for@11: itob extract 6 2 replace2 0 - // tests/artifacts/Arrays/static_size.py:94 + // tests/artifacts/Arrays/static_size.py:96 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -787,18 +789,18 @@ test_arc4_conversion_after_for@11: // tests.artifacts.Arrays.static_size.StaticSizeContract.sum_array[routing]() -> void: sum_array: - // tests/artifacts/Arrays/static_size.py:112 + // tests/artifacts/Arrays/static_size.py:114 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/static_size.py:115 + // tests/artifacts/Arrays/static_size.py:117 // arr.extend(arc4_arr) extract 2 0 dup - // tests/artifacts/Arrays/static_size.py:117 + // tests/artifacts/Arrays/static_size.py:119 // total = UInt64(0) intc_0 // 0 swap - // tests/artifacts/Arrays/static_size.py:118 + // tests/artifacts/Arrays/static_size.py:120 // for item in arr: len intc_2 // 8 @@ -806,7 +808,7 @@ sum_array: intc_0 // 0 sum_array_for_header@2: - // tests/artifacts/Arrays/static_size.py:118 + // tests/artifacts/Arrays/static_size.py:120 // for item in arr: dup dig 2 @@ -818,7 +820,7 @@ sum_array_for_header@2: cover 2 intc_2 // 8 * - // tests/artifacts/Arrays/static_size.py:119 + // tests/artifacts/Arrays/static_size.py:121 // total += item.as_uint64() extract_uint64 dig 4 @@ -830,7 +832,7 @@ sum_array_for_header@2: b sum_array_for_header@2 sum_array_after_for@5: - // tests/artifacts/Arrays/static_size.py:112 + // tests/artifacts/Arrays/static_size.py:114 // @arc4.abimethod() dig 2 itob @@ -844,7 +846,7 @@ sum_array_after_for@5: // tests.artifacts.Arrays.static_size.StaticSizeContract.test_arc4_bool[routing]() -> void: test_arc4_bool: - // tests/artifacts/Arrays/static_size.py:141 + // tests/artifacts/Arrays/static_size.py:143 // arr.append(arc4.Bool(Txn.sender == Txn.receiver)) txn Sender txn Receiver @@ -853,7 +855,7 @@ test_arc4_bool: intc_0 // 0 uncover 2 setbit - // tests/artifacts/Arrays/static_size.py:142 + // tests/artifacts/Arrays/static_size.py:144 // arr.append(arc4.Bool(Txn.sender != Txn.receiver)) txn Sender txn Receiver @@ -864,13 +866,13 @@ test_arc4_bool: setbit concat // on error: max array length exceeded dupn 2 - // tests/artifacts/Arrays/static_size.py:145 + // tests/artifacts/Arrays/static_size.py:147 // dyn_arr.extend(arr) len - // tests/artifacts/Arrays/static_size.py:144 + // tests/artifacts/Arrays/static_size.py:146 // dyn_arr = arc4.DynamicArray[arc4.Bool]() bytec 4 // 0x0000 - // tests/artifacts/Arrays/static_size.py:145 + // tests/artifacts/Arrays/static_size.py:147 // dyn_arr.extend(arr) dig 2 uncover 2 @@ -878,7 +880,7 @@ test_arc4_bool: callsub dynamic_array_concat_bits dup cover 2 - // tests/artifacts/Arrays/static_size.py:146 + // tests/artifacts/Arrays/static_size.py:148 // assert dyn_arr.length == 2, "expected correct length" dup intc_0 // 0 @@ -889,14 +891,14 @@ test_arc4_bool: pushint 2 // 2 == assert // expected correct length - // tests/artifacts/Arrays/static_size.py:147 + // tests/artifacts/Arrays/static_size.py:149 // assert dyn_arr.bytes.length == 3, "expected 3 bytes" dig 1 len pushint 3 // 3 == assert // expected 3 bytes - // tests/artifacts/Arrays/static_size.py:148 + // tests/artifacts/Arrays/static_size.py:150 // assert dyn_arr[0] == (Txn.sender == Txn.receiver), "expected correct value at 0" dup assert // index access is out of bounds @@ -914,7 +916,7 @@ test_arc4_bool: == == assert // expected correct value at 0 - // tests/artifacts/Arrays/static_size.py:149 + // tests/artifacts/Arrays/static_size.py:151 // assert dyn_arr[1] == (Txn.sender != Txn.receiver), "expected correct value at 1" intc_1 // 1 > @@ -935,7 +937,7 @@ test_arc4_bool: intc_0 // 0 test_arc4_bool_for_header@2: - // tests/artifacts/Arrays/static_size.py:152-154 + // tests/artifacts/Arrays/static_size.py:154-156 // # note: not supported currently // # arr2.extend(dyn_array) // for b in dyn_arr: @@ -954,7 +956,7 @@ test_arc4_bool_for_header@2: uncover 2 setbit dig 3 - // tests/artifacts/Arrays/static_size.py:155 + // tests/artifacts/Arrays/static_size.py:157 // arr2.append(b) swap concat // on error: max array length exceeded @@ -966,14 +968,14 @@ test_arc4_bool_for_header@2: test_arc4_bool_after_for@5: dig 1 - // tests/artifacts/Arrays/static_size.py:156 + // tests/artifacts/Arrays/static_size.py:158 // assert arr2.length == 4, "expected correct length" dup len pushint 4 // 4 == assert // expected correct length - // tests/artifacts/Arrays/static_size.py:157 + // tests/artifacts/Arrays/static_size.py:159 // assert arr2[0] == (Txn.sender == Txn.receiver), "expected correct value at 0" dup extract 0 1 // on error: index access is out of bounds @@ -984,7 +986,7 @@ test_arc4_bool_after_for@5: == == assert // expected correct value at 0 - // tests/artifacts/Arrays/static_size.py:158 + // tests/artifacts/Arrays/static_size.py:160 // assert arr2[1] == (Txn.sender != Txn.receiver), "expected correct value at 1" dup extract 1 1 // on error: index access is out of bounds @@ -995,7 +997,7 @@ test_arc4_bool_after_for@5: != == assert // expected correct value at 1 - // tests/artifacts/Arrays/static_size.py:159 + // tests/artifacts/Arrays/static_size.py:161 // assert arr2[2] == (Txn.sender == Txn.receiver), "expected correct value at 2" dup extract 2 1 // on error: index access is out of bounds @@ -1006,7 +1008,7 @@ test_arc4_bool_after_for@5: == == assert // expected correct value at 2 - // tests/artifacts/Arrays/static_size.py:160 + // tests/artifacts/Arrays/static_size.py:162 // assert arr2[3] == (Txn.sender != Txn.receiver), "expected correct value at 3" extract 3 1 // on error: index access is out of bounds intc_0 // 0 @@ -1017,7 +1019,7 @@ test_arc4_bool_after_for@5: == assert // expected correct value at 3 dig 4 - // tests/artifacts/Arrays/static_size.py:162 + // tests/artifacts/Arrays/static_size.py:164 // return arr.freeze() dup len @@ -1025,7 +1027,7 @@ test_arc4_bool_after_for@5: cover 2 intc_2 // 8 callsub dynamic_array_concat_bits - // tests/artifacts/Arrays/static_size.py:138 + // tests/artifacts/Arrays/static_size.py:140 // @arc4.abimethod() bytec_1 // 0x151f7c75 swap @@ -1037,7 +1039,7 @@ test_arc4_bool_after_for@5: // tests.artifacts.Arrays.static_size.StaticSizeContract.xtra() -> uint64, uint64, bytes, bytes, bytes: xtra: - // tests/artifacts/Arrays/static_size.py:125 + // tests/artifacts/Arrays/static_size.py:127 // self.count += 1 intc_0 // 0 bytec_2 // "count" @@ -1048,23 +1050,23 @@ xtra: bytec_2 // "count" dig 1 app_global_put - // tests/artifacts/Arrays/static_size.py:127 + // tests/artifacts/Arrays/static_size.py:129 // a=Txn.num_app_args, txn NumAppArgs - // tests/artifacts/Arrays/static_size.py:129 + // tests/artifacts/Arrays/static_size.py:131 // c=Txn.sender, txn Sender - // tests/artifacts/Arrays/static_size.py:130 + // tests/artifacts/Arrays/static_size.py:132 // d=self.more(), callsub more - // tests/artifacts/Arrays/static_size.py:131 + // tests/artifacts/Arrays/static_size.py:133 // e=BigUInt(self.count), intc_0 // 0 bytec_2 // "count" app_global_get_ex assert // check self.count exists itob - // tests/artifacts/Arrays/static_size.py:126-132 + // tests/artifacts/Arrays/static_size.py:128-134 // return Xtra( // a=Txn.num_app_args, // b=self.count, @@ -1079,7 +1081,7 @@ xtra: // tests.artifacts.Arrays.static_size.StaticSizeContract.more() -> bytes: more: - // tests/artifacts/Arrays/static_size.py:136 + // tests/artifacts/Arrays/static_size.py:138 // return More(foo=arc4.UInt64(self.count + 1), bar=arc4.UInt64(self.count * self.count)) intc_0 // 0 bytec_2 // "count" diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json index 9e637ef..52a01bc 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +++ b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json @@ -307,7 +307,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MjhkN2MxYjggMHhmYTljYjk3MyAweDYwMzlhMjQwIDB4ZjhmZDY4YTcgMHgxZjAyOGRiMSAweDA5NmIzYTU5IDB4OGQ2ZTNhMjUgLy8gbWV0aG9kICJ0ZXN0X2FycmF5KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZXh0ZW5kX2Zyb21fdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2NvbnZlcnNpb24odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJzdW1fYXJyYXkodWludDY0W10pdWludDY0IiwgbWV0aG9kICJ0ZXN0X2FyYzRfYm9vbCgpYm9vbFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlIHRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZSB0ZXN0X2Jvb2xfYXJyYXkgdGVzdF9hcmM0X2NvbnZlcnNpb24gc3VtX2FycmF5IHRlc3RfYXJjNF9ib29sCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIC0KICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgNAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXk6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQzCiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NQogICAgLy8gUG9pbnQoeD1hcmM0LlVJbnQ2NCgpLCB5PVVJbnQ2NCgpLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDYKICAgIC8vIFBvaW50KHg9eDEsIHk9eTEsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MiwgeT15Miwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ0LTQ4CiAgICAvLyBwYXRoID0gUmVmZXJlbmNlQXJyYXkoCiAgICAvLyAgICAgUG9pbnQoeD1hcmM0LlVJbnQ2NCgpLCB5PVVJbnQ2NCgpLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIGRpZyAxMQogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAxMgogICAgZGlnIDEKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNQogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBkaWcgOQogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDkKICAgIGRpZyA0CiAgICBifAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDkKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDkKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGR1cAogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTAKICAgIC8vIGFzc2VydCBwYXRoW2ldLm90aGVyLmIgPT0gaSArIDEKICAgIGR1cDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDE2IDEyOAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTEKICAgIC8vIGFzc2VydCBwYXRoW2ldLm90aGVyLmQuZm9vID09IGkgKyAyCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDE2CiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NwogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OAogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NwogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzUKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NgogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc5CiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc4CiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjcKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjAKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MQogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYyCiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYzCiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NAogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgKgogICAgaW50Y18zIC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3MgogICAgLy8gYXJyLmV4dGVuZChzb21lX21vcmUpCiAgICBkdXAKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3MwogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzcKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMQoKdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MQogICAgLy8gYXJyLmFwcGVuZChpICUgMiA9PSAwKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODUKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4NgogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gY291bnQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODkKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgbGVuCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg5CiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkwCiAgICAvLyBpZiB2YWw6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDUKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FyYzRfY29udmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jb252ZXJzaW9uOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk2CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDAKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckA1OgogICAgZGlnIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSA4CiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDQKICAgIC8vIGlmIHZhbDoKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGIhPQogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNQogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJANgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGFyYzRfYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDgKICAgIC8vIGFyYzRfYXJyLmV4dGVuZChhcnIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnN1bV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTUKICAgIC8vIGFyci5leHRlbmQoYXJjNF9hcnIpCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNwogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExOAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDAKCnN1bV9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExOAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX2FycmF5X2FmdGVyX2ZvckA1CiAgICBkaWcgMwogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE5CiAgICAvLyB0b3RhbCArPSBpdGVtLmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYXJyYXlfZm9yX2hlYWRlckAyCgpzdW1fYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQxCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5Cb29sKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSkKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDUKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDQKICAgIC8vIGR5bl9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LkJvb2xdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NQogICAgLy8gZHluX2Fyci5leHRlbmQoYXJyKQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NgogICAgLy8gYXNzZXJ0IGR5bl9hcnIubGVuZ3RoID09IDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ3CiAgICAvLyBhc3NlcnQgZHluX2Fyci5ieXRlcy5sZW5ndGggPT0gMywgImV4cGVjdGVkIDMgYnl0ZXMiCiAgICBkaWcgMQogICAgbGVuCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAzIGJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMF0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMCIKICAgIGR1cAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDE2CiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDkKICAgIC8vIGFzc2VydCBkeW5fYXJyWzFdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEiCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMQogICAgaW50Y18wIC8vIDAKCnRlc3RfYXJjNF9ib29sX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUyLTE1NAogICAgLy8gIyBub3RlOiBub3Qgc3VwcG9ydGVkIGN1cnJlbnRseQogICAgLy8gIyBhcnIyLmV4dGVuZChkeW5fYXJyYXkpCiAgICAvLyBmb3IgYiBpbiBkeW5fYXJyOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9hcmM0X2Jvb2xfYWZ0ZXJfZm9yQDUKICAgIGR1cG4gMgogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkaWcgNQogICAgc3dhcAogICAgZ2V0Yml0CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU1CiAgICAvLyBhcnIyLmFwcGVuZChiKQogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBidXJ5IDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1NgogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IDQsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1OQogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjAKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjIKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjUKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyNwogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI5CiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMAogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzEKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI2LTEzMgogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM2CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MjhkN2MxYjggMHhmYTljYjk3MyAweDYwMzlhMjQwIDB4ZjhmZDY4YTcgMHgxZjAyOGRiMSAweDA5NmIzYTU5IDB4OGQ2ZTNhMjUgLy8gbWV0aG9kICJ0ZXN0X2FycmF5KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZXh0ZW5kX2Zyb21fdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2NvbnZlcnNpb24odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJzdW1fYXJyYXkodWludDY0W10pdWludDY0IiwgbWV0aG9kICJ0ZXN0X2FyYzRfYm9vbCgpYm9vbFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlIHRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZSB0ZXN0X2Jvb2xfYXJyYXkgdGVzdF9hcmM0X2NvbnZlcnNpb24gc3VtX2FycmF5IHRlc3RfYXJjNF9ib29sCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIC0KICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgNAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyAxNgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDUKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZ2V0Yml0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYml0c193aGlsZV90b3BAMwoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXk6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQzCiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NgogICAgLy8gUG9pbnQoeD1hcmM0LlVJbnQ2NCgpLCB5PVVJbnQ2NCgpLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDcKICAgIC8vIFBvaW50KHg9eDEsIHk9eTEsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0OAogICAgLy8gUG9pbnQoeD14MiwgeT15Miwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ0LTUwCiAgICAvLyBwYXRoID0gUmVmZXJlbmNlQXJyYXkoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICAgICAgUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgZGlnIDExCiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDEyCiAgICBkaWcgMQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgOQogICAgZGlnIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIHVuY292ZXIgOAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBifAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU0CiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5kLmJhciA9PSAoaSArIDEpICogKGkgKyAxKQogICAgZXh0cmFjdCA4IDgKICAgIGRpZyAxCiAgICBkaWcgMgogICAgKgogICAgaXRvYgogICAgYj09CiAgICBhc3NlcnQKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU2CiAgICAvLyBCb3goSW1tdXRhYmxlQXJyYXlbUG9pbnRdLCBrZXk9ImEiKS52YWx1ZSA9IHBhdGguZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgImEiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgZXh0cmFjdCAwIDE0NCAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcwCiAgICAvLyBsZW5ndGggPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDMKCnRlc3RfYXJyYXlfZm9yX2hlYWRlckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBkaWcgOAogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JAMTUKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGRpZyAzCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MwogICAgLy8gaWYgcG9pbnQueCA8IGxhc3RfcG9pbnQueDoKICAgIGRpZyAxMAogICAgYjwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NAogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBkaWcgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NAogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnVyeSA3Cgp0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NwogICAgLy8gaWYgcG9pbnQueSA8IGxhc3RfcG9pbnQueToKICAgIGRpZyAzCiAgICBkaWcgNgogICAgPAogICAgYnogdGVzdF9hcnJheV9lbHNlX2JvZHlAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc4CiAgICAvLyBkeSA9IGxhc3RfcG9pbnQueSAtIHBvaW50LnkKICAgIGRpZyA1CiAgICBkaWcgNAogICAgLQoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxODEKICAgIC8vIGxlbmd0aCArPSBvcC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KQogICAgZGlnIDcKICAgIGR1cAogICAgKgogICAgc3dhcAogICAgZHVwCiAgICAqCiAgICArCiAgICBzcXJ0CiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDcKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxODAKICAgIC8vIGR5ID0gcG9pbnQueSAtIGxhc3RfcG9pbnQueQogICAgZGlnIDMKICAgIGRpZyA2CiAgICAtCiAgICBiIHRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNAoKdGVzdF9hcnJheV9lbHNlX2JvZHlAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MgogICAgLy8gcG9pbnQgPSBwYXRoW3BvaW50X2lkeF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NgogICAgLy8gZHggPSBwb2ludC54LmFzX3VpbnQ2NCgpIC0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NgogICAgLy8gZHggPSBwb2ludC54LmFzX3VpbnQ2NCgpIC0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnVyeSA3CiAgICBiIHRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9hcnJheV9hZnRlcl9mb3JAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDQKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2V4dGVuZF9mcm9tX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9leHRlbmRfZnJvbV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxNgogICAgc3dhcAogICAgZXh0cmFjdCAxNiAxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MgogICAgLy8gYXJyLmV4dGVuZChzb21lX21vcmUpCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYzCiAgICAvLyBsYXN0ID0gYXJyWy0xXQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgLwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjQKICAgIC8vIGFzc2VydCBsYXN0ID09IHNvbWVfbW9yZVsxXQogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjUKICAgIC8vIHJlc3VsdCA9IGFyci5mcmVlemUoKQogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY2CiAgICAvLyBhc3NlcnQgcmVzdWx0Wy0xXSA9PSBsYXN0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc0CiAgICAvLyBhcnIuZXh0ZW5kKHNvbWVfbW9yZSkKICAgIGR1cAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgc3dhcAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4NwogICAgLy8gYXJyMi5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gbGVuZ3RoICogMiwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkwCiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBsZW4KICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTEKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMgogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTIKICAgIC8vIGlmIHZhbDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTMKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgNQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9jb252ZXJzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2NvbnZlcnNpb246CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTgKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlY18wIC8vIDB4CiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAyCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDMKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICBidXJ5IDgKICAgIGRpZyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNAogICAgLy8gY291bnQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA1CiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPAogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDExCiAgICBkaWcgMgogICAgZGlnIDUKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNgogICAgLy8gaWYgdmFsOgogICAgYnl0ZWNfMCAvLyAweAogICAgYiE9CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA3CiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwOQogICAgLy8gYXJjNF9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgYnl0ZWMgNCAvLyAweDAwMDAKICAgIGRpZyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExMAogICAgLy8gYXJjNF9hcnIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3Quc3VtX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNwogICAgLy8gYXJyLmV4dGVuZChhcmM0X2FycikKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE5CiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIwCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKc3VtX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIwCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBzdW1fYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIGRpZyAzCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjEKICAgIC8vIHRvdGFsICs9IGl0ZW0uYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV9hcnJheV9mb3JfaGVhZGVyQDIKCnN1bV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDMKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5Cb29sKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSkKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NAogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NwogICAgLy8gZHluX2Fyci5leHRlbmQoYXJyKQogICAgbGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NgogICAgLy8gZHluX2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuQm9vbF0oKQogICAgYnl0ZWMgNCAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ3CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ4CiAgICAvLyBhc3NlcnQgZHluX2Fyci5sZW5ndGggPT0gMiwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDkKICAgIC8vIGFzc2VydCBkeW5fYXJyLmJ5dGVzLmxlbmd0aCA9PSAzLCAiZXhwZWN0ZWQgMyBieXRlcyIKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUwCiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MQogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTQtMTU2CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1OQogICAgLy8gYXNzZXJ0IGFycjJbMF0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMCIKICAgIGR1cAogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjAKICAgIC8vIGFzc2VydCBhcnIyWzFdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEiCiAgICBkdXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTYxCiAgICAvLyBhc3NlcnQgYXJyMlsyXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyIgogICAgZHVwCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MgogICAgLy8gYXNzZXJ0IGFycjJbM10gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMyIKICAgIGV4dHJhY3QgMyAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMKICAgIGRpZyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NAogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC54dHJhKCkgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6Cnh0cmE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyNwogICAgLy8gc2VsZi5jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI5CiAgICAvLyBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzEKICAgIC8vIGM9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMyCiAgICAvLyBkPXNlbGYubW9yZSgpLAogICAgY2FsbHN1YiBtb3JlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMwogICAgLy8gZT1CaWdVSW50KHNlbGYuY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjgtMTM0CiAgICAvLyByZXR1cm4gWHRyYSgKICAgIC8vICAgICBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICAvLyAgICAgYj1zZWxmLmNvdW50LAogICAgLy8gICAgIGM9VHhuLnNlbmRlciwKICAgIC8vICAgICBkPXNlbGYubW9yZSgpLAogICAgLy8gICAgIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgY292ZXIgNAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QubW9yZSgpIC0+IGJ5dGVzOgptb3JlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzgKICAgIC8vIHJldHVybiBNb3JlKGZvbz1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICsgMSksIGJhcj1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICogc2VsZi5jb3VudCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/Arrays/immutable.py b/tests/artifacts/Arrays/immutable.py index 3474fd1..6754a4f 100644 --- a/tests/artifacts/Arrays/immutable.py +++ b/tests/artifacts/Arrays/immutable.py @@ -367,28 +367,28 @@ def sum_uints_and_lengths_and_trues( @arc4.abimethod() def test_uint64_return(self, append: UInt64) -> ImmutableArray[UInt64]: - arr = ImmutableArray(UInt64(1), UInt64(2), UInt64(3)) + arr = ImmutableArray((UInt64(1), UInt64(2), UInt64(3))) for i in urange(append): arr = arr.append(i) return arr @arc4.abimethod() def test_bool_return(self, append: UInt64) -> ImmutableArray[bool]: - arr = ImmutableArray(True, False, True, False, True) + arr = ImmutableArray((True, False, True, False, True)) for i in urange(append): arr = arr.append(i % 2 == 0) return arr @arc4.abimethod() def test_tuple_return(self, append: UInt64) -> ImmutableArray[MyTuple]: - arr = ImmutableArray(MyTuple(UInt64(), True, False)) + arr = ImmutableArray((MyTuple(UInt64(), True, False),)) for i in urange(append): arr = arr.append(MyTuple(foo=i, bar=i % 2 == 0, baz=i % 3 == 0)) return arr @arc4.abimethod() def test_dynamic_tuple_return(self, append: UInt64) -> ImmutableArray[MyDynamicSizedTuple]: - arr = ImmutableArray(MyDynamicSizedTuple(UInt64(), String("Hello"))) + arr = ImmutableArray((MyDynamicSizedTuple(UInt64(), String("Hello")),)) for i in urange(append): arr = arr.append(MyDynamicSizedTuple(i, times(i))) return arr @@ -407,7 +407,7 @@ def test_convert_to_array_and_back( def test_concat_with_arc4_tuple( self, arg: arc4.Tuple[arc4.UInt64, arc4.UInt64] ) -> ImmutableArray[arc4.UInt64]: - prefix = ImmutableArray(arc4.UInt64(1), arc4.UInt64(2)) + prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) result = prefix + arg return result @@ -415,7 +415,7 @@ def test_concat_with_arc4_tuple( def test_concat_with_native_tuple( self, arg: tuple[arc4.UInt64, arc4.UInt64] ) -> ImmutableArray[arc4.UInt64]: - prefix = ImmutableArray(arc4.UInt64(1), arc4.UInt64(2)) + prefix = ImmutableArray((arc4.UInt64(1), arc4.UInt64(2))) result = prefix + arg return result @@ -423,7 +423,7 @@ def test_concat_with_native_tuple( def test_dynamic_concat_with_arc4_tuple( self, arg: arc4.Tuple[arc4.String, arc4.String] ) -> ImmutableArray[arc4.String]: - prefix = ImmutableArray(arc4.String("a"), arc4.String("b")) + prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) result = prefix + arg return result @@ -431,7 +431,7 @@ def test_dynamic_concat_with_arc4_tuple( def test_dynamic_concat_with_native_tuple( self, arg: tuple[arc4.String, arc4.String] ) -> ImmutableArray[arc4.String]: - prefix = ImmutableArray(arc4.String("a"), arc4.String("b")) + prefix = ImmutableArray((arc4.String("a"), arc4.String("b"))) result = prefix + arg return result @@ -476,6 +476,96 @@ def test_imm_fixed_arr(self) -> NativeStruct3: return self.imm_fixed_arr +class DynamicArrayInitContract(arc4.ARC4Contract): + @arc4.abimethod() + def test_immutable_array_init(self) -> None: + a1 = ImmutableArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + + a2 = ImmutableArray[UInt64](FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a2.length + assert a1[0] == a2[0] + assert a1[1] == a2[1] + assert a1[2] == a2[2] + + a3 = ImmutableArray[UInt64](ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a3.length == 3 + assert a1[0] == a3[0] + assert a1[1] == a3[1] + assert a1[2] == a3[2] + + a4 = ImmutableArray[UInt64](ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a4.length + assert a1[0] == a4[0] + assert a1[1] == a4[1] + assert a1[2] == a4[2] + + @arc4.abimethod() + def test_immutable_array_init_without_type_generic(self) -> None: + a1 = ImmutableArray((UInt64(1), UInt64(2), UInt64(3))) + + a2 = ImmutableArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a2.length + assert a1[0] == a2[0] + assert a1[1] == a2[1] + assert a1[2] == a2[2] + + a3 = ImmutableArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a3.length == 3 + assert a1[0] == a3[0] + assert a1[1] == a3[1] + assert a1[2] == a3[2] + + a4 = ImmutableArray(ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a4.length + assert a1[0] == a4[0] + assert a1[1] == a4[1] + assert a1[2] == a4[2] + + @arc4.abimethod() + def test_reference_array_init(self) -> None: + a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) + + a2 = ReferenceArray[UInt64](FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a2.length + assert a1[0] == a2[0] + assert a1[1] == a2[1] + assert a1[2] == a2[2] + + a3 = ReferenceArray[UInt64](ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a3.length == 3 + assert a1[0] == a3[0] + assert a1[1] == a3[1] + assert a1[2] == a3[2] + + a4 = ReferenceArray[UInt64](ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a4.length + assert a1[0] == a4[0] + assert a1[1] == a4[1] + assert a1[2] == a4[2] + + @arc4.abimethod() + def test_reference_array_init_without_type_generic(self) -> None: + a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) + + a2 = ReferenceArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a2.length + assert a1[0] == a2[0] + assert a1[1] == a2[1] + assert a1[2] == a2[2] + + a3 = ReferenceArray(ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a3.length == 3 + assert a1[0] == a3[0] + assert a1[1] == a3[1] + assert a1[2] == a3[2] + + a4 = ReferenceArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) + assert a1.length == a4.length + assert a1[0] == a4[0] + assert a1[1] == a4[1] + assert a1[2] == a4[2] + + @subroutine def sum_imm_fixed(arr: NativeStruct3) -> UInt64: total = UInt64(0) diff --git a/tests/artifacts/Arrays/static_size.py b/tests/artifacts/Arrays/static_size.py index c10834b..cf0d01d 100644 --- a/tests/artifacts/Arrays/static_size.py +++ b/tests/artifacts/Arrays/static_size.py @@ -42,9 +42,11 @@ def __init__(self) -> None: def test_array(self, x1: arc4.UInt64, y1: UInt64, x2: arc4.UInt64, y2: UInt64) -> UInt64: self.count = UInt64(0) path = ReferenceArray( - Point(x=arc4.UInt64(), y=UInt64(), other=self.xtra()), - Point(x=x1, y=y1, other=self.xtra()), - Point(x=x2, y=y2, other=self.xtra()), + ( + Point(x=arc4.UInt64(), y=UInt64(), other=self.xtra()), + Point(x=x1, y=y1, other=self.xtra()), + Point(x=x2, y=y2, other=self.xtra()), + ) ) for i in urange(3): assert path[i].other.b == i + 1 diff --git a/tests/artifacts/BoxContract/data/BoxContract.approval.teal b/tests/artifacts/BoxContract/data/BoxContract.approval.teal index fc3aa2c..e5d2fba 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.approval.teal +++ b/tests/artifacts/BoxContract/data/BoxContract.approval.teal @@ -1,24 +1,68 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.BoxContract.contract.BoxContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: - bytecblock 0x6f6361 0x74786e - // tests/artifacts/BoxContract/contract.py:4 + intcblock 1 2 0 8 4096 4098 4138 + bytecblock "box" 0x424f585f43 "blob" "box_large" 0x151f7c75 "box_a" "box_d" "b" "too_many_bools" "many_ints" "0" 0x00023432 0x68656c6c6f 0x6f6361 0x74786e 0x068101 "box_ref" "default" + // tests/artifacts/BoxContract/contract.py:59 // class BoxContract(ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@9 + bz main___algopy_default_create@34 txn OnCompletion ! assert // OnCompletion must be NoOp txn ApplicationID assert - pushbytess 0xf26c6d42 0xef186cf7 // method "store_enums()void", method "read_enums()(uint64,uint64)" + pushbytess 0xf26c6d42 0xef186cf7 0x7d37296e 0xf13dd937 0x33325d3d 0xa6174812 0xfabcb885 0xd566c632 0x04ef4971 0x23ecb32c 0x0199408d 0x772059ca 0x01263df6 0xeef75816 0x996497ae 0x6cec72ff 0x6f9d1075 0x59ef3760 0xaa666b96 0xdfbdd636 0xb532913a 0xc29f1669 0x9c888c09 0xe6f68506 0x8ee2c364 // method "store_enums()void", method "read_enums()(uint64,uint64)", method "set_boxes(uint64,byte[],string)void", method "boxes_exist()(bool,bool,bool,bool)", method "check_keys()void", method "read_boxes()(uint64,byte[],string,uint64)", method "indirect_extract_and_replace()void", method "delete_boxes()void", method "slice_box()void", method "arc4_box()void", method "create_many_ints()void", method "set_many_ints(uint64,uint64)void", method "sum_many_ints()uint64", method "test_box_ref()void", method "set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void", method "nested_write(uint64,uint64)void", method "nested_read(uint64,uint64,uint64)uint64", method "create_bools()void", method "set_bool(uint64,bool)void", method "sum_bools(uint64)uint64", method "box_map_test()void", method "box_map_set(uint64,string)void", method "box_map_get(uint64)string", method "box_map_del(uint64)void", method "box_map_exists(uint64)bool" txna ApplicationArgs 0 - match store_enums read_enums + match store_enums read_enums set_boxes boxes_exist main_check_keys_route@10 read_boxes indirect_extract_and_replace delete_boxes slice_box main_arc4_box_route@15 main_create_many_ints_route@16 set_many_ints sum_many_ints test_box_ref set_nested_struct nested_write nested_read main_create_bools_route@23 set_bool sum_bools box_map_test box_map_set box_map_get box_map_del box_map_exists err -main___algopy_default_create@9: +main_create_bools_route@23: + // tests/artifacts/BoxContract/contract.py:281 + // self.too_many_bools.create() + bytec 8 // "too_many_bools" + pushint 4125 // 4125 + box_create + pop + // tests/artifacts/BoxContract/contract.py:279 + // @arc4.abimethod + intc_0 // 1 + return + +main_create_many_ints_route@16: + // tests/artifacts/BoxContract/contract.py:181 + // self.many_ints.create() + bytec 9 // "many_ints" + pushint 4104 // 4104 + box_create + pop + // tests/artifacts/BoxContract/contract.py:179 + // @arc4.abimethod() + intc_0 // 1 + return + +main_arc4_box_route@15: + // tests/artifacts/BoxContract/contract.py:171-172 + // box_d = Box(StaticInts, key=Bytes(b"d")) + // box_d.value = StaticInts(arc4.UInt8(0), arc4.UInt8(1), arc4.UInt8(2), arc4.UInt8(3)) + pushbytess 0x64 0x00010203 // 0x64, 0x00010203 + // tests/artifacts/BoxContract/contract.py:172 + // box_d.value = StaticInts(arc4.UInt8(0), arc4.UInt8(1), arc4.UInt8(2), arc4.UInt8(3)) + box_put + // tests/artifacts/BoxContract/contract.py:169 + // @arc4.abimethod + intc_0 // 1 + return + +main_check_keys_route@10: + // tests/artifacts/BoxContract/contract.py:125 + // @arc4.abimethod + intc_0 // 1 + return + +main___algopy_default_create@34: txn OnCompletion ! txn ApplicationID @@ -29,31 +73,31 @@ main___algopy_default_create@9: // tests.artifacts.BoxContract.contract.BoxContract.store_enums[routing]() -> void: store_enums: - // tests/artifacts/BoxContract/contract.py:11 + // tests/artifacts/BoxContract/contract.py:75 // self.oca.value = OnCompleteAction.OptIn - pushint 1 // OptIn + intc_0 // OptIn itob - bytec_0 // "oca" + bytec 13 // "oca" swap box_put - // tests/artifacts/BoxContract/contract.py:12 + // tests/artifacts/BoxContract/contract.py:76 // self.txn.value = TransactionType.ApplicationCall pushint 6 // appl itob - bytec_1 // "txn" + bytec 14 // "txn" swap box_put - // tests/artifacts/BoxContract/contract.py:9 + // tests/artifacts/BoxContract/contract.py:73 // @arc4.abimethod() - pushint 1 // 1 + intc_0 // 1 return // tests.artifacts.BoxContract.contract.BoxContract.read_enums[routing]() -> void: read_enums: - // tests/artifacts/BoxContract/contract.py:16 + // tests/artifacts/BoxContract/contract.py:80 // assert op.Box.get(b"oca")[0] == op.itob(self.oca.value) - bytec_0 // 0x6f6361 + bytec 13 // 0x6f6361 box_get assert // check self.oca exists dup @@ -63,9 +107,9 @@ read_enums: dig 1 == assert - // tests/artifacts/BoxContract/contract.py:17 + // tests/artifacts/BoxContract/contract.py:81 // assert op.Box.get(b"txn")[0] == op.itob(self.txn.value) - bytec_1 // 0x74786e + bytec 14 // 0x74786e box_get assert // check self.txn exists dup @@ -75,14 +119,1677 @@ read_enums: dig 1 == assert - // tests/artifacts/BoxContract/contract.py:19 + // tests/artifacts/BoxContract/contract.py:83 // return arc4.Tuple((arc4.UInt64(self.oca.value), arc4.UInt64(self.txn.value))) concat - // tests/artifacts/BoxContract/contract.py:14 + // tests/artifacts/BoxContract/contract.py:78 + // @arc4.abimethod() + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.set_boxes[routing]() -> void: +set_boxes: + // tests/artifacts/BoxContract/contract.py:85 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + txna ApplicationArgs 3 + // tests/artifacts/BoxContract/contract.py:87 + // self.box_a.value = a + uncover 2 + itob + bytec 5 // "box_a" + swap + box_put + // tests/artifacts/BoxContract/contract.py:88 + // self.box_b.value = b.copy() + bytec 7 // "b" + box_del + pop + bytec 7 // "b" + dig 2 + box_put + // tests/artifacts/BoxContract/contract.py:89 + // self.box_c.value = c + bytec_1 // 0x424f585f43 + box_del + pop + bytec_1 // 0x424f585f43 + dig 1 + box_put + // tests/artifacts/BoxContract/contract.py:90 + // self.box_d.value = b.native + dig 1 + extract 2 0 + bytec 6 // "box_d" + box_del + pop + bytec 6 // "box_d" + dig 1 + box_put + // tests/artifacts/BoxContract/contract.py:91 + // self.box_large.create() + bytec_3 // "box_large" + pushint 6160 // 6160 + box_create + pop + // tests/artifacts/BoxContract/contract.py:92 + // self.box_large.value.e = UInt64(42) + pushint 42 // 42 + itob + bytec_3 // "box_large" + intc 4 // 4096 + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:93 + // self.box_large.replace(size_of(Bytes1024) * 4, arc4.UInt64(42).bytes) + bytec_3 // "box_large" + intc 4 // 4096 + pushbytes 0x000000000000002a + box_replace + // tests/artifacts/BoxContract/contract.py:98 + // self.box_a.value += 3 + bytec 5 // "box_a" + box_get + assert // check self.box_a exists + btoi + pushint 3 // 3 + + + itob + bytec 5 // "box_a" + swap + box_put + // tests/artifacts/BoxContract/contract.py:100-101 + // # test .length + // assert self.box_a.length == 8 + bytec 5 // "box_a" + box_len + pop + intc_3 // 8 + == + assert + // tests/artifacts/BoxContract/contract.py:102 + // assert self.box_b.length == b.bytes.length + bytec 7 // "b" + box_len + pop + dig 3 + len + == + assert + // tests/artifacts/BoxContract/contract.py:103 + // assert self.box_c.length == c.bytes.length + bytec_1 // 0x424f585f43 + box_len + assert // check self.box_c exists + dig 2 + len + dup2 + == + assert + // tests/artifacts/BoxContract/contract.py:104 + // assert self.box_d.length == b.native.length + bytec 6 // "box_d" + box_len + pop + dig 3 + len + dup2 + == + assert + // tests/artifacts/BoxContract/contract.py:106-107 + // # test .value.bytes + // assert self.box_c.value.bytes[0] == c.bytes[0] + bytec_1 // 0x424f585f43 + intc_2 // 0 + intc_0 // 1 + box_extract + dig 6 + extract 0 1 + == + assert + // tests/artifacts/BoxContract/contract.py:108 + // assert self.box_c.value.bytes[-1] == c.bytes[-1] + dig 3 + intc_0 // 1 + - + bytec_1 // 0x424f585f43 + swap + intc_0 // 1 + box_extract + dig 3 + intc_0 // 1 + - + dig 7 + swap + intc_0 // 1 + extract3 + == + assert + // tests/artifacts/BoxContract/contract.py:109 + // assert self.box_c.value.bytes[:-1] == c.bytes[:-1] + intc_0 // 1 + dig 4 + < + dig 4 + intc_0 // 1 + uncover 2 + select + dig 4 + swap + - + bytec_1 // 0x424f585f43 + intc_2 // 0 + uncover 2 + box_extract + intc_0 // 1 + dig 4 + >= + intc_0 // 1 + dig 5 + uncover 2 + select + dig 4 + swap + - + dig 7 + intc_2 // 0 + uncover 2 + substring3 + == + assert + // tests/artifacts/BoxContract/contract.py:110 + // assert self.box_c.value.bytes[:2] == c.bytes[:2] + intc_1 // 2 + dig 4 + < + uncover 4 + intc_1 // 2 + uncover 2 + select + bytec_1 // 0x424f585f43 + intc_2 // 0 + uncover 2 + box_extract + intc_1 // 2 + dig 4 + >= + intc_1 // 2 + uncover 5 + uncover 2 + select + uncover 5 + intc_2 // 0 + uncover 2 + substring3 + == + assert + // tests/artifacts/BoxContract/contract.py:112-113 + // # test .value with Bytes type + // assert self.box_d.value[0] == b.native[0] + bytec 6 // "box_d" + intc_2 // 0 + intc_0 // 1 + box_extract + uncover 4 + extract 2 1 + == + assert + // tests/artifacts/BoxContract/contract.py:114 + // assert self.box_d.value[-1] == b.native[-1] + dig 1 + intc_0 // 1 + - + bytec 6 // "box_d" + swap + intc_0 // 1 + box_extract + dig 1 + intc_0 // 1 + - + dig 4 + swap + intc_0 // 1 + extract3 + == + assert + // tests/artifacts/BoxContract/contract.py:115 + // assert self.box_d.value[:-1] == b.native[:-1] + intc_0 // 1 + dig 2 + < + dig 2 + intc_0 // 1 + uncover 2 + select + dig 2 + swap + - + bytec 6 // "box_d" + intc_2 // 0 + uncover 2 + box_extract + intc_0 // 1 + dig 2 + >= + intc_0 // 1 + dig 3 + uncover 2 + select + dig 2 + swap + - + dig 4 + intc_2 // 0 + uncover 2 + substring3 + == + assert + // tests/artifacts/BoxContract/contract.py:116 + // assert self.box_d.value[:5] == b.native[:5] + pushint 5 // 5 + dig 2 + < + dig 2 + pushint 5 // 5 + uncover 2 + select + bytec 6 // "box_d" + intc_2 // 0 + uncover 2 + box_extract + pushint 5 // 5 + dig 2 + >= + pushint 5 // 5 + dig 3 + uncover 2 + select + dig 4 + intc_2 // 0 + uncover 2 + substring3 + == + assert + // tests/artifacts/BoxContract/contract.py:117 + // assert self.box_d.value[: UInt64(2)] == b.native[: UInt64(2)] + intc_1 // 2 + dig 2 + < + uncover 2 + intc_1 // 2 + uncover 2 + select + bytec 6 // "box_d" + intc_2 // 0 + uncover 2 + box_extract + intc_1 // 2 + dig 2 + >= + intc_1 // 2 + uncover 3 + uncover 2 + select + uncover 2 + intc_2 // 0 + uncover 2 + substring3 + == + assert + // tests/artifacts/BoxContract/contract.py:119 + // assert self.box_large.length == size_of(LargeStruct) + bytec_3 // "box_large" + box_len + pop + pushint 6160 // 6160 + == + // tests/artifacts/BoxContract/contract.py:85 + // @arc4.abimethod + return + + +// tests.artifacts.BoxContract.contract.BoxContract.boxes_exist[routing]() -> void: +boxes_exist: + // tests/artifacts/BoxContract/contract.py:123 + // return bool(self.box_a), bool(self.box_b), bool(self.box_c), bool(self.box_large) + bytec 5 // "box_a" + box_len + bury 1 + bytec 7 // "b" + box_len + cover 2 + pop + bytec_1 // 0x424f585f43 + box_len + cover 3 + pop + bytec_3 // "box_large" + box_len + cover 4 + pop + // tests/artifacts/BoxContract/contract.py:121 + // @arc4.abimethod + pushbytes 0x00 + intc_2 // 0 + uncover 2 + setbit + intc_0 // 1 + uncover 2 + setbit + intc_1 // 2 + uncover 2 + setbit + pushint 3 // 3 + uncover 2 + setbit + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.read_boxes[routing]() -> void: +read_boxes: + // tests/artifacts/BoxContract/contract.py:135 + // get_box_value_plus_1(self.box_a) - 1, + bytec 5 // "box_a" + // tests/artifacts/BoxContract/contract.py:345 + // return box.value + 1 + box_get + assert // check Box exists + btoi + intc_0 // 1 + + + // tests/artifacts/BoxContract/contract.py:135 + // get_box_value_plus_1(self.box_a) - 1, + intc_0 // 1 + - + // tests/artifacts/BoxContract/contract.py:136 + // self.box_b.value.native, + bytec 7 // "b" + box_get + assert // check self.box_b exists + extract 2 0 + // tests/artifacts/BoxContract/contract.py:137 + // self.box_c.value, + bytec_1 // 0x424f585f43 + box_get + assert // check self.box_c exists + // tests/artifacts/BoxContract/contract.py:138 + // self.box_large.value.e, + bytec_3 // "box_large" + intc 4 // 4096 + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:132 + // @arc4.abimethod + uncover 3 + itob + dig 3 + len + itob + extract 6 2 + uncover 4 + concat + swap + pushbytes 0x0014 + concat + dig 1 + len + pushint 20 // 20 + + + itob + extract 6 2 + concat + uncover 2 + itob + concat + swap + concat + swap + concat + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.indirect_extract_and_replace[routing]() -> void: +indirect_extract_and_replace: + // tests/artifacts/BoxContract/contract.py:143 + // large = self.box_large.value.copy() + bytec_3 // "box_large" + // tests/artifacts/BoxContract/contract.py:143-144 + // large = self.box_large.value.copy() + // large.e += 1 + intc 4 // 4096 + intc_3 // 8 + box_extract + // tests/artifacts/BoxContract/contract.py:144 + // large.e += 1 + btoi + intc_0 // 1 + + + itob + // tests/artifacts/BoxContract/contract.py:145 + // self.box_large.value = large.copy() + bytec_3 // "box_large" + // tests/artifacts/BoxContract/contract.py:143-145 + // large = self.box_large.value.copy() + // large.e += 1 + // self.box_large.value = large.copy() + intc 4 // 4096 + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:141 + // @arc4.abimethod() + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.delete_boxes[routing]() -> void: +delete_boxes: + // tests/artifacts/BoxContract/contract.py:149 + // del self.box_a.value + bytec 5 // "box_a" + box_del + pop + // tests/artifacts/BoxContract/contract.py:150 + // del self.box_b.value + bytec 7 // "b" + box_del + pop + // tests/artifacts/BoxContract/contract.py:151 + // del self.box_c.value + bytec_1 // 0x424f585f43 + box_del + pop + // tests/artifacts/BoxContract/contract.py:152 + // assert self.box_a.get(default=UInt64(42)) == 42 + bytec 5 // "box_a" + box_get + swap + btoi + pushint 42 // 42 + dig 1 + dig 3 + select + pushint 42 // 42 + == + assert + // tests/artifacts/BoxContract/contract.py:153 + // assert self.box_b.get(default=arc4.DynamicBytes(b"42")).native == b"42" + bytec 7 // "b" + box_get + bytec 11 // 0x00023432 + cover 2 + select + extract 2 0 + pushbytes 0x3432 + == + assert + // tests/artifacts/BoxContract/contract.py:154 + // assert self.box_c.get(default=arc4.String("42")) == "42" + bytec_1 // 0x424f585f43 + box_get + bytec 11 // 0x00023432 + cover 2 + select + bytec 11 // 0x00023432 + == + assert + // tests/artifacts/BoxContract/contract.py:156 + // assert not a_exists + swap + ! + assert + // tests/artifacts/BoxContract/contract.py:157 + // assert a == 0 + ! + assert + // tests/artifacts/BoxContract/contract.py:158 + // del self.box_large.value + bytec_3 // "box_large" + box_del + pop + // tests/artifacts/BoxContract/contract.py:147 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.slice_box[routing]() -> void: +slice_box: + // tests/artifacts/BoxContract/contract.py:162 + // box_0 = Box(Bytes, key=String("0")) + bytec 10 // "0" + // tests/artifacts/BoxContract/contract.py:163 + // box_0.value = Bytes(b"Testing testing 123") + box_del + pop + // tests/artifacts/BoxContract/contract.py:162 + // box_0 = Box(Bytes, key=String("0")) + bytec 10 // "0" + // tests/artifacts/BoxContract/contract.py:163 + // box_0.value = Bytes(b"Testing testing 123") + pushbytes 0x54657374696e672074657374696e6720313233 + box_put + // tests/artifacts/BoxContract/contract.py:162 + // box_0 = Box(Bytes, key=String("0")) + bytec 10 // "0" + // tests/artifacts/BoxContract/contract.py:164 + // assert box_0.value[0:7] == b"Testing" + box_len + pop + dup + intc_2 // 0 + dig 2 + select + pushint 7 // 7 + dig 2 + < + uncover 2 + pushint 7 // 7 + uncover 2 + select + dig 1 + - + // tests/artifacts/BoxContract/contract.py:162 + // box_0 = Box(Bytes, key=String("0")) + bytec 10 // "0" + // tests/artifacts/BoxContract/contract.py:164 + // assert box_0.value[0:7] == b"Testing" + cover 2 + box_extract + pushbytes 0x54657374696e67 + == + assert + // tests/artifacts/BoxContract/contract.py:166 + // self.box_c.value = arc4.String("Hello") + bytec_1 // 0x424f585f43 + box_del + pop + bytec_1 // 0x424f585f43 + pushbytes 0x000548656c6c6f + box_put + // tests/artifacts/BoxContract/contract.py:167 + // assert self.box_c.value.bytes[2:10] == b"Hello" + bytec_1 // 0x424f585f43 + box_len + pop + intc_1 // 2 + dig 1 + < + dig 1 + intc_1 // 2 + uncover 2 + select + pushint 10 // 10 + dig 2 + < + uncover 2 + pushint 10 // 10 + uncover 2 + select + dig 1 + - + bytec_1 // 0x424f585f43 + cover 2 + box_extract + pushbytes 0x48656c6c6f + == + // tests/artifacts/BoxContract/contract.py:160 + // @arc4.abimethod + return + + +// tests.artifacts.BoxContract.contract.BoxContract.set_many_ints[routing]() -> void: +set_many_ints: + // tests/artifacts/BoxContract/contract.py:183 + // @arc4.abimethod() + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + // tests/artifacts/BoxContract/contract.py:185 + // self.many_ints.value[index] = value + swap + intc_3 // 8 + * + bytec 9 // "many_ints" + swap + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:183 + // @arc4.abimethod() + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.sum_many_ints[routing]() -> void: +sum_many_ints: + pushbytes "" + dup + +sum_many_ints_while_top@7: + pushint 10510 // 10510 + global OpcodeBudget + > + bz sum_many_ints_after_while@12 + itxn_begin + pushint 6 // appl + itxn_field TypeEnum + pushint 5 // DeleteApplication + itxn_field OnCompletion + bytec 15 // 0x068101 + itxn_field ApprovalProgram + bytec 15 // 0x068101 + itxn_field ClearStateProgram + intc_2 // 0 + itxn_field Fee + itxn_submit + b sum_many_ints_while_top@7 + +sum_many_ints_after_while@12: + // tests/artifacts/BoxContract/contract.py:190 + // total = UInt64(0) + intc_2 // 0 + bury 1 + // tests/artifacts/BoxContract/contract.py:191 + // for val in self.many_ints.value: + bytec 9 // "many_ints" + box_len + bury 1 + assert // check self.many_ints exists + intc_2 // 0 + bury 2 + +sum_many_ints_for_header@2: + // tests/artifacts/BoxContract/contract.py:191 + // for val in self.many_ints.value: + dig 1 + pushint 513 // 513 + < + bz sum_many_ints_after_for@5 + dig 1 + dup + intc_3 // 8 + * + bytec 9 // "many_ints" + swap + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:192 + // total = total + val + dig 2 + + + bury 2 + intc_0 // 1 + + + bury 2 + b sum_many_ints_for_header@2 + +sum_many_ints_after_for@5: + // tests/artifacts/BoxContract/contract.py:187 + // @arc4.abimethod() + dup + itob + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.test_box_ref[routing]() -> void: +test_box_ref: + // tests/artifacts/BoxContract/contract.py:197-198 + // # init ref, with valid key types + // box_ref = Box(Bytes, key="blob") + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:199 + // assert not box_ref, "no data" + box_len + bury 1 + ! + assert // no data + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:207-208 + // # create + // assert box_ref.create(size=UInt64(32)) + pushint 32 // 32 + box_create + assert + // tests/artifacts/BoxContract/contract.py:211-212 + // # manipulate data + // sender_bytes = Txn.sender.bytes + txn Sender + // tests/artifacts/BoxContract/contract.py:213 + // app_address = Global.current_application_address.bytes + global CurrentApplicationAddress + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:215 + // box_ref.replace(0, sender_bytes) + intc_2 // 0 + dig 3 + box_replace + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:216 + // box_ref.resize(8000) + pushint 8000 // 8000 + box_resize + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:217 + // box_ref.splice(0, 0, app_address) + intc_2 // 0 + dup + dig 3 + box_splice + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:218 + // box_ref.replace(64, value_3) + pushint 64 // 64 + // tests/artifacts/BoxContract/contract.py:214 + // value_3 = Bytes(b"hello") + bytec 12 // 0x68656c6c6f + // tests/artifacts/BoxContract/contract.py:218 + // box_ref.replace(64, value_3) + box_replace + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:219 + // prefix = box_ref.extract(0, 32 * 2 + value_3.length) + intc_2 // 0 + pushint 69 // 69 + box_extract + // tests/artifacts/BoxContract/contract.py:220 + // assert prefix == app_address + sender_bytes + value_3 + dig 1 + dig 3 + concat + // tests/artifacts/BoxContract/contract.py:214 + // value_3 = Bytes(b"hello") + bytec 12 // 0x68656c6c6f + // tests/artifacts/BoxContract/contract.py:220 + // assert prefix == app_address + sender_bytes + value_3 + concat + == + assert + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:222-223 + // # delete + // del box_ref.value + box_del + pop + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:226-227 + // # query + // value, exists = box_ref.maybe() + box_get + // tests/artifacts/BoxContract/contract.py:228 + // assert not exists + dup + ! + assert + // tests/artifacts/BoxContract/contract.py:229 + // assert value == b"" + dig 1 + pushbytes 0x + == + assert + // tests/artifacts/BoxContract/contract.py:230 + // assert box_ref.get(default=sender_bytes) == sender_bytes + dig 3 + cover 2 + select + dig 2 + == + assert + // tests/artifacts/BoxContract/contract.py:232-233 + // # update + // box_ref.value = sender_bytes + app_address + concat + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:232-233 + // # update + // box_ref.value = sender_bytes + app_address + box_del + pop + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:232-233 + // # update + // box_ref.value = sender_bytes + app_address + swap + box_put + // tests/artifacts/BoxContract/contract.py:204 + // box_ref = Box(Bytes, key=String("blob")) + bytec_2 // "blob" + // tests/artifacts/BoxContract/contract.py:234 + // assert box_ref, "Blob exists" + box_len + pop + // tests/artifacts/BoxContract/contract.py:235 + // assert box_ref.length == 64 + pushint 64 // 64 + == + assert + // tests/artifacts/BoxContract/contract.py:238-239 + // # instance box ref + // self.box_ref.create(size=UInt64(32)) + bytec 16 // "box_ref" + pushint 32 // 32 + box_create + pop + // tests/artifacts/BoxContract/contract.py:241 + // del self.box_ref.value + bytec 16 // "box_ref" + box_del + pop + // tests/artifacts/BoxContract/contract.py:195 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.set_nested_struct[routing]() -> void: +set_nested_struct: + // tests/artifacts/BoxContract/contract.py:243 + // @arc4.abimethod() + txna ApplicationArgs 1 + // tests/artifacts/BoxContract/contract.py:246 + // assert struct.a, "struct.a is truthy" + intc_2 // 0 + extract_uint64 + assert // struct.a is truthy + // tests/artifacts/BoxContract/contract.py:247 + // struct_bytes = Txn.application_args(1) + txna ApplicationArgs 1 + // tests/artifacts/BoxContract/contract.py:248 + // struct_size = struct_bytes.length + dup + len + // tests/artifacts/BoxContract/contract.py:249 + // tail_offset = UInt64(4096 + 2) + intc 5 // 4098 + // tests/artifacts/BoxContract/contract.py:250-251 + // # initialize box to zero + // box.create(size=tail_offset + struct_size) + + + // tests/artifacts/BoxContract/contract.py:245 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:250-251 + // # initialize box to zero + // box.create(size=tail_offset + struct_size) + swap + box_create + pop + // tests/artifacts/BoxContract/contract.py:245 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:252-253 + // # set correct offset for dynamic portion + // box.replace(tail_offset - 2, arc4.UInt16(tail_offset).bytes) + intc 4 // 4096 + pushbytes 0x1002 + box_replace + // tests/artifacts/BoxContract/contract.py:245 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:249 + // tail_offset = UInt64(4096 + 2) + intc 5 // 4098 + // tests/artifacts/BoxContract/contract.py:254-255 + // # set dynamic data + // box.replace(tail_offset, struct_bytes) + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:243 + // @arc4.abimethod() + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.nested_write[routing]() -> void: +nested_write: + // tests/artifacts/BoxContract/contract.py:257 + // @arc4.abimethod() + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + dup + btoi + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:260 + // box.value.nested.a = value + intc 5 // 4098 + uncover 3 + box_replace + // tests/artifacts/BoxContract/contract.py:261 + // box.value.nested.b = value + 1 + dup + intc_0 // 1 + + + itob + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:261 + // box.value.nested.b = value + 1 + pushint 4110 // 4110 + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:262 + // box.value.nested.inner.arr_arr[index][index] = value + 2 + dup + intc_1 // 2 + + + itob + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:262 + // box.value.nested.inner.arr_arr[index][index] = value + 2 + pushint 4136 // 4136 + intc_1 // 2 + box_extract + btoi + dig 3 + > + assert // index out of bounds + intc_1 // 2 + dig 3 + * + intc 6 // 4138 + dig 1 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:262 + // box.value.nested.inner.arr_arr[index][index] = value + 2 + swap + intc_1 // 2 + box_extract + btoi + intc 6 // 4138 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:262 + // box.value.nested.inner.arr_arr[index][index] = value + 2 + dig 1 + intc_1 // 2 + box_extract + btoi + dig 5 + > + assert // index out of bounds + intc_1 // 2 + + + dig 4 + intc_3 // 8 + * + swap + dig 1 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:262 + // box.value.nested.inner.arr_arr[index][index] = value + 2 + swap + uncover 4 + box_replace + // tests/artifacts/BoxContract/contract.py:263 + // box.value.nested.inner.c = value + 3 + dig 2 + pushint 3 // 3 + + + itob + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:263 + // box.value.nested.inner.c = value + 3 + pushint 4118 // 4118 + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:264 + // box.value.nested.inner.d = value + 4 + dig 2 + pushint 4 // 4 + + + itob + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:264 + // box.value.nested.inner.d = value + 4 + pushint 4128 // 4128 + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + uncover 2 + pushint 5 // 5 + + + itob + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + pushint 4108 // 4108 + intc_1 // 2 + box_extract + btoi + intc 5 // 4098 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + dig 1 + intc_1 // 2 + box_extract + btoi + dig 5 + > + assert // index out of bounds + intc_1 // 2 + + + dup + dig 4 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + swap + intc_1 // 2 + box_extract + btoi + + + pushint 18 // 18 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + dig 1 + intc_1 // 2 + box_extract + btoi + dig 5 + > + assert // index out of bounds + intc_1 // 2 + + + dup + uncover 4 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + swap + intc_1 // 2 + box_extract + btoi + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + dig 1 + intc_1 // 2 + box_extract + btoi + uncover 4 + > + assert // index out of bounds + intc_1 // 2 + + + uncover 2 + + + // tests/artifacts/BoxContract/contract.py:259 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:265 + // box.value.nested.woah[index].arr_arr[index][index] = value + 5 + swap + uncover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:257 + // @arc4.abimethod() + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.nested_read[routing]() -> void: +nested_read: + // tests/artifacts/BoxContract/contract.py:267 + // @arc4.abimethod() + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + btoi + txna ApplicationArgs 3 + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:270 + // a = box.value.nested.a + intc 5 // 4098 + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:271 + // b = box.value.nested.b + pushint 4110 // 4110 + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:272 + // arr_arr = box.value.nested.inner.arr_arr[i1][i2] + pushint 4136 // 4136 + intc_1 // 2 + box_extract + btoi + dig 5 + > + assert // index out of bounds + intc_1 // 2 + dig 5 + * + intc 6 // 4138 + dig 1 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:272 + // arr_arr = box.value.nested.inner.arr_arr[i1][i2] + swap + intc_1 // 2 + box_extract + btoi + intc 6 // 4138 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:272 + // arr_arr = box.value.nested.inner.arr_arr[i1][i2] + dig 1 + intc_1 // 2 + box_extract + btoi + dig 6 + > + assert // index out of bounds + intc_1 // 2 + + + dig 5 + intc_3 // 8 + * + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:272 + // arr_arr = box.value.nested.inner.arr_arr[i1][i2] + swap + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:273 + // c = box.value.nested.inner.c + pushint 4118 // 4118 + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:274 + // d = box.value.nested.inner.d + pushint 4128 // 4128 + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + pushint 4108 // 4108 + intc_1 // 2 + box_extract + btoi + intc 5 // 4098 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + dig 1 + intc_1 // 2 + box_extract + btoi + uncover 10 + > + assert // index out of bounds + intc_1 // 2 + + + dup + uncover 5 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + swap + intc_1 // 2 + box_extract + btoi + + + pushint 18 // 18 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + dig 1 + intc_1 // 2 + box_extract + btoi + dig 8 + > + assert // index out of bounds + intc_1 // 2 + + + intc_1 // 2 + uncover 8 + * + dig 1 + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + swap + intc_1 // 2 + box_extract + btoi + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + dig 1 + intc_1 // 2 + box_extract + btoi + dig 7 + > + assert // index out of bounds + intc_1 // 2 + + + uncover 6 + intc_3 // 8 + * + + + // tests/artifacts/BoxContract/contract.py:269 + // box = Box(LargeNestedStruct, key="box") + bytec_0 // "box" + // tests/artifacts/BoxContract/contract.py:275 + // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] + swap + intc_3 // 8 + box_extract + btoi + // tests/artifacts/BoxContract/contract.py:277 + // return a + b + arr_arr + c + d + woah_arr_arr + uncover 5 + uncover 5 + + + uncover 4 + + + uncover 3 + + + uncover 2 + + + + + // tests/artifacts/BoxContract/contract.py:267 + // @arc4.abimethod() + itob + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.set_bool[routing]() -> void: +set_bool: + // tests/artifacts/BoxContract/contract.py:283 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + intc_2 // 0 + getbit + // tests/artifacts/BoxContract/contract.py:285 + // self.too_many_bools.value[index] = value + dig 1 + intc_3 // 8 + / + uncover 2 + intc_3 // 8 + % + bytec 8 // "too_many_bools" + dig 2 + intc_0 // 1 + box_extract + dig 1 + intc_3 // 8 + < + assert // index access is out of bounds + swap + uncover 3 + setbit + bytec 8 // "too_many_bools" + cover 2 + box_replace + // tests/artifacts/BoxContract/contract.py:283 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.sum_bools[routing]() -> void: +sum_bools: + // tests/artifacts/BoxContract/contract.py:287 // @arc4.abimethod() - pushbytes 0x151f7c75 + txna ApplicationArgs 1 + btoi + // tests/artifacts/BoxContract/contract.py:289 + // total = UInt64() + intc_2 // 0 + // tests/artifacts/BoxContract/contract.py:290 + // for value in self.too_many_bools.value: + bytec 8 // "too_many_bools" + box_len + bury 1 + assert // check self.too_many_bools exists + intc_2 // 0 + +sum_bools_for_header@2: + // tests/artifacts/BoxContract/contract.py:290 + // for value in self.too_many_bools.value: + dup + pushint 33000 // 33000 + < + bz sum_bools_after_for@9 + dupn 2 + intc_3 // 8 + / + swap + intc_3 // 8 + % + bytec 8 // "too_many_bools" + uncover 2 + intc_0 // 1 + box_extract + swap + getbit + // tests/artifacts/BoxContract/contract.py:291 + // if value: + bz sum_bools_after_if_else@5 + // tests/artifacts/BoxContract/contract.py:292 + // total += 1 + dig 1 + intc_0 // 1 + + + bury 2 + +sum_bools_after_if_else@5: + // tests/artifacts/BoxContract/contract.py:293 + // if total == stop_at_total: + dig 1 + dig 3 + == + bnz sum_bools_after_for@9 + dup + intc_0 // 1 + + + bury 1 + b sum_bools_for_header@2 + +sum_bools_after_for@9: + // tests/artifacts/BoxContract/contract.py:287 + // @arc4.abimethod() + dig 1 + itob + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.box_map_test[routing]() -> void: +box_map_test: + // tests/artifacts/BoxContract/contract.py:299 + // key_0 = UInt64(0) + intc_2 // 0 + // tests/artifacts/BoxContract/contract.py:302 + // self.box_map[key_0] = value + itob + dup + box_del + pop + dup + // tests/artifacts/BoxContract/contract.py:301 + // value = String("Hmmmmm") + pushbytes "Hmmmmm" + // tests/artifacts/BoxContract/contract.py:302 + // self.box_map[key_0] = value + box_put + // tests/artifacts/BoxContract/contract.py:305 + // assert self.box_map[key_0].bytes.length == value.bytes.length + box_len + pop + pushint 6 // 6 + == + assert + // tests/artifacts/BoxContract/contract.py:300 + // key_1 = UInt64(1) + intc_0 // 1 + // tests/artifacts/BoxContract/contract.py:309 + // assert self.box_map.get(key_1, default=String("default")) == String("default") + itob + dup + box_get + bytec 17 // "default" + cover 2 + select + bytec 17 // "default" + == + assert + // tests/artifacts/BoxContract/contract.py:310 + // value, exists = self.box_map.maybe(key_1) + dup + box_len + bury 1 + // tests/artifacts/BoxContract/contract.py:311 + // assert not exists + ! + assert + // tests/artifacts/BoxContract/contract.py:317 + // tmp_box_map[key_1] = String("hello") + dup + box_del + pop + dup + bytec 12 // "hello" + box_put + // tests/artifacts/BoxContract/contract.py:319 + // del tmp_box_map[key_1] + box_del + pop + // tests/artifacts/BoxContract/contract.py:297 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.box_map_set[routing]() -> void: +box_map_set: + // tests/artifacts/BoxContract/contract.py:321 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + extract 2 0 + // tests/artifacts/BoxContract/contract.py:323 + // self.box_map[key] = value + swap + itob + dup + box_del + pop + swap + box_put + // tests/artifacts/BoxContract/contract.py:321 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.box_map_get[routing]() -> void: +box_map_get: + // tests/artifacts/BoxContract/contract.py:325 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + // tests/artifacts/BoxContract/contract.py:327 + // return self.box_map[key] + itob + box_get + assert // check self.box_map entry exists + // tests/artifacts/BoxContract/contract.py:325 + // @arc4.abimethod + dup + len + itob + extract 6 2 + swap + concat + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.box_map_del[routing]() -> void: +box_map_del: + // tests/artifacts/BoxContract/contract.py:329 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + // tests/artifacts/BoxContract/contract.py:331 + // del self.box_map[key] + itob + box_del + pop + // tests/artifacts/BoxContract/contract.py:329 + // @arc4.abimethod + intc_0 // 1 + return + + +// tests.artifacts.BoxContract.contract.BoxContract.box_map_exists[routing]() -> void: +box_map_exists: + // tests/artifacts/BoxContract/contract.py:333 + // @arc4.abimethod + txna ApplicationArgs 1 + btoi + // tests/artifacts/BoxContract/contract.py:335 + // return key in self.box_map + itob + box_len + bury 1 + // tests/artifacts/BoxContract/contract.py:333 + // @arc4.abimethod + pushbytes 0x00 + intc_2 // 0 + uncover 2 + setbit + bytec 4 // 0x151f7c75 swap concat log - pushint 1 // 1 + intc_0 // 1 return diff --git a/tests/artifacts/BoxContract/data/BoxContract.arc56.json b/tests/artifacts/BoxContract/data/BoxContract.arc56.json index 52a5d47..14f5776 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.arc56.json +++ b/tests/artifacts/BoxContract/data/BoxContract.arc56.json @@ -1,6 +1,73 @@ { "name": "BoxContract", - "structs": {}, + "structs": { + "InnerStruct": [ + { + "name": "c", + "type": "uint64" + }, + { + "name": "arr_arr", + "type": "uint64[][]" + }, + { + "name": "d", + "type": "uint64" + } + ], + "LargeStruct": [ + { + "name": "a", + "type": "byte[1024]" + }, + { + "name": "b", + "type": "byte[1024]" + }, + { + "name": "c", + "type": "byte[1024]" + }, + { + "name": "d", + "type": "byte[1024]" + }, + { + "name": "e", + "type": "uint64" + }, + { + "name": "f", + "type": "byte[1024]" + }, + { + "name": "g", + "type": "byte[1024]" + }, + { + "name": "h", + "type": "uint64" + } + ], + "NestedStruct": [ + { + "name": "a", + "type": "uint64" + }, + { + "name": "inner", + "type": "InnerStruct" + }, + { + "name": "woah", + "type": "(uint64,uint64[][],uint64)[]" + }, + { + "name": "b", + "type": "uint64" + } + ] + }, "methods": [ { "name": "store_enums", @@ -33,6 +100,462 @@ "readonly": false, "events": [], "recommendations": {} + }, + { + "name": "set_boxes", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "string", + "name": "c" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "boxes_exist", + "args": [], + "returns": { + "type": "(bool,bool,bool,bool)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "check_keys", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "read_boxes", + "args": [], + "returns": { + "type": "(uint64,byte[],string,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "indirect_extract_and_replace", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete_boxes", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "slice_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "arc4_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create_many_ints", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_many_ints", + "args": [ + { + "type": "uint64", + "name": "index" + }, + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "sum_many_ints", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_box_ref", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_nested_struct", + "args": [ + { + "type": "(uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64)", + "struct": "NestedStruct", + "name": "struct" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "nested_write", + "args": [ + { + "type": "uint64", + "name": "index" + }, + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "nested_read", + "args": [ + { + "type": "uint64", + "name": "i1" + }, + { + "type": "uint64", + "name": "i2" + }, + { + "type": "uint64", + "name": "i3" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create_bools", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_bool", + "args": [ + { + "type": "uint64", + "name": "index" + }, + { + "type": "bool", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "sum_bools", + "args": [ + { + "type": "uint64", + "name": "stop_at_total" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_test", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_set", + "args": [ + { + "type": "uint64", + "name": "key" + }, + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_get", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_del", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_exists", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} } ], "arcs": [ @@ -64,13 +587,59 @@ "keyType": "AVMString", "valueType": "uint64", "key": "dHhu" + }, + "box_a": { + "keyType": "AVMString", + "valueType": "uint64", + "key": "Ym94X2E=" + }, + "box_b": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "Yg==" + }, + "box_c": { + "keyType": "AVMBytes", + "valueType": "string", + "key": "Qk9YX0M=" + }, + "box_d": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X2Q=" + }, + "many_ints": { + "keyType": "AVMString", + "valueType": "uint64[513]", + "key": "bWFueV9pbnRz" + }, + "box_ref": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X3JlZg==" + }, + "box_large": { + "keyType": "AVMString", + "valueType": "LargeStruct", + "key": "Ym94X2xhcmdl" + }, + "too_many_bools": { + "keyType": "AVMString", + "valueType": "bool[33000]", + "key": "dG9vX21hbnlfYm9vbHM=" } } }, "maps": { "global": {}, "local": {}, - "box": {} + "box": { + "box_map": { + "keyType": "uint64", + "valueType": "AVMString", + "prefix": "" + } + } } }, "bareActions": { @@ -84,27 +653,103 @@ "sourceInfo": [ { "pc": [ - 19 + 133 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ - 52 + 359 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ - 70 + 840 + ], + "errorMessage": "check Box exists" + }, + { + "pc": [ + 486 + ], + "errorMessage": "check self.box_a exists" + }, + { + "pc": [ + 849 + ], + "errorMessage": "check self.box_b exists" + }, + { + "pc": [ + 514, + 855 + ], + "errorMessage": "check self.box_c exists" + }, + { + "pc": [ + 1928 + ], + "errorMessage": "check self.box_map entry exists" + }, + { + "pc": [ + 1174 + ], + "errorMessage": "check self.many_ints exists" + }, + { + "pc": [ + 378 ], "errorMessage": "check self.oca exists" }, { "pc": [ - 81 + 1791 + ], + "errorMessage": "check self.too_many_bools exists" + }, + { + "pc": [ + 390 ], "errorMessage": "check self.txn exists" + }, + { + "pc": [ + 1769 + ], + "errorMessage": "index access is out of bounds" + }, + { + "pc": [ + 1394, + 1421, + 1488, + 1513, + 1535, + 1583, + 1610, + 1656, + 1681, + 1706 + ], + "errorMessage": "index out of bounds" + }, + { + "pc": [ + 1224 + ], + "errorMessage": "no data" + }, + { + "pc": [ + 1325 + ], + "errorMessage": "struct.a is truthy" } ], "pcOffsetMethod": "none" @@ -115,11 +760,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICBieXRlY2Jsb2NrIDB4NmY2MzYxIDB4NzQ3ODZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZjI2YzZkNDIgMHhlZjE4NmNmNyAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBzdG9yZV9lbnVtcyByZWFkX2VudW1zCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAib2NhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBzZWxmLnR4bi52YWx1ZSA9IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdG9iCiAgICBieXRlY18xIC8vICJ0eG4iCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjXzAgLy8gMHg2ZjYzNjEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9jYSBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQoYiJ0eG4iKVswXSA9PSBvcC5pdG9iKHNlbGYudHhuLnZhbHVlKQogICAgYnl0ZWNfMSAvLyAweDc0Nzg2ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHhuIGV4aXN0cwogICAgZHVwCiAgICBidG9pCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgoYXJjNC5VSW50NjQoc2VsZi5vY2EudmFsdWUpLCBhcmM0LlVJbnQ2NChzZWxmLnR4bi52YWx1ZSkpKQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYyNmM2ZDQyIDB4ZWYxODZjZjcgMHg3ZDM3Mjk2ZSAweGYxM2RkOTM3IDB4MzMzMjVkM2QgMHhhNjE3NDgxMiAweGZhYmNiODg1IDB4ZDU2NmM2MzIgMHgwNGVmNDk3MSAweDIzZWNiMzJjIDB4MDE5OTQwOGQgMHg3NzIwNTljYSAweDAxMjYzZGY2IDB4ZWVmNzU4MTYgMHg5OTY0OTdhZSAweDZjZWM3MmZmIDB4NmY5ZDEwNzUgMHg1OWVmMzc2MCAweGFhNjY2Yjk2IDB4ZGZiZGQ2MzYgMHhiNTMyOTEzYSAweGMyOWYxNjY5IDB4OWM4ODhjMDkgMHhlNmY2ODUwNiAweDhlZTJjMzY0IC8vIG1ldGhvZCAic3RvcmVfZW51bXMoKXZvaWQiLCBtZXRob2QgInJlYWRfZW51bXMoKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAic2V0X2JveGVzKHVpbnQ2NCxieXRlW10sc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveGVzX2V4aXN0KCkoYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgImNoZWNrX2tleXMoKXZvaWQiLCBtZXRob2QgInJlYWRfYm94ZXMoKSh1aW50NjQsYnl0ZVtdLHN0cmluZyx1aW50NjQpIiwgbWV0aG9kICJpbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlKCl2b2lkIiwgbWV0aG9kICJkZWxldGVfYm94ZXMoKXZvaWQiLCBtZXRob2QgInNsaWNlX2JveCgpdm9pZCIsIG1ldGhvZCAiYXJjNF9ib3goKXZvaWQiLCBtZXRob2QgImNyZWF0ZV9tYW55X2ludHMoKXZvaWQiLCBtZXRob2QgInNldF9tYW55X2ludHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdW1fbWFueV9pbnRzKCl1aW50NjQiLCBtZXRob2QgInRlc3RfYm94X3JlZigpdm9pZCIsIG1ldGhvZCAic2V0X25lc3RlZF9zdHJ1Y3QoKHVpbnQ2NCwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KSwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KVtdLHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3dyaXRlKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3JlYWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJjcmVhdGVfYm9vbHMoKXZvaWQiLCBtZXRob2QgInNldF9ib29sKHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgInN1bV9ib29scyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc3RvcmVfZW51bXMgcmVhZF9lbnVtcyBzZXRfYm94ZXMgYm94ZXNfZXhpc3QgbWFpbl9jaGVja19rZXlzX3JvdXRlQDEwIHJlYWRfYm94ZXMgaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSBkZWxldGVfYm94ZXMgc2xpY2VfYm94IG1haW5fYXJjNF9ib3hfcm91dGVAMTUgbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2IHNldF9tYW55X2ludHMgc3VtX21hbnlfaW50cyB0ZXN0X2JveF9yZWYgc2V0X25lc3RlZF9zdHJ1Y3QgbmVzdGVkX3dyaXRlIG5lc3RlZF9yZWFkIG1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzIHNldF9ib29sIHN1bV9ib29scyBib3hfbWFwX3Rlc3QgYm94X21hcF9zZXQgYm94X21hcF9nZXQgYm94X21hcF9kZWwgYm94X21hcF9leGlzdHMKICAgIGVycgoKbWFpbl9jcmVhdGVfYm9vbHNfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLmNyZWF0ZSgpCiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIHB1c2hpbnQgNDEyNSAvLyA0MTI1CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5tYW55X2ludHMuY3JlYXRlKCkKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHB1c2hpbnQgNDEwNCAvLyA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMgLy8gMHg2NCwgMHgwMDAxMDIwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYm94X2QudmFsdWUgPSBTdGF0aWNJbnRzKGFyYzQuVUludDgoMCksIGFyYzQuVUludDgoMSksIGFyYzQuVUludDgoMiksIGFyYzQuVUludDgoMykpCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAgLy8gNjE2MAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlLmUgPSBVSW50NjQoNDIpCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLmJveF9sYXJnZS5yZXBsYWNlKHNpemVfb2YoQnl0ZXMxMDI0KSAqIDQsIGFyYzQuVUludDY0KDQyKS5ieXRlcykKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlICs9IDMKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gIyB0ZXN0IC5sZW5ndGgKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmxlbmd0aCA9PSA4CiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9sZW4KICAgIHBvcAogICAgZGlnIDMKICAgIGxlbgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MubGVuZ3RoID09IGMuYnl0ZXMubGVuZ3RoCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2MgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC5sZW5ndGggPT0gYi5uYXRpdmUubGVuZ3RoCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGJveF9sZW4KICAgIHBvcAogICAgZGlnIDMKICAgIGxlbgogICAgZHVwMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwNi0xMDcKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgNgogICAgZXh0cmFjdCAwIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDgKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWy0xXSA9PSBjLmJ5dGVzWy0xXQogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA3CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzotMV0gPT0gYy5ieXRlc1s6LTFdCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDQKICAgIDwKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBzd2FwCiAgICAtCiAgICBkaWcgNwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOjJdID09IGMuYnl0ZXNbOjJdCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIHVuY292ZXIgNAogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPj0KICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDUKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyAjIHRlc3QgLnZhbHVlIHdpdGggQnl0ZXMgdHlwZQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbMF0gPT0gYi5uYXRpdmVbMF0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciA0CiAgICBleHRyYWN0IDIgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbLTFdID09IGIubmF0aXZlWy0xXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkaWcgNAogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGV4dHJhY3QzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOjVdID09IGIubmF0aXZlWzo1XQogICAgcHVzaGludCA1IC8vIDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1IC8vIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDIKICAgID49CiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAgLy8gNjE2MAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94ZXNfZXhpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpib3hlc19leGlzdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjMKICAgIC8vIHJldHVybiBib29sKHNlbGYuYm94X2EpLCBib29sKHNlbGYuYm94X2IpLCBib29sKHNlbGYuYm94X2MpLCBib29sKHNlbGYuYm94X2xhcmdlKQogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfbGVuCiAgICBjb3ZlciAyCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBjb3ZlciAzCiAgICBwb3AKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGJveF9sZW4KICAgIGNvdmVyIDQKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGludCAzIC8vIDMKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnJlYWRfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpyZWFkX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNQogICAgLy8gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLAogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzQ1CiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNgogICAgLy8gc2VsZi5ib3hfYi52YWx1ZS5uYXRpdmUsCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2IgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzNwogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSwKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzgKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlLmUsCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5pbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQzLTE0NAogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIC8vIGxhcmdlLmUgKz0gMQogICAgaW50YyA0IC8vIDQwOTYKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0NAogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUgPSBsYXJnZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ1CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmRlbGV0ZV9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZV9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDkKICAgIC8vIGRlbCBzZWxmLmJveF9hLnZhbHVlCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MAogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTEKICAgIC8vIGRlbCBzZWxmLmJveF9jLnZhbHVlCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYS5nZXQoZGVmYXVsdD1VSW50NjQoNDIpKSA9PSA0MgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBkaWcgMQogICAgZGlnIDMKICAgIHNlbGVjdAogICAgcHVzaGludCA0MiAvLyA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5nZXQoZGVmYXVsdD1hcmM0LlN0cmluZygiNDIiKSkgPT0gIjQyIgogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgYSA9PSAwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTgKICAgIC8vIGRlbCBzZWxmLmJveF9sYXJnZS52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2xpY2VfYm94W3JvdXRpbmddKCkgLT4gdm9pZDoKc2xpY2VfYm94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MwogICAgLy8gYm94XzAudmFsdWUgPSBCeXRlcyhiIlRlc3RpbmcgdGVzdGluZyAxMjMiKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NzIwNzQ2NTczNzQ2OTZlNjcyMDMxMzIzMwogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDEwIC8vICIwIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY2CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NDg2NTZjNmM2ZgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X21hbnlfaW50czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg1CiAgICAvLyBzZWxmLm1hbnlfaW50cy52YWx1ZVtpbmRleF0gPSB2YWx1ZQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnN1bV9tYW55X2ludHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fbWFueV9pbnRzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKCnN1bV9tYW55X2ludHNfd2hpbGVfdG9wQDc6CiAgICBwdXNoaW50IDEwNTEwIC8vIDEwNTEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBzdW1fbWFueV9pbnRzX2FmdGVyX3doaWxlQDEyCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18yIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3CgpzdW1fbWFueV9pbnRzX2FmdGVyX3doaWxlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MAogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbnlfaW50cyBleGlzdHMKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDIKCnN1bV9tYW55X2ludHNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MQogICAgLy8gZm9yIHZhbCBpbiBzZWxmLm1hbnlfaW50cy52YWx1ZToKICAgIGRpZyAxCiAgICBwdXNoaW50IDUxMyAvLyA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwIC8vIDgwMDAKICAgIGJveF9yZXNpemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE3CiAgICAvLyBib3hfcmVmLnNwbGljZSgwLCAwLCBhcHBfYWRkcmVzcykKICAgIGludGNfMiAvLyAwCiAgICBkdXAKICAgIGRpZyAzCiAgICBib3hfc3BsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgcHVzaGludCA2NCAvLyA2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE4CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTkKICAgIC8vIHByZWZpeCA9IGJveF9yZWYuZXh0cmFjdCgwLCAzMiAqIDIgKyB2YWx1ZV8zLmxlbmd0aCkKICAgIGludGNfMiAvLyAwCiAgICBwdXNoaW50IDY5IC8vIDY5CiAgICBib3hfZXh0cmFjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMAogICAgLy8gYXNzZXJ0IHByZWZpeCA9PSBhcHBfYWRkcmVzcyArIHNlbmRlcl9ieXRlcyArIHZhbHVlXzMKICAgIGRpZyAxCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE0CiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyAxMiAvLyAweDY4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBjb25jYXQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIyLTIyMwogICAgLy8gIyBkZWxldGUKICAgIC8vIGRlbCBib3hfcmVmLnZhbHVlCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gIyBxdWVyeQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IGJveF9yZWYubWF5YmUoKQogICAgYm94X2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgIGR1cAogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMwCiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM0CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgIkJsb2IgZXhpc3RzIgogICAgYm94X2xlbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgYm94X3JlZi5sZW5ndGggPT0gNjQKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTYgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDEKICAgIC8vIGRlbCBzZWxmLmJveF9yZWYudmFsdWUKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X25lc3RlZF9zdHJ1Y3Rbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfbmVzdGVkX3N0cnVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ2CiAgICAvLyBhc3NlcnQgc3RydWN0LmEsICJzdHJ1Y3QuYSBpcyB0cnV0aHkiCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2VydCAvLyBzdHJ1Y3QuYSBpcyB0cnV0aHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDcKICAgIC8vIHN0cnVjdF9ieXRlcyA9IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ4CiAgICAvLyBzdHJ1Y3Rfc2l6ZSA9IHN0cnVjdF9ieXRlcy5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUwLTI1MQogICAgLy8gIyBpbml0aWFsaXplIGJveCB0byB6ZXJvCiAgICAvLyBib3guY3JlYXRlKHNpemU9dGFpbF9vZmZzZXQgKyBzdHJ1Y3Rfc2l6ZSkKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1Mi0yNTMKICAgIC8vICMgc2V0IGNvcnJlY3Qgb2Zmc2V0IGZvciBkeW5hbWljIHBvcnRpb24KICAgIC8vIGJveC5yZXBsYWNlKHRhaWxfb2Zmc2V0IC0gMiwgYXJjNC5VSW50MTYodGFpbF9vZmZzZXQpLmJ5dGVzKQogICAgaW50YyA0IC8vIDQwOTYKICAgIHB1c2hieXRlcyAweDEwMDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDkKICAgIC8vIHRhaWxfb2Zmc2V0ID0gVUludDY0KDQwOTYgKyAyKQogICAgaW50YyA1IC8vIDQwOTgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyAjIHNldCBkeW5hbWljIGRhdGEKICAgIC8vIGJveC5yZXBsYWNlKHRhaWxfb2Zmc2V0LCBzdHJ1Y3RfYnl0ZXMpCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5uZXN0ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjAKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYSA9IHZhbHVlCiAgICBpbnRjIDUgLy8gNDA5OAogICAgdW5jb3ZlciAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5iID0gdmFsdWUgKyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgcHVzaGludCA0MTEwIC8vIDQxMTAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBwdXNoaW50IDQxMzYgLy8gNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIHB1c2hpbnQgNDExOCAvLyA0MTE4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOCAvLyA0MTI4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgcHVzaGludCA0MTA4IC8vIDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOCAvLyAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwIC8vIDQxMTAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHB1c2hpbnQgNDEzNiAvLyA0MTM2CiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgIGRpZyA1CiAgICAqCiAgICBpbnRjIDYgLy8gNDEzOAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDYKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZGlnIDUKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzMKICAgIC8vIGMgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmMKICAgIHB1c2hpbnQgNDExOCAvLyA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4IC8vIDQxMjgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgcHVzaGludCA0MTA4IC8vIDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHVuY292ZXIgMTAKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDUKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOCAvLyAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDgKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgOAogICAgKgogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDcKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciA2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXR1cm4gYSArIGIgKyBhcnJfYXJyICsgYyArIGQgKyB3b2FoX2Fycl9hcnIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICArCiAgICB1bmNvdmVyIDQKICAgICsKICAgIHVuY292ZXIgMwogICAgKwogICAgdW5jb3ZlciAyCiAgICArCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBpbnRjXzIgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg1CiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlW2luZGV4XSA9IHZhbHVlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICUKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIGNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc3VtX2Jvb2xzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX2Jvb2xzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODkKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b29fbWFueV9ib29scyBleGlzdHMKICAgIGludGNfMiAvLyAwCgpzdW1fYm9vbHNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MAogICAgLy8gZm9yIHZhbHVlIGluIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWU6CiAgICBkdXAKICAgIHB1c2hpbnQgMzMwMDAgLy8gMzMwMDAKICAgIDwKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9mb3JAOQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICUKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIHN3YXAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MQogICAgLy8gaWYgdmFsdWU6CiAgICBieiBzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkyCiAgICAvLyB0b3RhbCArPSAxCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKc3VtX2Jvb2xzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTMKICAgIC8vIGlmIHRvdGFsID09IHN0b3BfYXRfdG90YWw6CiAgICBkaWcgMQogICAgZGlnIDMKICAgID09CiAgICBibnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2Jvb2xzX2Zvcl9oZWFkZXJAMgoKc3VtX2Jvb2xzX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfdGVzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfdGVzdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTkKICAgIC8vIGtleV8wID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwMgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAxCiAgICAvLyB2YWx1ZSA9IFN0cmluZygiSG1tbW1tIikKICAgIHB1c2hieXRlcyAiSG1tbW1tIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwMgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzA1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBib3hfbGVuCiAgICBwb3AKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiYCA29jYQN0eG4xG0EAHTEZFEQxGESCAgTybG1CBO8YbPc2GgCOAgAJABgAMRkUMRgUEEOBARYoTL+BBhYpTL+BAUMovkRJFxZMSwESRCm+REkXFkxLARJEUIAEFR98dUxQsIEBQw==", + "approval": "CiAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB1gAfAgYCTAJdAp4AEwAKAxkDKwOEA+kECwTNAAEFjwW2Bf0GMAZDBlkGYgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJDJwW9RQEnB71OAkgpvU4DSCu9TgRIgAEAJE8CVCJPAlQjTwJUgQNPAlQnBExQsCJDJwW+RBciCCIJJwe+RFcCACm+RCshBCW6F08DFksDFRZXBgJPBFBMgAIAFFBLARWBFAgWVwYCUE8CFlBMUExQJwRMULAiQyshBCW6FyIIFishBE8CuyJDJwW8SCcHvEgpvEgnBb5MF4EqSwFLA02BKhJEJwe+JwtOAk1XAgCAAjQyEkQpvicLTgJNJwsSREwURBREK7xIIkMnCrxIJwqAE1Rlc3RpbmcgdGVzdGluZyAxMjO/Jwq9SEkkSwJNgQdLAgxPAoEHTwJNSwEJJwpOArqAB1Rlc3RpbmcSRCm8SCmABwAFSGVsbG+/Kb1II0sBDEsBI08CTYEKSwIMTwKBCk8CTUsBCSlOArqABUhlbGxvEkM2GgEXNhoCTCULJwlMTwK7IkOAAEmBjlIyDA1BABixgQayEIEFshknD7IeJw+yHySyAbNC/98kRQEnCb1FAUQkRQJLAYGBBAxBABdLAUklCycJTCW6F0sCCEUCIghFAkL/4EkWJwRMULAiQyq9RQEURCqBILlEMQAyCiokSwO7KoHAPtMqJElLA9IqgUAnDLsqJIFFuksBSwNQJwxQEkQqvEgqvkkUREsBgAASREsDTgJNSwISRFAqvEgqTL8qvUiBQBJEJxCBILlIJxC8SCJDNhoBJFtENhoBSRUhBQgoTLlIKCEEgAIQArsoIQVPArsiQzYaARc2GgJJFyghBU8Du0kiCBYogY4gTwK7SSMIFiiBqCAjuhdLAw1EI0sDCyEGSwEIKEwjuhchBggoSwEjuhdLBQ1EIwhLBCULTEsBCChMTwS7SwKBAwgWKIGWIE8Cu0sCgQQIFiiBoCBPArtPAoEFCBYogYwgI7oXIQUIKEsBI7oXSwUNRCMISUsECChMI7oXCIESCChLASO6F0sFDUQjCElPBAgoTCO6FwgoSwEjuhdPBA1EIwhPAggoTE8CuyJDNhoBFzYaAhc2GgMXKCEFJboXKIGOICW6FyiBqCAjuhdLBQ1EI0sFCyEGSwEIKEwjuhchBggoSwEjuhdLBg1EIwhLBSULCChMJboXKIGWICW6FyiBoCAluhcogYwgI7oXIQUIKEsBI7oXTwoNRCMISU8FCChMI7oXCIESCChLASO6F0sIDUQjCCNPCAtLAQgoTCO6FwgoSwEjuhdLBw1EIwhPBiULCChMJboXTwVPBQhPBAhPAwhPAggIFicETFCwIkM2GgEXNhoCJFNLASUKTwIlGCcISwIiuksBJQxETE8DVCcITgK7IkM2GgEXJCcIvUUBRCRJgeiBAgxBAChHAiUKTCUYJwhPAiK6TFNBAAZLASIIRQJLAUsDEkAACEkiCEUBQv/PSwEWJwRMULAiQyQWSbxISYAGSG1tbW1tv71IgQYSRCIWSb4nEU4CTScREkRJvUUBFERJvEhJJwy/vEgiQzYaARc2GgJXAgBMFkm8SEy/IkM2GgEXFr5ESRUWVwYCTFAnBExQsCJDNhoBFxa8SCJDNhoBFxa9RQGAAQAkTwJUJwRMULAiQw==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/artifacts/StateMutations/data/StateMutations.approval.teal b/tests/artifacts/StateMutations/data/StateMutations.approval.teal index 4b6cdae..8d74e7e 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.approval.teal +++ b/tests/artifacts/StateMutations/data/StateMutations.approval.teal @@ -1,7 +1,7 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateMutations.statemutations.StateMutations.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 0 1 2 8 bytecblock "box" "no_proxy" 0x0000 "glob_assign" "glob" "loc" 0x00020000000000000001000a000362617a 0x00086d6f646966696564 "map" @@ -17,7 +17,7 @@ main_after_if_else@2: // tests/artifacts/StateMutations/statemutations.py:22 // class StateMutations(ARC4Contract): txn NumAppArgs - bz main_bare_routing@9 + bz main_bare_routing@12 txn OnCompletion ! assert // OnCompletion must be NoOp @@ -28,14 +28,14 @@ main_after_if_else@2: match append modify get err -main_bare_routing@9: +main_bare_routing@12: // tests/artifacts/StateMutations/statemutations.py:22 // class StateMutations(ARC4Contract): txn OnCompletion - switch main___algopy_default_create@10 main_opt_in@11 + switch main___algopy_default_create@13 main_opt_in@14 err -main_opt_in@11: +main_opt_in@14: // tests/artifacts/StateMutations/statemutations.py:31 // @arc4.baremethod(allow_actions=["OptIn"]) txn ApplicationID @@ -95,7 +95,7 @@ main_opt_in@11: intc_1 // 1 return -main___algopy_default_create@10: +main___algopy_default_create@13: txn ApplicationID ! return // on error: can only call when creating @@ -211,14 +211,12 @@ dynamic_array_replace_dynamic_element: + intc_2 // 2 * - dup - cover 4 dig 2 - swap + dig 1 extract_uint16 - dig 2 + dig 3 len - dig 4 + dig 5 frame_dig -1 - intc_1 // 1 @@ -228,56 +226,58 @@ dynamic_array_replace_dynamic_element: uncover 2 select dup - dig 3 + dig 4 - - cover 5 + cover 6 frame_dig -2 len - cover 5 - dig 3 + cover 6 + dig 4 intc_0 // 0 - uncover 4 + uncover 5 substring3 frame_dig -2 concat - uncover 3 + uncover 4 uncover 2 uncover 3 substring3 concat + cover 2 swap intc_2 // 2 * + swap dynamic_array_replace_dynamic_element_for_header@2: - frame_dig 1 frame_dig 5 + frame_dig 4 < bz dynamic_array_replace_dynamic_element_after_for@5 - frame_dig 4 + frame_dig 3 dup - frame_dig 1 + frame_dig 5 dup cover 3 extract_uint16 - frame_dig 3 - + frame_dig 2 + + + frame_dig 1 - itob extract 6 2 dig 2 swap replace3 - frame_bury 4 + frame_bury 3 intc_2 // 2 + - frame_bury 1 + frame_bury 5 b dynamic_array_replace_dynamic_element_for_header@2 dynamic_array_replace_dynamic_element_after_for@5: frame_dig 0 - frame_dig 4 + frame_dig 3 concat frame_bury 0 retsub diff --git a/tests/artifacts/StateMutations/data/StateMutations.arc56.json b/tests/artifacts/StateMutations/data/StateMutations.arc56.json index 2fb1fd1..a17767b 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.arc56.json +++ b/tests/artifacts/StateMutations/data/StateMutations.arc56.json @@ -143,96 +143,96 @@ }, { "pc": [ - 525, - 794, - 930 + 526, + 795, + 931 ], "errorMessage": "check self.box exists" }, { "pc": [ - 480, - 683, - 920 + 481, + 684, + 921 ], "errorMessage": "check self.glob exists" }, { "pc": [ - 439, - 576, - 915 + 440, + 577, + 916 ], "errorMessage": "check self.glob_assign exists" }, { "pc": [ - 505, - 741, - 927 + 506, + 742, + 928 ], "errorMessage": "check self.loc exists for account" }, { "pc": [ - 552, - 854, - 937 + 553, + 855, + 938 ], "errorMessage": "check self.map entry exists" }, { "pc": [ - 459, - 629, - 911 + 460, + 630, + 912 ], "errorMessage": "check self.no_proxy exists" }, { "pc": [ - 961 + 962 ], "errorMessage": "expected box == no_proxy" }, { "pc": [ - 949 + 950 ], "errorMessage": "expected global == no_proxy" }, { "pc": [ - 943 + 944 ], "errorMessage": "expected global assign == no_proxy" }, { "pc": [ - 955 + 956 ], "errorMessage": "expected local == no_proxy" }, { "pc": [ - 965 + 966 ], "errorMessage": "expected map == no_proxy" }, { "pc": [ - 592, - 618, - 645, - 671, - 699, - 725, - 757, - 783, - 810, - 836, - 870, - 896 + 593, + 619, + 646, + 672, + 700, + 726, + 758, + 784, + 811, + 837, + 871, + 897 ], "errorMessage": "index access is out of bounds" } @@ -245,11 +245,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMuX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOAogICAgYnl0ZWNibG9jayAiYm94IiAibm9fcHJveHkiIDB4MDAwMCAiZ2xvYl9hc3NpZ24iICJnbG9iIiAibG9jIiAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EgMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NCAibWFwIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjI0CiAgICAvLyBzZWxmLm5vX3Byb3h5ID0gTXlBcnJheSgpCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjIKICAgIC8vIGNsYXNzIFN0YXRlTXV0YXRpb25zKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1MjZlOGJiZiAweDk1ZmVmMTNkIDB4MGMyOTQ0NGIgLy8gbWV0aG9kICJhcHBlbmQoKXZvaWQiLCBtZXRob2QgIm1vZGlmeSgpdm9pZCIsIG1ldGhvZCAiZ2V0KCkodWludDY0LHN0cmluZylbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFwcGVuZCBtb2RpZnkgZ2V0CiAgICBlcnIKCm1haW5fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjIKICAgIC8vIGNsYXNzIFN0YXRlTXV0YXRpb25zKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMCBtYWluX29wdF9pbkAxMQogICAgZXJyCgptYWluX29wdF9pbkAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBkaWcgMgogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgNQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDUKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTcKICAgIC8vIGFyclswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1OAogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IGFyci5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYyCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MwogICAgLy8gc2VsZi5ib3gudmFsdWVbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjQKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1MjZlOGJiZiAweDk1ZmVmMTNkIDB4MGMyOTQ0NGIgLy8gbWV0aG9kICJhcHBlbmQoKXZvaWQiLCBtZXRob2QgIm1vZGlmeSgpdm9pZCIsIG1ldGhvZCAiZ2V0KCkodWludDY0LHN0cmluZylbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFwcGVuZCBtb2RpZnkgZ2V0CiAgICBlcnIKCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjIyCiAgICAvLyBjbGFzcyBTdGF0ZU11dGF0aW9ucyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTMgbWFpbl9vcHRfaW5AMTQKICAgIGVycgoKbWFpbl9vcHRfaW5AMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzEKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNAogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzUKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjIDggLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTM6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTcKICAgIC8vIGFyclswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1OAogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IGFyci5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYyCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MwogICAgLy8gc2VsZi5ib3gudmFsdWVbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjQKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE1Ab4DDQAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSU4ESwJMWUsCFUsEi/8JIwlLAU8DTwJNSUsDCU4Fi/4VTgVLAyJPBFKL/lBPA08CTwNSUEwkC4sBiwUMQQAgiwRJiwFJTgNZiwMIiwIJFlcGAksCTF2MBCQIjAFC/9iLAIsEUIwAiSIrZURJIllMVwIAIycGiP7qK0xnIillREkiWUxXAgAjJwaI/tYpTGciJwRlREkiWUxXAgAjJwaI/sEnBExnMQBJIicFY0RJIllMVwIAIycGiP6oJwVMZii+REkiWUxXAgAjJwaI/pQovEgoTL8nCDEAUEm+REkiWUxXAgAjJwaI/nlLAbxIvyNDIitlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/sErTGciKWVESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj+jClMZyInBGVESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj+VicETGcxAEkiJwVjRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/hwnBUxmKL5ESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj95yi8SChMvycIMQBQSb5ESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj9q0sBvEi/I0MiKWVEIitlRCInBGVEMQAiJwVjRCi+RCcIMQBQvkRLBU8FEkRLBE8EEkRLA08DEkRLAk8CEkRLARJEgAQVH3x1TFCwI0M=", + "approval": "CiAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal index 7fd4aef..84cf908 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal @@ -1,7 +1,7 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.GlobalStateContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 bytecblock 0x151f7c75 "implicit_key_arc4_uint" "implicit_key_arc4_string" "implicit_key_arc4_byte" "implicit_key_arc4_bool" "implicit_key_arc4_address" "implicit_key_arc4_uint128" "implicit_key_arc4_dynamic_bytes" "implicit_key_tuple" "explicit_key_arc4_uint" "explicit_key_arc4_string" "explicit_key_arc4_byte" "explicit_key_arc4_bool" "explicit_key_arc4_address" "explicit_key_arc4_uint128" "explicit_key_arc4_dynamic_bytes" 0x0000000000000539 0x000548656c6c6f 0x00000010000000000000000000000000 0x000d64796e616d6963206279746573 @@ -107,7 +107,7 @@ main_after_if_else@2: // tests/artifacts/StateOps/contract.py:513 // class GlobalStateContract(ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@37 + bz main___algopy_default_create@39 txn OnCompletion ! assert // OnCompletion must be NoOp @@ -118,7 +118,7 @@ main_after_if_else@2: match get_implicit_key_arc4_uint get_implicit_key_arc4_string get_implicit_key_arc4_byte get_implicit_key_arc4_bool get_implicit_key_arc4_address get_implicit_key_arc4_uint128 get_implicit_key_arc4_dynamic_bytes get_implicit_key_tuple get_arc4_uint get_arc4_string get_arc4_byte get_arc4_bool get_arc4_address get_arc4_uint128 get_arc4_dynamic_bytes set_implicit_key_arc4_uint set_implicit_key_arc4_string set_implicit_key_arc4_byte set_implicit_key_arc4_bool set_implicit_key_arc4_address set_implicit_key_arc4_uint128 set_implicit_key_arc4_dynamic_bytes set_implicit_key_tuple set_arc4_uint set_arc4_string set_arc4_byte set_arc4_bool set_arc4_address set_arc4_uint128 set_arc4_dynamic_bytes err -main___algopy_default_create@37: +main___algopy_default_create@39: txn OnCompletion ! txn ApplicationID diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json index 290e319..32c945a 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json @@ -781,7 +781,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzNwogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxY2M5NjZlZSAweDIzNjdjZDRiIDB4NjkxMjhlOTAgMHg2OGQ1OTBlMiAweDQ0ZWYwNjgxIDB4MWNkMjk0ZWMgMHhhYWM4ZWNiMSAweDE2NmM2YWZkIDB4M2NjM2JiN2IgMHg5YTY5NDZhZCAweGRlZDc1MDMzIDB4NjYyNzllOTMgMHgwOTZlOTI3YiAweDk3NTMxZmJjIDB4NmVhM2Y5OTYgMHhhN2Y0ZjQwMiAweGFhZGRjYzRjIDB4NWVjMzExNmQgMHgyMGY1NmVlZSAweDFjMTQ5YTQzIDB4YTU3NWFjN2QgMHg4N2YwODY5YiAweDQ2MWFmYzZkIDB4MDQ4MTE2ZWEgMHgzMGUzNGE5MyAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDcyMGEzY2EwIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KCl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKCkodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV90dXBsZSgodWludDY0LGJ5dGVbXSxib29sKSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIHNldF9pbXBsaWNpdF9rZXlfdHVwbGUgc2V0X2FyYzRfdWludCBzZXRfYXJjNF9zdHJpbmcgc2V0X2FyYzRfYnl0ZSBzZXRfYXJjNF9ib29sIHNldF9hcmM0X2FkZHJlc3Mgc2V0X2FyYzRfdWludDEyOCBzZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxY2M5NjZlZSAweDIzNjdjZDRiIDB4NjkxMjhlOTAgMHg2OGQ1OTBlMiAweDQ0ZWYwNjgxIDB4MWNkMjk0ZWMgMHhhYWM4ZWNiMSAweDE2NmM2YWZkIDB4M2NjM2JiN2IgMHg5YTY5NDZhZCAweGRlZDc1MDMzIDB4NjYyNzllOTMgMHgwOTZlOTI3YiAweDk3NTMxZmJjIDB4NmVhM2Y5OTYgMHhhN2Y0ZjQwMiAweGFhZGRjYzRjIDB4NWVjMzExNmQgMHgyMGY1NmVlZSAweDFjMTQ5YTQzIDB4YTU3NWFjN2QgMHg4N2YwODY5YiAweDQ2MWFmYzZkIDB4MDQ4MTE2ZWEgMHgzMGUzNGE5MyAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDcyMGEzY2EwIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KCl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKCkodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV90dXBsZSgodWludDY0LGJ5dGVbXSxib29sKSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIHNldF9pbXBsaWNpdF9rZXlfdHVwbGUgc2V0X2FyYzRfdWludCBzZXRfYXJjNF9zdHJpbmcgc2V0X2FyYzRfYnl0ZSBzZXRfYXJjNF9ib29sIHNldF9hcmM0X2FkZHJlc3Mgc2V0X2FyYzRfdWludDEyOCBzZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal index 649fb16..6ccbcb7 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal @@ -1,14 +1,14 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.LocalStateContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 bytecblock 0x151f7c75 "implicit_key_arc4_uint" 0x0000000000000539 "implicit_key_arc4_string" 0x000548656c6c6f "implicit_key_arc4_byte" "implicit_key_arc4_bool" "implicit_key_arc4_address" "implicit_key_arc4_uint128" 0x00000010000000000000000000000000 "implicit_key_arc4_dynamic_bytes" 0x000d64796e616d6963206279746573 "implicit_key_tuple" "explicit_key_arc4_uint" "explicit_key_arc4_string" "explicit_key_arc4_byte" "explicit_key_arc4_bool" "explicit_key_arc4_address" "explicit_key_arc4_uint128" "explicit_key_arc4_dynamic_bytes" // tests/artifacts/StateOps/contract.py:663 // class LocalStateContract(ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@24 + bz main___algopy_default_create@26 pushbytes 0x30c6d58a // method "opt_in()void" txna ApplicationArgs 0 match main_opt_in_route@5 @@ -37,7 +37,7 @@ main_opt_in_route@5: assert // OnCompletion must be OptIn && can only call when not creating b opt_in -main___algopy_default_create@24: +main___algopy_default_create@26: txn OnCompletion ! txn ApplicationID diff --git a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json index 1c4355d..895a54d 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json @@ -563,7 +563,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Ll9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IiAweDAwMDAwMDAwMDAwMDA1MzkgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgMHgwMDA1NDg2NTZjNmM2ZiAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIgImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIgMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIgMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMgImltcGxpY2l0X2tleV90dXBsZSIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIiAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIgImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IiAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NjMKICAgIC8vIGNsYXNzIExvY2FsU3RhdGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjQKICAgIHB1c2hieXRlcyAweDMwYzZkNThhIC8vIG1ldGhvZCAib3B0X2luKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9vcHRfaW5fcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YjNjZmEzODkgMHhkYjg1ODE3NiAweDc4MjY3NzYyIDB4NDI2MzUxYzggMHgwNzVjYWU5MSAweDU5YzBiODBiIDB4MGQ2ZmE2OTAgMHg5N2UxMGQ5YyAweDJlNGE4YzQ5IDB4YjIyY2QyMWUgMHhiM2Y0NDcwMSAweGVkZDk3Mjk3IDB4NjcxZDM1M2MgMHhhM2ZkNmZkYyAweGNkMmU1ZDY2IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGFkZHJlc3MpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KGFkZHJlc3MpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYWRkcmVzcylieXRlW10iLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfdHVwbGUoYWRkcmVzcykodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKGFkZHJlc3Mpc3RyaW5nIiwgbWV0aG9kICJnZXRfYXJjNF9ieXRlKGFkZHJlc3MpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoYWRkcmVzcylhZGRyZXNzIiwgbWV0aG9kICJnZXRfYXJjNF91aW50MTI4KGFkZHJlc3MpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI0OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQ2NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkwCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIHB1c2hieXRlcyAweDgwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkyCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkzCiAgICAvLyBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTItNjk0CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICAvLyAgICAgR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgLy8gKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEyIC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBhMDAwYjAwMDAwNDc0NjU3Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAxCiAgICAvLyBzZWxmLmFyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAyCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDMKICAgIC8vIHNlbGYuYXJjNF9ieXRlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5CeXRlKDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDQKICAgIC8vIHNlbGYuYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDUKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDEyOCgyKioxMDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwOS03MTAKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzEyCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjAKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjQKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjgKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0MAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV90dXBsZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQyLTc0MwogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUzCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU3CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYxCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGIzY2ZhMzg5IDB4ZGI4NTgxNzYgMHg3ODI2Nzc2MiAweDQyNjM1MWM4IDB4MDc1Y2FlOTEgMHg1OWMwYjgwYiAweDBkNmZhNjkwIDB4OTdlMTBkOWMgMHgyZTRhOGM0OSAweGIyMmNkMjFlIDB4YjNmNDQ3MDEgMHhlZGQ5NzI5NyAweDY3MWQzNTNjIDB4YTNmZDZmZGMgMHhjZDJlNWQ2NiAvLyBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKGFkZHJlc3Mpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoYWRkcmVzcylhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKGFkZHJlc3MpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdldF9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoYWRkcmVzcylieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGdldF9pbXBsaWNpdF9rZXlfdHVwbGUgZ2V0X2FyYzRfdWludCBnZXRfYXJjNF9zdHJpbmcgZ2V0X2FyYzRfYnl0ZSBnZXRfYXJjNF9ib29sIGdldF9hcmM0X2FkZHJlc3MgZ2V0X2FyYzRfdWludDEyOCBnZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGJ5dGVjIDQgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5CeXRlKDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkyLTY5NAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKAogICAgLy8gICAgIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIC8vICkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDEyOCgyKioxMDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYtNjk4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR5bmFtaWMgYnl0ZXMiCiAgICAvLyApCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSAoVUludDY0KDEwKSwgQnl0ZXMoYiJ0ZXN0IiksIEZhbHNlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gc2VsZi5hcmM0X3VpbnRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQ2NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAyCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGJ5dGVjIDQgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAzCiAgICAvLyBzZWxmLmFyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgcHVzaGJ5dGVzIDB4ODAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDQKICAgIC8vIHNlbGYuYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA1CiAgICAvLyBzZWxmLmFyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcyhiImR5bmFtaWMgYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTYtNjk4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR5bmFtaWMgYnl0ZXMiCiAgICAvLyApCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcyhiImR5bmFtaWMgYnl0ZXMiKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwOS03MTAKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE2CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI0CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI4CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMyCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM2CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDAKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQyLTc0MwogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9zdHJpbmdbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2J5dGUgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ib29sW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2Jvb2wgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9hZGRyZXNzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQxMjggZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2OQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal index 21ee1c2..cbc2ddd 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal @@ -1,14 +1,14 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.StateAppGlobalContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 bytecblock 0x151f7c75 0x00 // tests/artifacts/StateOps/contract.py:445 // class StateAppGlobalContract(ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@14 + bz main___algopy_default_create@16 txn OnCompletion ! assert // OnCompletion must be NoOp @@ -19,7 +19,7 @@ main: match verify_get_bytes verify_get_uint64 verify_get_ex_bytes verify_get_ex_uint64 verify_delete verify_put_uint64 verify_put_bytes err -main___algopy_default_create@14: +main___algopy_default_create@16: txn OnCompletion ! txn ApplicationID diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json index 5545423..ba356f3 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json @@ -234,7 +234,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhOTk3YTE4NyAweDRkYjhhYTQxIDB4MGMxZjU2YTcgMHhhZmRkYjA4OCAweDkzYTg1MmUxIDB4MzY5OTY0NTEgMHgzOTIwYTU3YiAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyh1aW50NjQsYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KHVpbnQ2NCxieXRlW10pKHVpbnQ2NCxib29sKSIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhOTk3YTE4NyAweDRkYjhhYTQxIDB4MGMxZjU2YTcgMHhhZmRkYjA4OCAweDkzYTg1MmUxIDB4MzY5OTY0NTEgMHgzOTIwYTU3YiAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyh1aW50NjQsYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KHVpbnQ2NCxieXRlW10pKHVpbnQ2NCxib29sKSIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal index 7bee4fc..a5cc614 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal @@ -1,7 +1,7 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.StateAppGlobalExContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: bytecblock 0x64756d6d795f6279746573 0x001064756d6d795f617263345f6279746573 txn ApplicationID diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json index 9c59f8f..8248066 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json @@ -84,7 +84,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxFeENvbnRyYWN0Ll9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgYnl0ZWNibG9jayAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzEKICAgIC8vIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMwCiAgICAvLyBVSW50NjQoMiksCiAgICBwdXNoaW50IDIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyOS00MzIKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NCA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIFVJbnQ2NCgyKSwKICAgIC8vICAgICBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzUKICAgIC8vIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzMtNDM2CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIC8vICAgICBrZXk9Imdsb2JhbF9ieXRlcyIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0X2V4cGxpY2l0ID0gYWxnb3B5LlVJbnQ2NCgyKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0X2V4cGxpY2l0IgogICAgcHVzaGludCAyIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjktNDMyCiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjQgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBVSW50NjQoMiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfdWludDY0IiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM1CiAgICAvLyBrZXk9Imdsb2JhbF9ieXRlcyIsCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQKICAgIC8vIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMzLTQzNgogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCA9IGFsZ29weS5VSW50NjQoMikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlc19leHBsaWNpdCIKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MAogICAgLy8gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzktNDQxCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQyCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0ID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI3CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuIC8vIG9uIGVycm9yOiBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal index ace3de8..9fd8862 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal @@ -1,14 +1,14 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.StateAppLocalContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 bytecblock 0x151f7c75 // tests/artifacts/StateOps/contract.py:372 // class StateAppLocalContract(ARC4Contract): txn NumAppArgs - bz main___algopy_default_create@17 + bz main___algopy_default_create@19 pushbytes 0x30c6d58a // method "opt_in()void" txna ApplicationArgs 0 match main_opt_in_route@5 @@ -37,7 +37,7 @@ main_opt_in_route@5: assert // OnCompletion must be OptIn && can only call when not creating b opt_in -main___algopy_default_create@17: +main___algopy_default_create@19: txn OnCompletion ! txn ApplicationID diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json index 56f86d6..7f50783 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json @@ -309,7 +309,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0Ll9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzcyCiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGE4ODMwMmZlIDB4NDliN2RkZjkgMHhjMDc4YmVhZCAweGE1MmY5OTJiIDB4OGM1NmFkOTAgMHg0YzdhZDgyMyAweGNhYTdiODY0IDB4MjRmOWYwODUgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYWRkcmVzcyxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X2J5dGVzKGFkZHJlc3MsdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KGFkZHJlc3MsdWludDY0LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYWRkcmVzcyxieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X2V4aXN0cyhhZGRyZXNzLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhhZGRyZXNzLGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9leGlzdHMgdmVyaWZ5X3B1dF91aW50NjQgdmVyaWZ5X3B1dF9ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgT3B0SW4gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODYKICAgIC8vIHNlbGYubG9jYWxfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBCeXRlcyhiImR1bW15X2J5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MyAvLyAibG9jYWxfYnl0ZXMiLCAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODcKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5OSAvLyA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhODgzMDJmZSAweDQ5YjdkZGY5IDB4YzA3OGJlYWQgMHhhNTJmOTkyYiAweDhjNTZhZDkwIDB4NGM3YWQ4MjMgMHhjYWE3Yjg2NCAweDI0ZjlmMDg1IC8vIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhZGRyZXNzLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhZGRyZXNzLHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhZGRyZXNzLHVpbnQ2NCxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leGlzdHMoYWRkcmVzcyxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYWRkcmVzcyxieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYWRkcmVzcyxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfZXhpc3RzIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg2CiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMgLy8gImxvY2FsX2J5dGVzIiwgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkgLy8gOTk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MQogICAgLy8gdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRfYnl0ZXMoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRfdWludDY0KGEsIGIpCiAgICBhcHBfbG9jYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9leF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDEKICAgIC8vIHZhbHVlLCBfdmFsID0gb3AuQXBwTG9jYWwuZ2V0X2V4X2J5dGVzKGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9leF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZGVsZXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2RlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gb3AuQXBwTG9jYWwuZGVsZXRlKGEsIGIpCiAgICBhcHBfbG9jYWxfZGVsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2V4aXN0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTUKICAgIC8vIF92YWx1ZSwgZXhpc3RzID0gb3AuQXBwTG9jYWwuZ2V0X2V4X3VpbnQ2NChhLCAwLCBiKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9wdXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjAKICAgIC8vIG9wLkFwcExvY2FsLnB1dChhLCBiLCBjKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9wdXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal index 9e5a212..ba2afe0 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal @@ -1,7 +1,7 @@ #pragma version 10 #pragma typetrack false -// tests.artifacts.StateOps.contract.StateAppLocalExContract.__algopy_entrypoint_with_init() -> uint64: +// algopy.arc4.ARC4Contract.approval_program() -> uint64: main: // tests/artifacts/StateOps/contract.py:346 // class StateAppLocalExContract(ARC4Contract): diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json index 2246bb0..b22c2f9 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json @@ -92,7 +92,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3QuX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANwogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDEgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4gLy8gb24gZXJyb3I6IE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxFeENvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjUKICAgIC8vIHNlbGYubG9jYWxfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBCeXRlcyhiImR1bW15X2J5dGVzX2Zyb21fZXh0ZXJuYWxfY29udHJhY3QiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczNWY2NjcyNmY2ZDVmNjU3ODc0NjU3MjZlNjE2YzVmNjM2ZjZlNzQ3MjYxNjM3NCAvLyAibG9jYWxfYnl0ZXMiLCAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5IC8vIDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMgLy8gImxvY2FsX2FyYzRfYnl0ZXMiLCAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybiAvLyBvbiBlcnJvcjogT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0IC8vICJsb2NhbF9ieXRlcyIsIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MzVmNjY3MjZmNmQ1ZjY1Nzg3NDY1NzI2ZTYxNmM1ZjYzNmY2ZTc0NzI2MTYzNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjYKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXMgImxvY2FsX3VpbnQ2NCIKICAgIHB1c2hpbnQgOTkgLy8gOTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYubG9jYWxfYXJjNF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2Ny0zNjkKICAgIC8vIHNlbGYubG9jYWxfYXJjNF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR1bW15X2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9hcmM0X2J5dGVzIiAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MyAvLyAibG9jYWxfYXJjNF9ieXRlcyIsIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { diff --git a/tests/models/test_box.py b/tests/models/test_box.py index cdb003f..0b1a34f 100644 --- a/tests/models/test_box.py +++ b/tests/models/test_box.py @@ -422,7 +422,7 @@ def test_arrays_and_struct_in_boxes(context: AlgopyTestContext) -> None: # noqa # ImmutableArray nested_arr3 = ImmutableArray[ImmutableArray[UInt64]]( - ImmutableArray(*arr1), ImmutableArray(*arr2) + (ImmutableArray(arr1), ImmutableArray(arr2)) ) box3 = Box(ImmutableArray[ImmutableArray[UInt64]], key=b"test_array_3") box3.value = nested_arr3 diff --git a/tests/test_array.py b/tests/test_array.py index ce46860..cd890b6 100644 --- a/tests/test_array.py +++ b/tests/test_array.py @@ -7,6 +7,7 @@ from algopy_testing import AlgopyTestContext, algopy_testing_context from tests.artifacts.Arrays.immutable import ( + DynamicArrayInitContract, ImmutableArrayContract, MyDynamicSizedTuple, MyStruct, @@ -147,7 +148,7 @@ def test_immutable_array(context: AlgopyTestContext) -> None: append = 5 arr = [MyTuple(UInt64(i), i % 2 == 0, i % 3 == 0) for i in range(append)] - response = app.test_convert_to_array_and_back(arr=ImmutableArray(*arr), append=UInt64(append)) + response = app.test_convert_to_array_and_back(arr=ImmutableArray(arr), append=UInt64(append)) assert list(response) == [*arr, *arr] response = app.test_concat_with_arc4_tuple(arc4.Tuple((arc4.UInt64(3), arc4.UInt64(4)))) @@ -161,14 +162,16 @@ def test_immutable_array(context: AlgopyTestContext) -> None: three = MyDynamicSizedTuple(UInt64(3), String("tree")) four = MyDynamicSizedTuple(UInt64(4), String("floor")) response = app.test_concat_immutable_dynamic( - ImmutableArray(one, two), ImmutableArray(three, four) + ImmutableArray((one, two)), ImmutableArray((three, four)) ) assert list(response) == [one, two, three, four] immutable_arc4_input = ImmutableArray( - MyStruct(arc4.UInt64(1), arc4.UInt64(2)), - MyStruct(arc4.UInt64(3), arc4.UInt64(4)), - MyStruct(arc4.UInt64(5), arc4.UInt64(6)), + ( + MyStruct(arc4.UInt64(1), arc4.UInt64(2)), + MyStruct(arc4.UInt64(3), arc4.UInt64(4)), + MyStruct(arc4.UInt64(5), arc4.UInt64(6)), + ) ) immutable_arc4_result = app.test_immutable_arc4(immutable_arc4_input) assert list(immutable_arc4_result) == [ @@ -186,6 +189,18 @@ def test_immutable_array(context: AlgopyTestContext) -> None: assert len(imm_fixed_arr) == 3 +def test_dynamic_array_init(context: AlgopyTestContext) -> None: # noqa: ARG001 + app = DynamicArrayInitContract() + + app.test_immutable_array_init() + + app.test_immutable_array_init_without_type_generic() + + app.test_reference_array_init() + + app.test_immutable_array_init_without_type_generic() + + _EXPECTED_LENGTH_20 = [False, False, True, *(False,) * 17] @@ -202,10 +217,10 @@ def test_immutable_routing(context: AlgopyTestContext) -> None: # noqa: ARG001 app = ImmutableArrayContract() response = app.sum_uints_and_lengths_and_trues( - arr1=ImmutableArray(*map(UInt64, range(5))), - arr2=ImmutableArray(*[i % 2 == 0 for i in range(6)]), - arr3=ImmutableArray(*[MyTuple(UInt64(i), i % 2 == 0, i % 3 == 0) for i in range(7)]), - arr4=ImmutableArray(*[MyDynamicSizedTuple(UInt64(i), String(" " * i)) for i in range(8)]), + arr1=ImmutableArray([*map(UInt64, range(5))]), + arr2=ImmutableArray([i % 2 == 0 for i in range(6)]), + arr3=ImmutableArray([MyTuple(UInt64(i), i % 2 == 0, i % 3 == 0) for i in range(7)]), + arr4=ImmutableArray([MyDynamicSizedTuple(UInt64(i), String(" " * i)) for i in range(8)]), ) assert response == tuple(map(UInt64, (10, 3, 21 + 4 + 3, 28 * 2))) @@ -240,9 +255,7 @@ def test_nested_immutable(context: AlgopyTestContext) -> None: # noqa: ARG001 response = app.test_nested_array( arr_to_add=UInt64(5), - arr=ImmutableArray( - *(ImmutableArray(*(UInt64(i * j) for i in range(5))) for j in range(3)) - ), + arr=ImmutableArray([ImmutableArray([UInt64(i * j) for i in range(5)]) for j in range(3)]), ) assert list(response) == list( map(