{ "name": "FractionalRealEstate", "structs": { "PropertyStruct": [ { "name": "address", "type": "string" }, { "name": "totalShares", "type": "uint64" }, { "name": "availableShares", "type": "uint64" }, { "name": "pricePerShare", "type": "uint64" }, { "name": "propertyAssetId", "type": "uint64" }, { "name": "ownerAddress", "type": "address" } ] }, "methods": [ { "name": "createPropertyListing", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "Covers the Minimum Balance Requirement for box storage" }, { "type": "string", "name": "propertyAddress" }, { "type": "uint64", "name": "shares" }, { "type": "uint64", "name": "pricePerShare" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "List a new property for fractional ownership. Creates an ASA representing shares\nand stores property details in a BoxMap.", "events": [], "recommendations": {} }, { "name": "purchaseFromLister", "args": [ { "type": "uint64", "name": "propertyId" }, { "type": "uint64", "name": "shares" }, { "type": "pay", "name": "payment" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Purchase shares from the original lister. Buyer must opt in to the ASA beforehand.", "events": [], "recommendations": {} }, { "name": "delistProperty", "args": [ { "type": "uint64", "name": "propertyId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Delist a property. Only the owner can delist, and no shares can have been sold.\nDeleting the box reclaims the MBR.", "events": [], "recommendations": {} }, { "name": "getPropertyInfo", "args": [ { "type": "uint64", "name": "propertyId" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,address)", "struct": "PropertyStruct" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "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": { "listedProperties": { "keyType": "uint64", "valueType": "PropertyStruct", "prefix": "cHJvcGVydGllcw==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 524 ], "errorMessage": "Cannot delist property with sold shares" }, { "pc": [ 364 ], "errorMessage": "Invalid payment transaction" }, { "pc": [ 159 ], "errorMessage": "MBR payment amount is insufficient" }, { "pc": [ 175 ], "errorMessage": "MBR payment must be from the caller" }, { "pc": [ 167 ], "errorMessage": "MBR payment must be to the app" }, { "pc": [ 302 ], "errorMessage": "Must purchase at least one share" }, { "pc": [ 377 ], "errorMessage": "Not enough shares" }, { "pc": [ 36 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 83 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 509 ], "errorMessage": "Only the owner can delist" }, { "pc": [ 137 ], "errorMessage": "Price per share must be greater than 0" }, { "pc": [ 313, 499, 546 ], "errorMessage": "Property not listed" }, { "pc": [ 136 ], "errorMessage": "Shares must be greater than 0" }, { "pc": [ 101 ], "errorMessage": "invalid array length header" }, { "pc": [ 109 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 121, 131, 279, 288, 489, 536 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 95, 299 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgOCAxIDAgMzIKICAgIGJ5dGVjYmxvY2sgInByb3BlcnRpZXMiIDB4MDA0MiAweDE1MWY3Yzc1CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJhY3Rpb25hbFJlYWxFc3RhdGUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MzMxZGFjNTQgMHgwYTNkZTUxYyAweDNiOWUzOTQ1IDB4ZjNjZTUxODQgLy8gbWV0aG9kICJjcmVhdGVQcm9wZXJ0eUxpc3RpbmcocGF5LHN0cmluZyx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicHVyY2hhc2VGcm9tTGlzdGVyKHVpbnQ2NCx1aW50NjQscGF5KWJvb2wiLCBtZXRob2QgImRlbGlzdFByb3BlcnR5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRQcm9wZXJ0eUluZm8odWludDY0KShzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlUHJvcGVydHlMaXN0aW5nIHB1cmNoYXNlRnJvbUxpc3RlciBkZWxpc3RQcm9wZXJ0eSBnZXRQcm9wZXJ0eUluZm8KICAgIGVycgoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJhY3Rpb25hbFJlYWxFc3RhdGUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjpGcmFjdGlvbmFsUmVhbEVzdGF0ZS5jcmVhdGVQcm9wZXJ0eUxpc3Rpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVQcm9wZXJ0eUxpc3Rpbmc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czozNi00MQogICAgLy8gcHVibGljIGNyZWF0ZVByb3BlcnR5TGlzdGluZygKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBwcm9wZXJ0eUFkZHJlc3M6IHN0cmluZywKICAgIC8vICAgc2hhcmVzOiB1aW50NjQsCiAgICAvLyAgIHByaWNlUGVyU2hhcmU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGR1cAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgZHVwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gYXNzZXJ0KHNoYXJlcyA+IDAsICdTaGFyZXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpCiAgICBkaWcgMgogICAgYXNzZXJ0IC8vIFNoYXJlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo0MwogICAgLy8gYXNzZXJ0KHByaWNlUGVyU2hhcmUgPiAwLCAnUHJpY2UgcGVyIHNoYXJlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKQogICAgYXNzZXJ0IC8vIFByaWNlIHBlciBzaGFyZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY29uc3QgYm94TWJyQ29zdDogdWludDY0ID0gMjUwMCArIDQwMCAqICgxOCArIDY4ICsgQnl0ZXMocHJvcGVydHlBZGRyZXNzKS5sZW5ndGgpCiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDg2IC8vIDg2CiAgICBkaWcgMQogICAgKwogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICBwdXNoaW50IDI1MDAgLy8gMjUwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGFzc2VydChtYnJQYXltZW50LmFtb3VudCA+PSBib3hNYnJDb3N0LCAnTUJSIHBheW1lbnQgYW1vdW50IGlzIGluc3VmZmljaWVudCcpCiAgICBkaWcgNwogICAgZ3R4bnMgQW1vdW50CiAgICA8PQogICAgYXNzZXJ0IC8vIE1CUiBwYXltZW50IGFtb3VudCBpcyBpbnN1ZmZpY2llbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjU1CiAgICAvLyBhc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdNQlIgcGF5bWVudCBtdXN0IGJlIHRvIHRoZSBhcHAnKQogICAgZGlnIDYKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IGJlIHRvIHRoZSBhcHAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBhc3NlcnQobWJyUGF5bWVudC5zZW5kZXIgPT09IFR4bi5zZW5kZXIsICdNQlIgcGF5bWVudCBtdXN0IGJlIGZyb20gdGhlIGNhbGxlcicpCiAgICB1bmNvdmVyIDYKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IGJlIGZyb20gdGhlIGNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6NzYtODYKICAgIC8vIGNvbnN0IHR4blJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFzc2V0Q29uZmlnKHsKICAgIC8vICAgICBhc3NldE5hbWU6IEJ5dGVzKHByb3BlcnR5QWRkcmVzcykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCksCiAgICAvLyAgICAgdW5pdE5hbWU6ICdQUk9QJywKICAgIC8vICAgICB0b3RhbDogc2hhcmVzLAogICAgLy8gICAgIGRlY2ltYWxzOiAwLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gYXNzZXROYW1lOiBCeXRlcyhwcm9wZXJ0eUFkZHJlc3MpLnNsaWNlKDAsIDMyKS50b1N0cmluZygpLAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAxCiAgICA+PQogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgaW50Y18zIC8vIDMyCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyAzMgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciA1CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6ODMKICAgIC8vIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBkZWNpbWFsczogMCwKICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo3OQogICAgLy8gdW5pdE5hbWU6ICdQUk9QJywKICAgIHB1c2hieXRlcyAiUFJPUCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjc2LTg1CiAgICAvLyBjb25zdCB0eG5SZXN1bHQgPSBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgYXNzZXROYW1lOiBCeXRlcyhwcm9wZXJ0eUFkZHJlc3MpLnNsaWNlKDAsIDMyKS50b1N0cmluZygpLAogICAgLy8gICAgIHVuaXROYW1lOiAnUFJPUCcsCiAgICAvLyAgICAgdG90YWw6IHNoYXJlcywKICAgIC8vICAgICBkZWNpbWFsczogMCwKICAgIC8vICAgICBtYW5hZ2VyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIGZlZTogMCwKICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6NzYtODYKICAgIC8vIGNvbnN0IHR4blJlc3VsdCA9IGl0eG4KICAgIC8vICAgLmFzc2V0Q29uZmlnKHsKICAgIC8vICAgICBhc3NldE5hbWU6IEJ5dGVzKHByb3BlcnR5QWRkcmVzcykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCksCiAgICAvLyAgICAgdW5pdE5hbWU6ICdQUk9QJywKICAgIC8vICAgICB0b3RhbDogc2hhcmVzLAogICAgLy8gICAgIGRlY2ltYWxzOiAwLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHByb3BlcnR5QXNzZXRJZDogbmV3IGFyYzQuVWludDY0KGFzc2V0SWQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG93bmVyQWRkcmVzczogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjYwLTY3CiAgICAvLyBjb25zdCBwcm9wZXJ0eVN0cnVjdCA9IG5ldyBQcm9wZXJ0eVN0cnVjdCh7CiAgICAvLyAgIGFkZHJlc3M6IG5ldyBhcmM0LlN0cihwcm9wZXJ0eUFkZHJlc3MpLAogICAgLy8gICB0b3RhbFNoYXJlczogbmV3IGFyYzQuVWludDY0KHNoYXJlcyksCiAgICAvLyAgIGF2YWlsYWJsZVNoYXJlczogbmV3IGFyYzQuVWludDY0KHNoYXJlcyksCiAgICAvLyAgIHByaWNlUGVyU2hhcmU6IG5ldyBhcmM0LlVpbnQ2NChwcmljZVBlclNoYXJlKSwKICAgIC8vICAgcHJvcGVydHlBc3NldElkOiBuZXcgYXJjNC5VaW50NjQoYXNzZXRJZCksCiAgICAvLyAgIG93bmVyQWRkcmVzczogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vIH0pCiAgICBieXRlY18xIC8vIDB4MDA0MgogICAgZGlnIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gcHVibGljIGxpc3RlZFByb3BlcnRpZXMgPSBCb3hNYXA8dWludDY0LCBQcm9wZXJ0eVN0cnVjdD4oeyBrZXlQcmVmaXg6ICdwcm9wZXJ0aWVzJyB9KQogICAgYnl0ZWNfMCAvLyAicHJvcGVydGllcyIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyB0aGlzLmxpc3RlZFByb3BlcnRpZXMoYXNzZXRJZCkudmFsdWUgPSBjbG9uZShwcm9wZXJ0eVN0cnVjdCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czozNi00MQogICAgLy8gcHVibGljIGNyZWF0ZVByb3BlcnR5TGlzdGluZygKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBwcm9wZXJ0eUFkZHJlc3M6IHN0cmluZywKICAgIC8vICAgc2hhcmVzOiB1aW50NjQsCiAgICAvLyAgIHByaWNlUGVyU2hhcmU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OkZyYWN0aW9uYWxSZWFsRXN0YXRlLnB1cmNoYXNlRnJvbUxpc3Rlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnB1cmNoYXNlRnJvbUxpc3RlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBwdWJsaWMgcHVyY2hhc2VGcm9tTGlzdGVyKHByb3BlcnR5SWQ6IHVpbnQ2NCwgc2hhcmVzOiB1aW50NjQsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IGJvb2xlYW4gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo5MwogICAgLy8gYXNzZXJ0KHNoYXJlcyA+IDAsICdNdXN0IHB1cmNoYXNlIGF0IGxlYXN0IG9uZSBzaGFyZScpCiAgICBkaWcgMQogICAgYXNzZXJ0IC8vIE11c3QgcHVyY2hhc2UgYXQgbGVhc3Qgb25lIHNoYXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gYXNzZXJ0KHRoaXMubGlzdGVkUHJvcGVydGllcyhwcm9wZXJ0eUlkKS5leGlzdHMsICdQcm9wZXJ0eSBub3QgbGlzdGVkJykKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIHB1YmxpYyBsaXN0ZWRQcm9wZXJ0aWVzID0gQm94TWFwPHVpbnQ2NCwgUHJvcGVydHlTdHJ1Y3Q+KHsga2V5UHJlZml4OiAncHJvcGVydGllcycgfSkKICAgIGJ5dGVjXzAgLy8gInByb3BlcnRpZXMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBhc3NlcnQodGhpcy5saXN0ZWRQcm9wZXJ0aWVzKHByb3BlcnR5SWQpLmV4aXN0cywgJ1Byb3BlcnR5IG5vdCBsaXN0ZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBQcm9wZXJ0eSBub3QgbGlzdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo5OC0xMDQKICAgIC8vIGFzc2VydE1hdGNoKHBheW1lbnQsIHsKICAgIC8vICAgYW1vdW50OiBzaGFyZXMgKiBwcm9wZXJ0eS5wcmljZVBlclNoYXJlLmFzVWludDY0KCksCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyAgIHJla2V5VG86IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vIH0sICdJbnZhbGlkIHBheW1lbnQgdHJhbnNhY3Rpb24nKQogICAgZGlnIDEKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OTkKICAgIC8vIGFtb3VudDogc2hhcmVzICogcHJvcGVydHkucHJpY2VQZXJTaGFyZS5hc1VpbnQ2NCgpLAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBidG9pCiAgICBkaWcgNQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OTgtMTA0CiAgICAvLyBhc3NlcnRNYXRjaChwYXltZW50LCB7CiAgICAvLyAgIGFtb3VudDogc2hhcmVzICogcHJvcGVydHkucHJpY2VQZXJTaGFyZS5hc1VpbnQ2NCgpLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICByZWtleVRvOiBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyB9LCAnSW52YWxpZCBwYXltZW50IHRyYW5zYWN0aW9uJykKICAgIGRpZyAyCiAgICA9PQogICAgZGlnIDQKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo5OC0xMDQKICAgIC8vIGFzc2VydE1hdGNoKHBheW1lbnQsIHsKICAgIC8vICAgYW1vdW50OiBzaGFyZXMgKiBwcm9wZXJ0eS5wcmljZVBlclNoYXJlLmFzVWludDY0KCksCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgc2VuZGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyAgIHJla2V5VG86IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vIH0sICdJbnZhbGlkIHBheW1lbnQgdHJhbnNhY3Rpb24nKQogICAgPT0KICAgICYmCiAgICBkaWcgNAogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjk4LTEwNAogICAgLy8gYXNzZXJ0TWF0Y2gocGF5bWVudCwgewogICAgLy8gICBhbW91bnQ6IHNoYXJlcyAqIHByb3BlcnR5LnByaWNlUGVyU2hhcmUuYXNVaW50NjQoKSwKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBzZW5kZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgcmVrZXlUbzogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gfSwgJ0ludmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicpCiAgICA9PQogICAgJiYKICAgIGRpZyA0CiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OTgtMTA0CiAgICAvLyBhc3NlcnRNYXRjaChwYXltZW50LCB7CiAgICAvLyAgIGFtb3VudDogc2hhcmVzICogcHJvcGVydHkucHJpY2VQZXJTaGFyZS5hc1VpbnQ2NCgpLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICByZWtleVRvOiBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyB9LCAnSW52YWxpZCBwYXltZW50IHRyYW5zYWN0aW9uJykKICAgID09CiAgICAmJgogICAgdW5jb3ZlciA0CiAgICBndHhucyBSZWtleVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIHJla2V5VG86IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OTgtMTA0CiAgICAvLyBhc3NlcnRNYXRjaChwYXltZW50LCB7CiAgICAvLyAgIGFtb3VudDogc2hhcmVzICogcHJvcGVydHkucHJpY2VQZXJTaGFyZS5hc1VpbnQ2NCgpLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHNlbmRlcjogVHhuLnNlbmRlciwKICAgIC8vICAgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICByZWtleVRvOiBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyB9LCAnSW52YWxpZCBwYXltZW50IHRyYW5zYWN0aW9uJykKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBhc3NlcnQoc2hhcmVzIDw9IHByb3BlcnR5LmF2YWlsYWJsZVNoYXJlcy5hc1VpbnQ2NCgpLCAnTm90IGVub3VnaCBzaGFyZXMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDQKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggc2hhcmVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGNvbnN0IGFzc2V0ID0gQXNzZXQocHJvcGVydHkucHJvcGVydHlBc3NldElkLmFzVWludDY0KCkpCiAgICBkaWcgMwogICAgcHVzaGludCAyNiAvLyAyNgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjEwOS0xMjEKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoCiAgICAvLyAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBzaGFyZXMsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KSwKICAgIC8vICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwcm9wZXJ0eS5vd25lckFkZHJlc3MuYnl0ZXMsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KSwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMTAtMTE1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBhc3NldEFtb3VudDogc2hhcmVzLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGZlZTogMCwKICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTE2LTEyMAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgcmVjZWl2ZXI6IHByb3BlcnR5Lm93bmVyQWRkcmVzcy5ieXRlcywKICAgIC8vICAgZmVlOiAwLAogICAgLy8gfSksCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gcmVjZWl2ZXI6IHByb3BlcnR5Lm93bmVyQWRkcmVzcy5ieXRlcywKICAgIGRpZyA0CiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBpbnRjXzMgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjExNi0xMjAKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgIHJlY2VpdmVyOiBwcm9wZXJ0eS5vd25lckFkZHJlc3MuYnl0ZXMsCiAgICAvLyAgIGZlZTogMCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gZmVlOiAwLAogICAgaW50Y18yIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxMDktMTIxCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogc2hhcmVzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSksCiAgICAvLyAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogcHJvcGVydHkub3duZXJBZGRyZXNzLmJ5dGVzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSksCiAgICAvLyApCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTIzCiAgICAvLyB0aGlzLnVwZGF0ZUF2YWlsYWJsZVNoYXJlcyhwcm9wZXJ0eUlkLCBwcm9wZXJ0eS5hdmFpbGFibGVTaGFyZXMuYXNVaW50NjQoKSAtIHNoYXJlcykKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA1CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IHByb3BlcnR5U3RydWN0ID0gY2xvbmUodGhpcy5saXN0ZWRQcm9wZXJ0aWVzKHByb3BlcnR5SWQpLnZhbHVlKQogICAgZGlnIDQKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyAuLi5wcm9wZXJ0eVN0cnVjdCwKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkaWcgNQogICAgcHVzaGludCAyIC8vIDIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyBhdmFpbGFibGVTaGFyZXM6IG5ldyBhcmM0LlVpbnQ2NChuZXdBdmFpbGFibGVTaGFyZXMpLAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxNDgtMTUxCiAgICAvLyBjb25zdCB1cGRhdGVkU3RydWN0ID0gbmV3IFByb3BlcnR5U3RydWN0KHsKICAgIC8vICAgLi4ucHJvcGVydHlTdHJ1Y3QsCiAgICAvLyAgIGF2YWlsYWJsZVNoYXJlczogbmV3IGFyYzQuVWludDY0KG5ld0F2YWlsYWJsZVNoYXJlcyksCiAgICAvLyB9KQogICAgYnl0ZWNfMSAvLyAweDAwNDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyB0aGlzLmxpc3RlZFByb3BlcnRpZXMocHJvcGVydHlJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkU3RydWN0KQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OTIKICAgIC8vIHB1YmxpYyBwdXJjaGFzZUZyb21MaXN0ZXIocHJvcGVydHlJZDogdWludDY0LCBzaGFyZXM6IHVpbnQ2NCwgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogYm9vbGVhbiB7CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czo6RnJhY3Rpb25hbFJlYWxFc3RhdGUuZGVsaXN0UHJvcGVydHlbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxpc3RQcm9wZXJ0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gcHVibGljIGRlbGlzdFByb3BlcnR5KHByb3BlcnR5SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBhc3NlcnQodGhpcy5saXN0ZWRQcm9wZXJ0aWVzKHByb3BlcnR5SWQpLmV4aXN0cywgJ1Byb3BlcnR5IG5vdCBsaXN0ZWQnKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIHB1YmxpYyBsaXN0ZWRQcm9wZXJ0aWVzID0gQm94TWFwPHVpbnQ2NCwgUHJvcGVydHlTdHJ1Y3Q+KHsga2V5UHJlZml4OiAncHJvcGVydGllcycgfSkKICAgIGJ5dGVjXzAgLy8gInByb3BlcnRpZXMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gYXNzZXJ0KHRoaXMubGlzdGVkUHJvcGVydGllcyhwcm9wZXJ0eUlkKS5leGlzdHMsICdQcm9wZXJ0eSBub3QgbGlzdGVkJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUHJvcGVydHkgbm90IGxpc3RlZAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gcHJvcGVydHkub3duZXJBZGRyZXNzLm5hdGl2ZSwgJ09ubHkgdGhlIG93bmVyIGNhbiBkZWxpc3QnKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgb3duZXIgY2FuIGRlbGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyBwcm9wZXJ0eS5hdmFpbGFibGVTaGFyZXMuYXNVaW50NjQoKSA9PT0gcHJvcGVydHkudG90YWxTaGFyZXMuYXNVaW50NjQoKSwKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCAyIC8vIDIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjEzNi0xMzkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgcHJvcGVydHkuYXZhaWxhYmxlU2hhcmVzLmFzVWludDY0KCkgPT09IHByb3BlcnR5LnRvdGFsU2hhcmVzLmFzVWludDY0KCksCiAgICAvLyAgICdDYW5ub3QgZGVsaXN0IHByb3BlcnR5IHdpdGggc29sZCBzaGFyZXMnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIENhbm5vdCBkZWxpc3QgcHJvcGVydHkgd2l0aCBzb2xkIHNoYXJlcwogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyB0aGlzLmxpc3RlZFByb3BlcnRpZXMocHJvcGVydHlJZCkuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBwdWJsaWMgZGVsaXN0UHJvcGVydHkocHJvcGVydHlJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6OkZyYWN0aW9uYWxSZWFsRXN0YXRlLmdldFByb3BlcnR5SW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFByb3BlcnR5SW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9GcmFjdGlvbmFsUmVhbEVzdGF0ZS9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxNTgKICAgIC8vIGFzc2VydCh0aGlzLmxpc3RlZFByb3BlcnRpZXMocHJvcGVydHlJZCkuZXhpc3RzLCAnUHJvcGVydHkgbm90IGxpc3RlZCcpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gcHVibGljIGxpc3RlZFByb3BlcnRpZXMgPSBCb3hNYXA8dWludDY0LCBQcm9wZXJ0eVN0cnVjdD4oeyBrZXlQcmVmaXg6ICdwcm9wZXJ0aWVzJyB9KQogICAgYnl0ZWNfMCAvLyAicHJvcGVydGllcyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5saXN0ZWRQcm9wZXJ0aWVzKHByb3BlcnR5SWQpLmV4aXN0cywgJ1Byb3BlcnR5IG5vdCBsaXN0ZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBQcm9wZXJ0eSBub3QgbGlzdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvRnJhY3Rpb25hbFJlYWxFc3RhdGUvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIHJldHVybiB0aGlzLmxpc3RlZFByb3BlcnRpZXMocHJvcGVydHlJZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL0ZyYWN0aW9uYWxSZWFsRXN0YXRlL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAECAEAICYDCnByb3BlcnRpZXMCAEIEFR98dTEbQQArMRkURDEYRIIEBDMdrFQECj3lHAQ7njlFBPPOUYQ2GgCOBAALAMUBlwHGADEZFDEYFBBEI0MxFiMJSTgQIxJENhoBSSRZgQIISwEVEkRJVwIANhoCSRUiEkRJFzYaA0kVIhJESRdLAkRESwMVgVZLAQiBkAMLgcQTCEsHOAgOREsGOAcyChJETwY4ADEAEkSxJEsBDyRLAk8CTSVLAg8lTwNPAk1PBU4CUjIKSbIqsikksiNPArIigARQUk9QsiWyJoEDshAksgGztDwWMQApSwRQTwRQTwNQSwJQTFBPAlAoSwJQSbxITL8qTFCwI0M2GgFJFSISRBc2GgJJFSISRBcxFiMJSTgQIxJESwFETwIWKExQSb1FAURLATgISwGBEiK6SRdLBQtLAhJLBDgHMgoSEEsEOAAxABIQSwQ4CTIDEhBPBDggMgMSEERLAoEKIroXSwRLAQ5ESwOBGiK6SRexMQBLB7ISshSyEYEEshAksgG2SwSBIiW6SbIHTwSyCCOyECSyAbNPAk8FCUsEvkhJJFlLARVSSwWBAiK6TwIWKU8CUExQTwRQTwNQTwJQTFBLAbxIv4AFFR98dYCwI0M2GgFJFSISRBcWKExQSb1FAUQxAEsBgSIluhJESYEKIroXSwGBAiK6FxJEvEgjQzYaAUkVIhJEFxYoTFBJvUUBRL5IKkxQsCND", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }