{ "name": "ReputationRegistry", "structs": { "Score": [ { "name": "agent_id", "type": "uint64" }, { "name": "jobs_paid", "type": "uint64" }, { "name": "volume_micro", "type": "uint64" }, { "name": "validated", "type": "uint64" }, { "name": "disputed", "type": "uint64" }, { "name": "first_at", "type": "uint64" }, { "name": "last_at", "type": "uint64" } ] }, "methods": [ { "name": "bootstrap", "args": [ { "type": "uint64", "name": "identity_app" }, { "type": "uint64", "name": "usdc_asset" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Point at the Identity Registry and fix the settlement asset.\nThe asset is set once and never changed, so a score always means the same thing. Without it accept_feedback would have to trust whatever asset a caller transferred, and reputation could be bought with a worthless one minted for the purpose.", "events": [], "recommendations": {} }, { "name": "set_validation_app", "args": [ { "type": "uint64", "name": "validation_app" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Name the contract allowed to write verdicts. Once, by the creator.\nSeparate from bootstrap purely because of deployment order: the ValidationRegistry does not exist yet when this one is bootstrapped, so it cannot be named there.", "events": [], "recommendations": {} }, { "name": "accept_feedback", "args": [ { "type": "axfer", "name": "payment" }, { "type": "uint64", "name": "server_agent_id" }, { "type": "uint64", "name": "client_agent_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Credit a server agent for one settled payment. Returns its new count.\nThe payment is passed as a TRANSACTION IN THIS GROUP, not as an id and an amount the caller supplies. That distinction is the whole point.\nThe previous signature took a 32-byte id and a number, and checked only that the id was 32 bytes long and unseen. Nothing tied either value to a transfer that had actually happened, so any 32 bytes bought a point of reputation \u2014 an audit found two counted payments on TestNet that resolve to no transaction at all, one of them 32 zero bytes. The docstring claiming a score \"cannot be inflated by anything that did not move USDC\" was simply untrue.\nNow the amount and the id are READ OFF the transfer the AVM has already validated, so they cannot be fabricated: to earn a point you must move the asset, in the same atomic group, in the same round.", "events": [], "recommendations": {} }, { "name": "recent", "args": [ { "type": "uint64", "name": "agent_id" }, { "type": "uint64", "name": "window_secs" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Has this agent been paid inside the last `window_secs`?\nDeliberately a boolean, not a windowed count. A real rolling window needs per-payment timestamps, and storing one box per payment is the `pd_` ledger this contract removed for being circular and unnecessary. Returning a count that silently meant \"lifetime\" would be worse than returning the one fact the stored data actually supports.\nReputation here does not decay, and that is a choice worth stating: a payment happened or it did not, and an agent that earned trust and then went quiet has not become untrustworthy. What a reader usually wants to know is whether it is still ACTIVE, which is this.", "events": [], "recommendations": {} }, { "name": "record_validation", "args": [ { "type": "uint64", "name": "server_agent_id" }, { "type": "bool", "name": "passed" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record a verdict against an agent's score. ValidationRegistry only.\nThe docstring used to say \"called by the Validation Registry\" and that was simply untrue on two counts: nothing called it, so `validated` and `disputed` sat at zero while jobs were being judged, and ANY address could have called it, so the two fields were writable by anyone who wanted a clean record.\nBoth are closed here. validation_response now makes this call, and the caller is checked against the app id set at deployment \u2014 an address calling directly has a caller_application_id of 0 and is refused.", "events": [], "recommendations": {} }, { "name": "get_score", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "Score" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 3, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "identity_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aWRlbnRpdHlfYXBw" }, "usdc_asset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY19hc3NldA==" }, "validation_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmFsaWRhdGlvbl9hcHA=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "scores": { "keyType": "uint64", "valueType": "Score", "prefix": "c2Nf" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 280 ], "errorMessage": "a zero-value payment earns nothing" }, { "pc": [ 199 ], "errorMessage": "already bootstrapped" }, { "pc": [ 236 ], "errorMessage": "already set" }, { "pc": [ 301 ], "errorMessage": "an agent cannot pay itself into a reputation" }, { "pc": [ 334, 376 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ 197, 306 ], "errorMessage": "check self.identity_app exists" }, { "pc": [ 477, 602, 658 ], "errorMessage": "check self.scores entry exists" }, { "pc": [ 289 ], "errorMessage": "check self.usdc_asset exists" }, { "pc": [ 234, 519 ], "errorMessage": "check self.validation_app exists" }, { "pc": [ 193 ], "errorMessage": "creator only" }, { "pc": [ 515 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 342, 384 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 179, 187, 224, 266, 274, 442, 452, 507, 586 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 521 ], "errorMessage": "no validation app is set, so no verdict can be trusted" }, { "pc": [ 525 ], "errorMessage": "only the ValidationRegistry may record a verdict" }, { "pc": [ 165 ], "errorMessage": "only the creator may delete" }, { "pc": [ 230 ], "errorMessage": "only the creator may set this" }, { "pc": [ 291 ], "errorMessage": "reputation is denominated in one asset; this transfer is not it" }, { "pc": [ 390 ], "errorMessage": "the payment did not come from the agent being credited as the client" }, { "pc": [ 348 ], "errorMessage": "the payment did not go to the agent being credited" }, { "pc": [ 202 ], "errorMessage": "the settlement asset must be set" }, { "pc": [ 258 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 239 ], "errorMessage": "validation app id required" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NzM2MzVmICJpZGVudGl0eV9hcHAiICJ2YWxpZGF0aW9uX2FwcCIgInVzZGNfYXNzZXQiIDB4MTUxZjdjNzU4MCAweGM3Yjk3MDYzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo1MAogICAgLy8gc2VsZi5pZGVudGl0eV9hcHAgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NTEtNTMKICAgIC8vICMgV2hpY2ggYXNzZXQgY291bnRzLiBTZXQgYXQgYm9vdHN0cmFwOyBhIHRyYW5zZmVyIG9mIGFueXRoaW5nIGVsc2UKICAgIC8vICMgaXMgcmVmdXNlZCByYXRoZXIgdGhhbiBzaWxlbnRseSBjcmVkaXRlZC4KICAgIC8vIHNlbGYudXNkY19hc3NldCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNCAvLyAidXNkY19hc3NldCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NTUtNTgKICAgIC8vICMgVGhlIFZhbGlkYXRpb25SZWdpc3RyeSwgYW5kIHRoZSBPTkxZIGNhbGxlciBhbGxvd2VkIHRvIHdyaXRlIGEKICAgIC8vICMgdmVyZGljdC4gU2V0IHNlcGFyYXRlbHkgZnJvbSBib290c3RyYXAgYmVjYXVzZSB2YWxpZGF0aW9uIGlzIGRlcGxveWVkCiAgICAvLyAjIGFmdGVyIHRoaXMgY29udHJhY3QgYW5kIGNhbm5vdCBuYW1lIGl0c2VsZiBiZWZvcmUgaXQgZXhpc3RzLgogICAgLy8gc2VsZi52YWxpZGF0aW9uX2FwcCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdGlvbl9hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NDgKICAgIC8vIGNsYXNzIFJlcHV0YXRpb25SZWdpc3RyeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE1CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1ZjA2ZTJkZSAweDRmNjY2OWY5IDB4MTQxODIzM2IgMHhiMzhhM2UxZCAweDNiNTA1ZGE2IDB4MjQ3ZTkwYTAgLy8gbWV0aG9kICJib290c3RyYXAodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJzZXRfdmFsaWRhdGlvbl9hcHAodWludDY0KWJvb2wiLCBtZXRob2QgImFjY2VwdF9mZWVkYmFjayhheGZlcix1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicmVjZW50KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAicmVjb3JkX3ZhbGlkYXRpb24odWludDY0LGJvb2wpYm9vbCIsIG1ldGhvZCAiZ2V0X3Njb3JlKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGJvb3RzdHJhcCBzZXRfdmFsaWRhdGlvbl9hcHAgYWNjZXB0X2ZlZWRiYWNrIHJlY2VudCByZWNvcmRfdmFsaWRhdGlvbiBnZXRfc2NvcmUKICAgIGVycgoKbWFpbl9iYXJlX3JvdXRpbmdAMTU6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo0OAogICAgLy8gY2xhc3MgUmVwdXRhdGlvblJlZ2lzdHJ5KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gTm9PcAogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2IG1haW5fZGVsZXRlQDE3CiAgICBlcnIKCm1haW5fZGVsZXRlQDE3OgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTkzCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjAxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAib25seSB0aGUgY3JlYXRvciBtYXkgZGVsZXRlIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNyZWF0b3IgbWF5IGRlbGV0ZQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTkzCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNjoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyByZXB1dGF0aW9uX3JlZ2lzdHJ5LlJlcHV0YXRpb25SZWdpc3RyeS5ib290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo3NQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImNyZWF0b3Igb25seSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjcmVhdG9yIG9ubHkKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5Ojc2CiAgICAvLyBhc3NlcnQgc2VsZi5pZGVudGl0eV9hcHAgPT0gMCwgImFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pZGVudGl0eV9hcHAgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5Ojc3CiAgICAvLyBhc3NlcnQgdXNkY19hc3NldC5uYXRpdmUgIT0gMCwgInRoZSBzZXR0bGVtZW50IGFzc2V0IG11c3QgYmUgc2V0IgogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gdGhlIHNldHRsZW1lbnQgYXNzZXQgbXVzdCBiZSBzZXQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5Ojc4CiAgICAvLyBzZWxmLmlkZW50aXR5X2FwcCA9IGlkZW50aXR5X2FwcC5uYXRpdmUKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo3OQogICAgLy8gc2VsZi51c2RjX2Fzc2V0ID0gdXNkY19hc3NldC5uYXRpdmUKICAgIGJ5dGVjIDQgLy8gInVzZGNfYXNzZXQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHJlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LnNldF92YWxpZGF0aW9uX2FwcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF92YWxpZGF0aW9uX2FwcDoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjkwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAib25seSB0aGUgY3JlYXRvciBtYXkgc2V0IHRoaXMiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY3JlYXRvciBtYXkgc2V0IHRoaXMKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjkxCiAgICAvLyBhc3NlcnQgc2VsZi52YWxpZGF0aW9uX2FwcCA9PSAwLCAiYWxyZWFkeSBzZXQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidmFsaWRhdGlvbl9hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudmFsaWRhdGlvbl9hcHAgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBzZXQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjkyCiAgICAvLyBhc3NlcnQgdmFsaWRhdGlvbl9hcHAubmF0aXZlID4gMCwgInZhbGlkYXRpb24gYXBwIGlkIHJlcXVpcmVkIgogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gdmFsaWRhdGlvbiBhcHAgaWQgcmVxdWlyZWQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjkzCiAgICAvLyBzZWxmLnZhbGlkYXRpb25fYXBwID0gdmFsaWRhdGlvbl9hcHAubmF0aXZlCiAgICBieXRlY18zIC8vICJ2YWxpZGF0aW9uX2FwcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuYWNjZXB0X2ZlZWRiYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjZXB0X2ZlZWRiYWNrOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEzNQogICAgLy8gYXNzZXJ0IHBheW1lbnQuYXNzZXRfYW1vdW50ID4gMCwgImEgemVyby12YWx1ZSBwYXltZW50IGVhcm5zIG5vdGhpbmciCiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGEgemVyby12YWx1ZSBwYXltZW50IGVhcm5zIG5vdGhpbmcKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEzNwogICAgLy8gcGF5bWVudC54ZmVyX2Fzc2V0LmlkID09IHNlbGYudXNkY19hc3NldAogICAgZGlnIDMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVzZGNfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19hc3NldCBleGlzdHMKICAgID09CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxMzYtMTM4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHBheW1lbnQueGZlcl9hc3NldC5pZCA9PSBzZWxmLnVzZGNfYXNzZXQKICAgIC8vICksICJyZXB1dGF0aW9uIGlzIGRlbm9taW5hdGVkIGluIG9uZSBhc3NldDsgdGhpcyB0cmFuc2ZlciBpcyBub3QgaXQiCiAgICBhc3NlcnQgLy8gcmVwdXRhdGlvbiBpcyBkZW5vbWluYXRlZCBpbiBvbmUgYXNzZXQ7IHRoaXMgdHJhbnNmZXIgaXMgbm90IGl0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxNDAKICAgIC8vIHNlcnZlcl9hZ2VudF9pZC5uYXRpdmUgIT0gY2xpZW50X2FnZW50X2lkLm5hdGl2ZQogICAgZGlnIDIKICAgIGJ0b2kKICAgIGRpZyAyCiAgICBidG9pCiAgICBkaWcgMQogICAgIT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEzOS0xNDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkLm5hdGl2ZSAhPSBjbGllbnRfYWdlbnRfaWQubmF0aXZlCiAgICAvLyApLCAiYW4gYWdlbnQgY2Fubm90IHBheSBpdHNlbGYgaW50byBhIHJlcHV0YXRpb24iCiAgICBhc3NlcnQgLy8gYW4gYWdlbnQgY2Fubm90IHBheSBpdHNlbGYgaW50byBhIHJlcHV0YXRpb24KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE0My0xNTkKICAgIC8vICMgVEhFIG1vbmV5IG11c3QgaGF2ZSBnb25lIHRvIFRIRSBhZ2VudCBiZWluZyBjcmVkaXRlZC4KICAgIC8vICMKICAgIC8vICMgUmVhZGluZyB0aGUgYW1vdW50IG9mZiBhIHJlYWwgdHJhbnNmZXIgc3RvcHBlZCBzY29yZXMgYmVpbmcgbWludGVkIGZyb20KICAgIC8vICMgaW52ZW50ZWQgYnl0ZXMsIGJ1dCBvbiBpdHMgb3duIGl0IHN0aWxsIGNyZWRpdGVkIHdoaWNoZXZlciBpZCB0aGUgY2FsbGVyCiAgICAvLyAjIG5hbWVkLiBBbnlvbmUgY291bGQgbW92ZSBvbmUgbWljcm9VU0RDIGJldHdlZW4gdHdvIGFkZHJlc3NlcyB0aGV5IG93bmVkCiAgICAvLyAjIGFuZCBjcmVkaXQgYSBzdHJhbmdlcidzIGFnZW50IOKAlCBvciwgd2l0aCB0d28gaWRzLCB0aGVtc2VsdmVzLiBUaGUKICAgIC8vICMgaWQtaW5lcXVhbGl0eSBjaGVjayBhYm92ZSBkb2VzIG5vdCBoZWxwOiBpZHMgYXJlIG5vdCBpZGVudGl0aWVzLgogICAgLy8gIwogICAgLy8gIyBTbyByZXNvbHZlIGJvdGggZW5kcyBhZ2FpbnN0IHRoZSBJZGVudGl0eVJlZ2lzdHJ5LCB3aGljaCBpcyB0aGUgb25seQogICAgLy8gIyBwbGFjZSBhbiBhZGRyZXNzLXRvLWlkIGJpbmRpbmcgaXMgYXV0aGVudGljYXRlZCAobmV3X2FnZW50IHRha2VzIHRoZQogICAgLy8gIyBvd25lciBmcm9tIFR4bi5zZW5kZXIpLiBBIGNyZWRpdCBub3cgcmVxdWlyZXMgdGhlIHBheW1lbnQgdG8gaGF2ZSBiZWVuCiAgICAvLyAjIHNlbnQgQlkgdGhlIGNsaWVudCdzIHJlZ2lzdGVyZWQgYWRkcmVzcyBUTyB0aGUgc2VydmVyJ3MuCiAgICAvLyBzZXJ2ZXJfYWRkciwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5BZGRyZXNzXSgKICAgIC8vICAgICAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIsCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkLAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE1OAogICAgLy8gYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pZGVudGl0eV9hcHAgZXhpc3RzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTQzLTE1OQogICAgLy8gIyBUSEUgbW9uZXkgbXVzdCBoYXZlIGdvbmUgdG8gVEhFIGFnZW50IGJlaW5nIGNyZWRpdGVkLgogICAgLy8gIwogICAgLy8gIyBSZWFkaW5nIHRoZSBhbW91bnQgb2ZmIGEgcmVhbCB0cmFuc2ZlciBzdG9wcGVkIHNjb3JlcyBiZWluZyBtaW50ZWQgZnJvbQogICAgLy8gIyBpbnZlbnRlZCBieXRlcywgYnV0IG9uIGl0cyBvd24gaXQgc3RpbGwgY3JlZGl0ZWQgd2hpY2hldmVyIGlkIHRoZSBjYWxsZXIKICAgIC8vICMgbmFtZWQuIEFueW9uZSBjb3VsZCBtb3ZlIG9uZSBtaWNyb1VTREMgYmV0d2VlbiB0d28gYWRkcmVzc2VzIHRoZXkgb3duZWQKICAgIC8vICMgYW5kIGNyZWRpdCBhIHN0cmFuZ2VyJ3MgYWdlbnQg4oCUIG9yLCB3aXRoIHR3byBpZHMsIHRoZW1zZWx2ZXMuIFRoZQogICAgLy8gIyBpZC1pbmVxdWFsaXR5IGNoZWNrIGFib3ZlIGRvZXMgbm90IGhlbHA6IGlkcyBhcmUgbm90IGlkZW50aXRpZXMuCiAgICAvLyAjCiAgICAvLyAjIFNvIHJlc29sdmUgYm90aCBlbmRzIGFnYWluc3QgdGhlIElkZW50aXR5UmVnaXN0cnksIHdoaWNoIGlzIHRoZSBvbmx5CiAgICAvLyAjIHBsYWNlIGFuIGFkZHJlc3MtdG8taWQgYmluZGluZyBpcyBhdXRoZW50aWNhdGVkIChuZXdfYWdlbnQgdGFrZXMgdGhlCiAgICAvLyAjIG93bmVyIGZyb20gVHhuLnNlbmRlcikuIEEgY3JlZGl0IG5vdyByZXF1aXJlcyB0aGUgcGF5bWVudCB0byBoYXZlIGJlZW4KICAgIC8vICMgc2VudCBCWSB0aGUgY2xpZW50J3MgcmVnaXN0ZXJlZCBhZGRyZXNzIFRPIHRoZSBzZXJ2ZXIncy4KICAgIC8vIHNlcnZlcl9hZGRyLCBfdHhuID0gYXJjNC5hYmlfY2FsbFthcmM0LkFkZHJlc3NdKAogICAgLy8gICAgICJhZ2VudF9hZGRyZXNzKHVpbnQ2NClhZGRyZXNzIiwKICAgIC8vICAgICBzZXJ2ZXJfYWdlbnRfaWQsCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgLy8gKQogICAgYnl0ZWMgNiAvLyBtZXRob2QgImFnZW50X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICBleHRyYWN0IDQgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxNjEKICAgIC8vIHBheW1lbnQuYXNzZXRfcmVjZWl2ZXIgPT0gc2VydmVyX2FkZHIubmF0aXZlCiAgICBkaWcgNQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE2MC0xNjIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5hc3NldF9yZWNlaXZlciA9PSBzZXJ2ZXJfYWRkci5uYXRpdmUKICAgIC8vICksICJ0aGUgcGF5bWVudCBkaWQgbm90IGdvIHRvIHRoZSBhZ2VudCBiZWluZyBjcmVkaXRlZCIKICAgIGFzc2VydCAvLyB0aGUgcGF5bWVudCBkaWQgbm90IGdvIHRvIHRoZSBhZ2VudCBiZWluZyBjcmVkaXRlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTY0LTE2OAogICAgLy8gY2xpZW50X2FkZHIsIF90eG4yID0gYXJjNC5hYmlfY2FsbFthcmM0LkFkZHJlc3NdKAogICAgLy8gICAgICJhZ2VudF9hZGRyZXNzKHVpbnQ2NClhZGRyZXNzIiwKICAgIC8vICAgICBjbGllbnRfYWdlbnRfaWQsCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA2IC8vIG1ldGhvZCAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIGV4dHJhY3QgNCAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE3MAogICAgLy8gcGF5bWVudC5zZW5kZXIgPT0gY2xpZW50X2FkZHIubmF0aXZlCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIFNlbmRlcgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE2OS0xNzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5zZW5kZXIgPT0gY2xpZW50X2FkZHIubmF0aXZlCiAgICAvLyApLCAidGhlIHBheW1lbnQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGFnZW50IGJlaW5nIGNyZWRpdGVkIGFzIHRoZSBjbGllbnQiCiAgICBhc3NlcnQgLy8gdGhlIHBheW1lbnQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGFnZW50IGJlaW5nIGNyZWRpdGVkIGFzIHRoZSBjbGllbnQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE4NQogICAgLy8gcyA9IHNlbGYuX3RvdWNoKHNpZCkKICAgIGR1cAogICAgY2FsbHN1YiBfdG91Y2gKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE4NgogICAgLy8gcy5qb2JzX3BhaWQgPSBhcmM0LlVJbnQ2NChzLmpvYnNfcGFpZC5uYXRpdmUgKyAxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA4CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxODcKICAgIC8vIHMudm9sdW1lX21pY3JvID0gYXJjNC5VSW50NjQocy52b2x1bWVfbWljcm8ubmF0aXZlICsgcGF5bWVudC5hc3NldF9hbW91bnQpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE2CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxODgKICAgIC8vIHMubGFzdF9hdCA9IGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmVwbGFjZTIgNDgKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE4OQogICAgLy8gc2VsZi5zY29yZXNbc2lkXSA9IHMuY29weSgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzM2MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxOTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzLmpvYnNfcGFpZC5uYXRpdmUpCiAgICBleHRyYWN0IDggOAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyByZXB1dGF0aW9uX3JlZ2lzdHJ5LlJlcHV0YXRpb25SZWdpc3RyeS5yZWNlbnRbcm91dGluZ10oKSAtPiB2b2lkOgpyZWNlbnQ6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjE4CiAgICAvLyBhaWQgPSBhZ2VudF9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIxOQogICAgLy8gaWYgYWlkIG5vdCBpbiBzZWxmLnNjb3JlczoKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHg3MzYzNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiByZWNlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICBwb3BuIDIKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMAogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChGYWxzZSkgICMgbm9xYTogRkJUMDAzCiAgICBwdXNoYnl0ZXMgMHgwMAoKcmVjZW50X2FmdGVyX2lubGluZWRfcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkucmVjZW50QDQ6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVjZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMQogICAgLy8gbGFzdCA9IHNlbGYuc2NvcmVzW2FpZF0ubGFzdF9hdC5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjb3JlcyBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMjIKICAgIC8vIHJldHVybiBhcmM0LkJvb2woR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gbGFzdCArIHdpbmRvd19zZWNzLm5hdGl2ZSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHVuY292ZXIgMgogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICArCiAgICA8PQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmVjZW50X2FmdGVyX2lubGluZWRfcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkucmVjZW50QDQKCgovLyByZXB1dGF0aW9uX3JlZ2lzdHJ5LlJlcHV0YXRpb25SZWdpc3RyeS5yZWNvcmRfdmFsaWRhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlY29yZF92YWxpZGF0aW9uOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMzgKICAgIC8vIGFzc2VydCBzZWxmLnZhbGlkYXRpb25fYXBwICE9IDAsICJubyB2YWxpZGF0aW9uIGFwcCBpcyBzZXQsIHNvIG5vIHZlcmRpY3QgY2FuIGJlIHRydXN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidmFsaWRhdGlvbl9hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudmFsaWRhdGlvbl9hcHAgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBubyB2YWxpZGF0aW9uIGFwcCBpcyBzZXQsIHNvIG5vIHZlcmRpY3QgY2FuIGJlIHRydXN0ZWQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI0MAogICAgLy8gR2xvYmFsLmNhbGxlcl9hcHBsaWNhdGlvbl9pZCA9PSBzZWxmLnZhbGlkYXRpb25fYXBwCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIzOS0yNDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmNhbGxlcl9hcHBsaWNhdGlvbl9pZCA9PSBzZWxmLnZhbGlkYXRpb25fYXBwCiAgICAvLyApLCAib25seSB0aGUgVmFsaWRhdGlvblJlZ2lzdHJ5IG1heSByZWNvcmQgYSB2ZXJkaWN0IgogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIFZhbGlkYXRpb25SZWdpc3RyeSBtYXkgcmVjb3JkIGEgdmVyZGljdAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjQyCiAgICAvLyBzaWQgPSBzZXJ2ZXJfYWdlbnRfaWQubmF0aXZlCiAgICBzd2FwCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI0MwogICAgLy8gcyA9IHNlbGYuX3RvdWNoKHNpZCkKICAgIGNhbGxzdWIgX3RvdWNoCiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNDQKICAgIC8vIGlmIHBhc3NlZC5uYXRpdmU6CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieiByZWNvcmRfdmFsaWRhdGlvbl9lbHNlX2JvZHlAMwogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjQ1CiAgICAvLyBzLnZhbGlkYXRlZCA9IGFyYzQuVUludDY0KHMudmFsaWRhdGVkLm5hdGl2ZSArIDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMjQKCnJlY29yZF92YWxpZGF0aW9uX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI0OAogICAgLy8gcy5sYXN0X2F0ID0gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXBsYWNlMiA0OAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjQ5CiAgICAvLyBzZWxmLnNjb3Jlc1tzaWRdID0gcy5jb3B5KCkKICAgIGRpZyAxCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzM2MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyZWNvcmRfdmFsaWRhdGlvbl9lbHNlX2JvZHlAMzoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI0NwogICAgLy8gcy5kaXNwdXRlZCA9IGFyYzQuVUludDY0KHMuZGlzcHV0ZWQubmF0aXZlICsgMSkKICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICBiIHJlY29yZF92YWxpZGF0aW9uX2FmdGVyX2lmX2Vsc2VANAoKCi8vIHJlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LmdldF9zY29yZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9zY29yZToKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNTQKICAgIC8vIGFpZCA9IGFnZW50X2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjU1CiAgICAvLyBpZiBhaWQgaW4gc2VsZi5zY29yZXM6CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzM2MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfc2NvcmVfYWZ0ZXJfaWZfZWxzZUAzCiAgICBidXJ5IDEKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI1NgogICAgLy8gcmV0dXJuIHNlbGYuc2NvcmVzW2FpZF0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjb3JlcyBlbnRyeSBleGlzdHMKCmdldF9zY29yZV9hZnRlcl9pbmxpbmVkX3JlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LmdldF9zY29yZUA0OgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF9zY29yZV9hZnRlcl9pZl9lbHNlQDM6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI1NwogICAgLy8gbm93ID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI2MgogICAgLy8gam9ic19wYWlkPWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI2NgogICAgLy8gZmlyc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI1OC0yNjgKICAgIC8vICMgQW4gdW5rbm93biBhZ2VudCByZWFkcyBhcyBhbGwtemVybyByYXRoZXIgdGhhbiBlcnJvcmluZzogIm5vIHJlY29yZCIgaXMKICAgIC8vICMgYSByZWFsIGFuc3dlciBhbmQgdGhlIGNhbGxlciBzaG91bGQgcmVuZGVyIGl0IGFzIHN1Y2guCiAgICAvLyByZXR1cm4gU2NvcmUoCiAgICAvLyAgICAgYWdlbnRfaWQ9YXJjNC5VSW50NjQoYWlkKSwKICAgIC8vICAgICBqb2JzX3BhaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdm9sdW1lX21pY3JvPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIHZhbGlkYXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkaXNwdXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBmaXJzdF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIGxhc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X3Njb3JlX2FmdGVyX2lubGluZWRfcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuZ2V0X3Njb3JlQDQKCgovLyByZXB1dGF0aW9uX3JlZ2lzdHJ5LlJlcHV0YXRpb25SZWdpc3RyeS5fdG91Y2goYWdlbnRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl90b3VjaDoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5Ojk2LTk3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF90b3VjaChzZWxmLCBhZ2VudF9pZDogVUludDY0KSAtPiBTY29yZToKICAgIHByb3RvIDEgMQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6OTgKICAgIC8vIG5vdyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo5OQogICAgLy8gaWYgYWdlbnRfaWQgaW4gc2VsZi5zY29yZXM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweDczNjM1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX3RvdWNoX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTAwCiAgICAvLyByZXR1cm4gc2VsZi5zY29yZXNbYWdlbnRfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NvcmVzIGVudHJ5IGV4aXN0cwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl90b3VjaF9hZnRlcl9pZl9lbHNlQDI6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMwogICAgLy8gam9ic19wYWlkPWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNwogICAgLy8gZmlyc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTAxLTEwOQogICAgLy8gcmV0dXJuIFNjb3JlKAogICAgLy8gICAgIGFnZW50X2lkPWFyYzQuVUludDY0KGFnZW50X2lkKSwKICAgIC8vICAgICBqb2JzX3BhaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdm9sdW1lX21pY3JvPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIHZhbGlkYXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkaXNwdXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBmaXJzdF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIGxhc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEIICYHBBUffHUDc2NfDGlkZW50aXR5X2FwcA52YWxpZGF0aW9uX2FwcAp1c2RjX2Fzc2V0BRUffHWABMe5cGMxGEAACioiZycEImcrImcxG0EAOTEZFEQxGESCBgRfBuLeBE9mafkEFBgjOwSzij4dBDtQXaYEJH6QoDYaAI4GABwASQBoASMBZAGyACKBBTEZjgIADAABADEYRDEAMgkSRCNDMRgUQzYaAUkVJBJENhoCSRUkEkQxADIJEkQiKmVEFEQXSURMFypMZycETGcnBbAjQzYaAUkVJBJEMQAyCRJEIitlRBREF0lEK0xnJwWwI0MxFiMJSTgQgQQSRDYaAUkVJBJENhoCSRUkEkRLAjgSSURLAzgRIicEZUQSREsCF0sCF0sBE0SxIiplREmyGCcGshpPBLIagQayECKyAbO0PklXAAQoEkRXBABJFSUSREsFOBQSRLGyGCcGshpPArIagQayECKyAbO0PklXAAQoEkRXBABJFSUSRE8DOAASREmIAPNJJFsjCBZcCEmBEFtPAwgWXBAyBxZcMEwWKUxQSwG/VwgIKExQsCNDNhoBSRUkEkQ2GgJJTgIVJBJEFxYpTFBJvUUBQAALRgKAAQAoTFCwI0O+RIEwWzIHTwIXTwIIDoABACJPAlRC/+I2GgFJFSQSRDYaAkkVIxJEIitlRElEMg0SREwXSU4CiABoTCJTQQAbSYEYWyMIFlwYMgcWXDBLARYpTFBMvycFsCNDSSVbIwgWXCBC/+M2GgFHAhUkEkQXFilMUEm9RQFBAApFAb5EKExQsCNDSDIHIhZMFk8CSwJQSwJQSwJQTwJQSwFQTFBC/92KAQEyB4v/FkkpTFBJvUUBQQAFvkSMAIlIIhZPAhZPAksCUEsCUEsCUE8CUEsBUExQiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }