{ "name": "BloopUSDC", "structs": {}, "methods": [ { "name": "register", "args": [ { "type": "pay", "name": "pay" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Stake ALGO (\u2265 1 ALGO) to open a USDC credit line.\nPreconditions: - pay.receiver == application address - pay.amount >= 1_000_000 (1 ALGO) - stake_amount[sender] == 0 (not already registered)\nMutates: - stake_amount[sender] = pay.amount - total_agents += 1", "events": [ { "name": "AgentRegistered", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "stake" } ] } ], "recommendations": {} }, { "name": "configure_usdc", "args": [ { "type": "uint64", "name": "usdc_asset" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opt the contract into the USDC ASA and store its ID.\nMust be called once by the creator before any draws are possible. Fund the contract with an extra 0.2 ALGO for the ASA opt-in MBR before calling this method.\nPreconditions: - Txn.sender == Global.creator_address - usdc_asa_id == 0 (not yet configured)\nMutates: - usdc_asa_id = usdc_asset.id - inner AssetTransfer opt-in (0 amount, self-to-self)", "events": [], "recommendations": {} }, { "name": "seed_treasury", "args": [ { "type": "axfer", "name": "axfer" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Fund the USDC treasury so agents can draw from it.\nOpen to any caller \u2014 this allows the auto-swap flow where an agent swaps ALGO\u2192USDC via Tinyman and immediately seeds the treasury in the same atomic transaction group as their draw.\nPreconditions: - axfer.xfer_asset.id == usdc_asa_id - axfer.asset_receiver == application address - axfer.asset_amount > 0", "events": [], "recommendations": {} }, { "name": "draw_usdc", "args": [ { "type": "uint64", "name": "amount" }, { "type": "byte[32]", "name": "attestation_hash" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Draw undercollateralised USDC credit.\nSends `amount` micro-USDC to Txn.sender via inner AssetTransfer.\nInterest is calculated at the agent's tier APR for one day. Total repayable = amount + interest is tracked in usdc_outstanding.\nPreconditions: - usdc_asa_id > 0 (contract configured) - stake_amount[sender] > 0 (registered) - usdc_outstanding[sender] == 0 (no existing USDC debt) - amount <= tier per-draw cap - daily_drawn[sender] + amount <= tier daily cap - usdc_treasury_balance >= amount", "events": [ { "name": "UsdcDrawn", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "interest" }, { "type": "uint64", "name": "outstanding" } ] } ], "recommendations": {} }, { "name": "draw_and_pay", "args": [ { "type": "uint64", "name": "amount" }, { "type": "address", "name": "payee" }, { "type": "byte[32]", "name": "attestation_hash" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Draw USDC credit and send it directly to `payee` in one atomic step.\nThis is the x402 payment primitive: the contract acts as the USDC sender, forwarding `amount` micro-USDC from the treasury to `payee` while charging the debt to Txn.sender's credit line.\nPreconditions: - All the same as draw_usdc - payee must be a valid, opted-in Algorand address\nx402 flow: 1. Agent calls draw_and_pay(amount, merchant_address, hash) 2. Contract forwards USDC to merchant via inner AssetTransfer 3. Agent has usdc_outstanding += amount + interest 4. Agent repays later via repay_usdc()", "events": [ { "name": "UsdcX402Paid", "args": [ { "type": "address", "name": "agent" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "outstanding" } ], "desc": "Emitted when draw_and_pay() sends USDC directly to a payee." } ], "recommendations": {} }, { "name": "repay_usdc", "args": [ { "type": "axfer", "name": "axfer" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Repay outstanding USDC credit by sending USDC to the contract.\nPreconditions: - axfer.xfer_asset.id == usdc_asa_id - axfer.asset_receiver == application address - axfer.asset_amount > 0\nMutates: - usdc_outstanding[sender] -= repay_amt (floor 0) - usdc_treasury_balance += repay_amt - payment_count[sender] += 1 (if debt fully cleared)", "events": [ { "name": "UsdcRepaid", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "outstanding" } ] } ], "recommendations": {} }, { "name": "record_payment", "args": [ { "type": "uint64", "name": "amount" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record a USDC payment to build reputation.\nPreconditions: - Agent is registered (stake_amount > 0)\nMutates: - payment_count[sender] += 1\nEmits: UsdcPaymentRecorded Returns: current tier number (0-3) as arc4.UInt64", "events": [ { "name": "UsdcPaymentRecorded", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "tier" } ] } ], "recommendations": {} }, { "name": "get_position", "args": [ { "type": "address", "name": "agent" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Read an agent's full USDC position.\nReturns (all arc4.UInt64): 0: usdc_outstanding \u2014 micro-USDC owed 1: usdc_treasury_balance \u2014 total micro-USDC in treasury 2: payment_count \u2014 total completed repayments 3: stake_amount \u2014 ALGO staked (microALGO) 4: tier \u2014 current tier (0\u20133)", "events": [], "recommendations": {} }, { "name": "enable_attestation", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Switch from demo-bypass to production attestation mode.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n Standalone USDC credit contract.\n\n Global state schema: 4 \u00d7 uint64\n usdc_asa_id, usdc_treasury_balance, skip_attestation, total_agents\n\n Local state schema: 5 \u00d7 uint64\n stake_amount, payment_count, usdc_outstanding, daily_drawn, day_start_round\n ", "networks": {}, "state": { "schema": { "global": { "ints": 4, "bytes": 0 }, "local": { "ints": 5, "bytes": 0 } }, "keys": { "global": { "usdc_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY19hc2FfaWQ=" }, "usdc_treasury_balance": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY190cmVhc3VyeV9iYWxhbmNl" }, "skip_attestation": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c2tpcF9hdHRlc3RhdGlvbg==" }, "total_agents": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxfYWdlbnRz" } }, "local": { "stake_amount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3Rha2VfYW1vdW50" }, "payment_count": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF5bWVudF9jb3VudA==" }, "usdc_outstanding": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY19vdXRzdGFuZGluZw==" }, "daily_drawn": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGFpbHlfZHJhd24=" }, "day_start_round": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGF5X3N0YXJ0X3JvdW5k" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [ "OptIn" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 441 ], "errorMessage": "Already configured" }, { "pc": [ 362 ], "errorMessage": "Already registered" }, { "pc": [ 499, 1290 ], "errorMessage": "Amount must be > 0" }, { "pc": [ 482 ], "errorMessage": "Call configure_usdc first" }, { "pc": [ 660, 810, 826, 835, 1041, 1190, 1206, 1215 ], "errorMessage": "Exceeds daily cap" }, { "pc": [ 637, 851, 867, 876, 1018, 1231, 1247, 1256 ], "errorMessage": "Exceeds draw cap" }, { "pc": [ 668, 1049 ], "errorMessage": "Insufficient treasury" }, { "pc": [ 580, 961 ], "errorMessage": "Invalid attestation" }, { "pc": [ 353 ], "errorMessage": "Minimum stake is 1 ALGO" }, { "pc": [ 495, 1285 ], "errorMessage": "Must send to contract" }, { "pc": [ 547, 928, 1393 ], "errorMessage": "Not registered" }, { "pc": [ 435, 1514 ], "errorMessage": "Only creator" }, { "pc": [ 555, 936 ], "errorMessage": "Outstanding USDC debt \u2014 repay first" }, { "pc": [ 344 ], "errorMessage": "Payment must be to application" }, { "pc": [ 539, 920 ], "errorMessage": "USDC not configured" }, { "pc": [ 488, 1278 ], "errorMessage": "Wrong ASA" }, { "pc": [ 644, 1025 ], "errorMessage": "check self.daily_drawn exists for account" }, { "pc": [ 587, 968 ], "errorMessage": "check self.day_start_round exists for account" }, { "pc": [ 616, 997, 1318, 1400, 1411, 1455, 1476 ], "errorMessage": "check self.payment_count exists for account" }, { "pc": [ 563, 944 ], "errorMessage": "check self.skip_attestation exists" }, { "pc": [ 360, 546, 927, 1392, 1484 ], "errorMessage": "check self.stake_amount exists for account" }, { "pc": [ 397 ], "errorMessage": "check self.total_agents exists" }, { "pc": [ 439, 480, 538, 695, 919, 1076, 1276 ], "errorMessage": "check self.usdc_asa_id exists" }, { "pc": [ 553, 934, 1302, 1346, 1464 ], "errorMessage": "check self.usdc_outstanding exists for account" }, { "pc": [ 503, 664, 730, 1045, 1115, 1327, 1469 ], "errorMessage": "check self.usdc_treasury_balance exists" }, { "pc": [ 534, 904, 915, 1450 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 428, 523, 893, 1385 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 476, 1269 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 337 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA0IDg2NDAwIDIwMDAwMDAgNTAwMDAwIDUwMDAwMDAgMjUwMDAwMDAgMzE1MzYwMDAwMDAwIDEwMDAwMDAwIDEwMDAwMAogICAgYnl0ZWNibG9jayAidXNkY190cmVhc3VyeV9iYWxhbmNlIiAicGF5bWVudF9jb3VudCIgInVzZGNfb3V0c3RhbmRpbmciICJ1c2RjX2FzYV9pZCIgImRhaWx5X2RyYXduIiAic3Rha2VfYW1vdW50IiAiZGF5X3N0YXJ0X3JvdW5kIiAic2tpcF9hdHRlc3RhdGlvbiIgInRvdGFsX2FnZW50cyIgMHgxNTFmN2M3NQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjE1MAogICAgLy8gc2VsZi51c2RjX2FzYV9pZCAgICAgICAgICAgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18zIC8vICJ1c2RjX2FzYV9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjE1MQogICAgLy8gc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18wIC8vICJ1c2RjX3RyZWFzdXJ5X2JhbGFuY2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNTIKICAgIC8vIHNlbGYuc2tpcF9hdHRlc3RhdGlvbiAgICAgID0gR2xvYmFsU3RhdGUoVUludDY0KDEpKSAgIyBkZW1vIGJ5IGRlZmF1bHQKICAgIGJ5dGVjIDcgLy8gInNraXBfYXR0ZXN0YXRpb24iCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNTMKICAgIC8vIHNlbGYudG90YWxfYWdlbnRzICAgICAgICAgID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgOCAvLyAidG90YWxfYWdlbnRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxMjUKICAgIC8vIGNsYXNzIEJsb29wVVNEQyhhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTgKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNDBkZDBkIDB4Y2MwYjEwMWYgMHhkNTNlZGI1ZCAweGFjOWQwZDQxIDB4MTY2OGRmY2QgMHgxYjQ4Njg0MCAweDJiODkwNmMyIDB4NjA1ZGUwY2IgMHg3Y2FmYWVmMyAvLyBtZXRob2QgInJlZ2lzdGVyKHBheSl2b2lkIiwgbWV0aG9kICJjb25maWd1cmVfdXNkYyh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2VlZF90cmVhc3VyeShheGZlcil2b2lkIiwgbWV0aG9kICJkcmF3X3VzZGModWludDY0LGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgImRyYXdfYW5kX3BheSh1aW50NjQsYWRkcmVzcyxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZXBheV91c2RjKGF4ZmVyKXZvaWQiLCBtZXRob2QgInJlY29yZF9wYXltZW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9wb3NpdGlvbihhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZW5hYmxlX2F0dGVzdGF0aW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmVnaXN0ZXIgY29uZmlndXJlX3VzZGMgc2VlZF90cmVhc3VyeSBkcmF3X3VzZGMgZHJhd19hbmRfcGF5IHJlcGF5X3VzZGMgcmVjb3JkX3BheW1lbnQgZ2V0X3Bvc2l0aW9uIGVuYWJsZV9hdHRlc3RhdGlvbgogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxODoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxMjUKICAgIC8vIGNsYXNzIEJsb29wVVNEQyhhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOSBtYWluX29wdF9pbkAyMAogICAgZXJyCgptYWluX29wdF9pbkAyMDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTY4CiAgICAvLyBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSAgICA9IFVJbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAic3Rha2VfYW1vdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNjkKICAgIC8vIHNlbGYucGF5bWVudF9jb3VudFtUeG4uc2VuZGVyXSAgID0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vICJwYXltZW50X2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNzAKICAgIC8vIHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSA9IFVJbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAidXNkY19vdXRzdGFuZGluZyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTcxCiAgICAvLyBzZWxmLmRhaWx5X2RyYXduW1R4bi5zZW5kZXJdICAgICA9IFVJbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNCAvLyAiZGFpbHlfZHJhd24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjE3MgogICAgLy8gc2VsZi5kYXlfc3RhcnRfcm91bmRbVHhuLnNlbmRlcl0gPSBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDYgLy8gImRheV9zdGFydF9yb3VuZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTY1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBibG9vcGFfdXNkYy5CbG9vcFVTREMucmVnaXN0ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxNzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTkzCiAgICAvLyBwYXkucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTkyLTE5NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwYXkucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIlBheW1lbnQgbXVzdCBiZSB0byBhcHBsaWNhdGlvbiIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwbGljYXRpb24KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToxOTUKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID49IFVJbnQ2NCgxXzAwMF8wMDApLCAiTWluaW11bSBzdGFrZSBpcyAxIEFMR08iCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgcHVzaGludCAxMDAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIE1pbmltdW0gc3Rha2UgaXMgMSBBTEdPCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTk3CiAgICAvLyBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSA9PSBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzdGFrZV9hbW91bnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFrZV9hbW91bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MTk2LTE5OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSA9PSBVSW50NjQoMCkKICAgIC8vICksICJBbHJlYWR5IHJlZ2lzdGVyZWQiCiAgICBhc3NlcnQgLy8gQWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjAwCiAgICAvLyBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSAgICAgPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJzdGFrZV9hbW91bnQiCiAgICBkaWcgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjIwMQogICAgLy8gc2VsZi5wYXltZW50X2NvdW50W1R4bi5zZW5kZXJdICAgID0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vICJwYXltZW50X2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMDIKICAgIC8vIHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSA9IFVJbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAidXNkY19vdXRzdGFuZGluZyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjAzCiAgICAvLyBzZWxmLmRhaWx5X2RyYXduW1R4bi5zZW5kZXJdICAgICAgPSBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDQgLy8gImRhaWx5X2RyYXduIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMDQKICAgIC8vIHNlbGYuZGF5X3N0YXJ0X3JvdW5kW1R4bi5zZW5kZXJdICA9IG9wLkdsb2JhbC5yb3VuZAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNiAvLyAiZGF5X3N0YXJ0X3JvdW5kIgogICAgZ2xvYmFsIFJvdW5kCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjA1CiAgICAvLyBzZWxmLnRvdGFsX2FnZW50cy52YWx1ZSAgICAgICAgICArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9hZ2VudHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfYWdlbnRzIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjIDggLy8gInRvdGFsX2FnZW50cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjA5CiAgICAvLyBhZ2VudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjEwCiAgICAvLyBzdGFrZT1hcmM0LlVJbnQ2NChwYXkuYW1vdW50KSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMDgtMjExCiAgICAvLyBBZ2VudFJlZ2lzdGVyZWQoCiAgICAvLyAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIHN0YWtlPWFyYzQuVUludDY0KHBheS5hbW91bnQpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjA3LTIxMgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEFnZW50UmVnaXN0ZXJlZCgKICAgIC8vICAgICAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgICAgICBzdGFrZT1hcmM0LlVJbnQ2NChwYXkuYW1vdW50KSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg4OTM1YWY5ZCAvLyBtZXRob2QgIkFnZW50UmVnaXN0ZXJlZChhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gYmxvb3BhX3VzZGMuQmxvb3BVU0RDLmNvbmZpZ3VyZV91c2RjW3JvdXRpbmddKCkgLT4gdm9pZDoKY29uZmlndXJlX3VzZGM6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjM2CiAgICAvLyBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMzUtMjM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgLy8gKSwgIk9ubHkgY3JlYXRvciIKICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMzkKICAgIC8vIHNlbGYudXNkY19hc2FfaWQudmFsdWUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidXNkY19hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19hc2FfaWQgZXhpc3RzCiAgICAhCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjM4LTI0MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnVzZGNfYXNhX2lkLnZhbHVlID09IFVJbnQ2NCgwKQogICAgLy8gKSwgIkFscmVhZHkgY29uZmlndXJlZCIKICAgIGFzc2VydCAvLyBBbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyNDItMjQ3CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD11c2RjX2Fzc2V0LmlkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI0NgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyNDQKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI0NQogICAgLy8gYXNzZXRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI0MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI0Mi0yNDcKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXVzZGNfYXNzZXQuaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI0OQogICAgLy8gc2VsZi51c2RjX2FzYV9pZC52YWx1ZSA9IHVzZGNfYXNzZXQuaWQKICAgIGJ5dGVjXzMgLy8gInVzZGNfYXNhX2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGJsb29wYV91c2RjLkJsb29wVVNEQy5zZWVkX3RyZWFzdXJ5W3JvdXRpbmddKCkgLT4gdm9pZDoKc2VlZF90cmVhc3VyeToKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI3MAogICAgLy8gc2VsZi51c2RjX2FzYV9pZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVzZGNfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfYXNhX2lkIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI2OS0yNzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi51c2RjX2FzYV9pZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgLy8gKSwgIkNhbGwgY29uZmlndXJlX3VzZGMgZmlyc3QiCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYWxsIGNvbmZpZ3VyZV91c2RjIGZpcnN0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjczCiAgICAvLyBheGZlci54ZmVyX2Fzc2V0LmlkID09IHNlbGYudXNkY19hc2FfaWQudmFsdWUKICAgIGRpZyAxCiAgICBndHhucyBYZmVyQXNzZXQKICAgID09CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjcyLTI3NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci54ZmVyX2Fzc2V0LmlkID09IHNlbGYudXNkY19hc2FfaWQudmFsdWUKICAgIC8vICksICJXcm9uZyBBU0EiCiAgICBhc3NlcnQgLy8gV3JvbmcgQVNBCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6Mjc2CiAgICAvLyBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI3NS0yNzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXhmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIk11c3Qgc2VuZCB0byBjb250cmFjdCIKICAgIGFzc2VydCAvLyBNdXN0IHNlbmQgdG8gY29udHJhY3QKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyNzgKICAgIC8vIGFzc2VydCBheGZlci5hc3NldF9hbW91bnQgPiBVSW50NjQoMCksICJBbW91bnQgbXVzdCBiZSA+IDAiCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gQW1vdW50IG11c3QgYmUgPiAwCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MjgwCiAgICAvLyBzZWxmLnVzZGNfdHJlYXN1cnlfYmFsYW5jZS52YWx1ZSArPSBheGZlci5hc3NldF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ1c2RjX3RyZWFzdXJ5X2JhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY190cmVhc3VyeV9iYWxhbmNlIGV4aXN0cwogICAgKwogICAgYnl0ZWNfMCAvLyAidXNkY190cmVhc3VyeV9iYWxhbmNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGJsb29wYV91c2RjLkJsb29wVVNEQy5kcmF3X3VzZGNbcm91dGluZ10oKSAtPiB2b2lkOgpkcmF3X3VzZGM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjI4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMwOQogICAgLy8gc2VsZi51c2RjX2FzYV9pZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVzZGNfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfYXNhX2lkIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMwOC0zMTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi51c2RjX2FzYV9pZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgLy8gKSwgIlVTREMgbm90IGNvbmZpZ3VyZWQiCiAgICBhc3NlcnQgLy8gVVNEQyBub3QgY29uZmlndXJlZAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMxMgogICAgLy8gc2VsZi5zdGFrZV9hbW91bnRbVHhuLnNlbmRlcl0gPiBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzdGFrZV9hbW91bnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFrZV9hbW91bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzExLTMxMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSA+IFVJbnQ2NCgwKQogICAgLy8gKSwgIk5vdCByZWdpc3RlcmVkIgogICAgYXNzZXJ0IC8vIE5vdCByZWdpc3RlcmVkCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzE1CiAgICAvLyBzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0gPT0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidXNkY19vdXRzdGFuZGluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfb3V0c3RhbmRpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAhCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzE0LTMxNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0gPT0gVUludDY0KDApCiAgICAvLyApLCAiT3V0c3RhbmRpbmcgVVNEQyBkZWJ0IOKAlCByZXBheSBmaXJzdCIKICAgIGFzc2VydCAvLyBPdXRzdGFuZGluZyBVU0RDIGRlYnQg4oCUIHJlcGF5IGZpcnN0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzE4CiAgICAvLyBkcmF3X2FtdCA9IGFtb3VudC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMTkKICAgIC8vIGN1cnJlbnRfcm91bmQgPSBvcC5HbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMyMS0zMjIKICAgIC8vICMg4pSA4pSAIEF0dGVzdGF0aW9uIChza2lwIGluIGRlbW8gbW9kZSkg4pSA4pSACiAgICAvLyBpZiBzZWxmLnNraXBfYXR0ZXN0YXRpb24udmFsdWUgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInNraXBfYXR0ZXN0YXRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2tpcF9hdHRlc3RhdGlvbiBleGlzdHMKICAgIGJueiBkcmF3X3VzZGNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzI0CiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzI0LTMyNQogICAgLy8gVHhuLnNlbmRlci5ieXRlcwogICAgLy8gKyBhbW91bnQuYnl0ZXMKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMjYKICAgIC8vICsgb3AuaXRvYihjdXJyZW50X3JvdW5kKQogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMjQtMzI2CiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICAvLyArIGFtb3VudC5ieXRlcwogICAgLy8gKyBvcC5pdG9iKGN1cnJlbnRfcm91bmQpCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMjMtMzI3CiAgICAvLyBleHBlY3RlZCA9IG9wLnNoYTI1NigKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzCiAgICAvLyAgICAgKyBhbW91bnQuYnl0ZXMKICAgIC8vICAgICArIG9wLml0b2IoY3VycmVudF9yb3VuZCkKICAgIC8vICkKICAgIHNoYTI1NgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMyOAogICAgLy8gYXNzZXJ0IGF0dGVzdGF0aW9uX2hhc2guYnl0ZXMgPT0gZXhwZWN0ZWQsICJJbnZhbGlkIGF0dGVzdGF0aW9uIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhdHRlc3RhdGlvbgoKZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMzAtMzMxCiAgICAvLyAjIOKUgOKUgCBEYWlseSB3aW5kb3cgcmVzZXQg4pSA4pSACiAgICAvLyBlbGFwc2VkID0gY3VycmVudF9yb3VuZCAtIHNlbGYuZGF5X3N0YXJ0X3JvdW5kW1R4bi5zZW5kZXJdCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZGF5X3N0YXJ0X3JvdW5kIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X3N0YXJ0X3JvdW5kIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMzIKICAgIC8vIGlmIGVsYXBzZWQgPj0gREFZX0lOX1JPVU5EUzoKICAgIGludGMgNCAvLyA4NjQwMAogICAgPj0KICAgIGJ6IGRyYXdfdXNkY19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozMzMKICAgIC8vIHNlbGYuZGFpbHlfZHJhd25bVHhuLnNlbmRlcl0gICAgID0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA0IC8vICJkYWlseV9kcmF3biIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzM0CiAgICAvLyBzZWxmLmRheV9zdGFydF9yb3VuZFtUeG4uc2VuZGVyXSA9IGN1cnJlbnRfcm91bmQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDYgLy8gImRheV9zdGFydF9yb3VuZCIKICAgIGRpZyAyCiAgICBhcHBfbG9jYWxfcHV0CgpkcmF3X3VzZGNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMzNgogICAgLy8gdGllciA9IHNlbGYuX2dldF90aWVyKHNlbGYucGF5bWVudF9jb3VudFtUeG4uc2VuZGVyXSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwYXltZW50X2NvdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGF5bWVudF9jb3VudCBleGlzdHMgZm9yIGFjY291bnQKICAgIGNhbGxzdWIgX2dldF90aWVyCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjMzOC0zMzkKICAgIC8vICMg4pSA4pSAIFBlci1kcmF3IGNhcCDilIDilIAKICAgIC8vIGlmIHRpZXIgPT0gVUludDY0KDMpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgZHVwCiAgICBidXJ5IDYKICAgIGJ6IGRyYXdfdXNkY19lbHNlX2JvZHlANwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM0MAogICAgLy8gYXNzZXJ0IGRyYXdfYW10IDw9IFRJRVJfM19NQVhfRFJBVywgIkV4Y2VlZHMgZHJhdyBjYXAiCiAgICBkaWcgMQogICAgaW50YyA3IC8vIDUwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gRXhjZWVkcyBkcmF3IGNhcAoKZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzQ4LTM0OQogICAgLy8gIyDilIDilIAgRGFpbHkgY2FwIOKUgOKUgAogICAgLy8gbmV3X2RhaWx5ID0gc2VsZi5kYWlseV9kcmF3bltUeG4uc2VuZGVyXSArIGRyYXdfYW10CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZGFpbHlfZHJhd24iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYWlseV9kcmF3biBleGlzdHMgZm9yIGFjY291bnQKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDcKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNTAKICAgIC8vIGlmIHRpZXIgPT0gVUludDY0KDMpOgogICAgZGlnIDQKICAgIGJ6IGRyYXdfdXNkY19lbHNlX2JvZHlAMTYKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNTEKICAgIC8vIGFzc2VydCBuZXdfZGFpbHkgPD0gVElFUl8zX0RBSUxZX0NBUCwgIkV4Y2VlZHMgZGFpbHkgY2FwIgogICAgZGlnIDYKICAgIGludGMgOCAvLyAyNTAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAoKZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzYwCiAgICAvLyBzZWxmLnVzZGNfdHJlYXN1cnlfYmFsYW5jZS52YWx1ZSA+PSBkcmF3X2FtdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgZXhpc3RzCiAgICBkaWcgMgogICAgPj0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudXNkY190cmVhc3VyeV9iYWxhbmNlLnZhbHVlID49IGRyYXdfYW10CiAgICAvLyApLCAiSW5zdWZmaWNpZW50IHRyZWFzdXJ5IgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCB0cmVhc3VyeQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM2My0zNjQKICAgIC8vICMg4pSA4pSAIEludGVyZXN0IOKUgOKUgAogICAgLy8gaWYgdGllciA9PSBVSW50NjQoMyk6CiAgICBkaWcgNAogICAgYnogZHJhd191c2RjX2Vsc2VfYm9keUAyNQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM2NQogICAgLy8gYXByID0gVUludDY0KFRJRVJfM19BUFJfQlBTKQogICAgcHVzaGludCA0MDAKCmRyYXdfdXNkY19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM3MwogICAgLy8gaW50ZXJlc3QgPSAoZHJhd19hbXQgKiBhcHIgKiBEQVlfSU5fUk9VTkRTKSAvLyAoCiAgICBkaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIGludGMgNCAvLyA4NjQwMAogICAgKgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM3NAogICAgLy8gVUludDY0KDEwXzAwMCkgKiBST1VORFNfUEVSX1lFQVIKICAgIGludGMgOSAvLyAzMTUzNjAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNzMtMzc1CiAgICAvLyBpbnRlcmVzdCA9IChkcmF3X2FtdCAqIGFwciAqIERBWV9JTl9ST1VORFMpIC8vICgKICAgIC8vICAgICBVSW50NjQoMTBfMDAwKSAqIFJPVU5EU19QRVJfWUVBUgogICAgLy8gKQogICAgLwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM3Ny0zODMKICAgIC8vICMg4pSA4pSAIElubmVyIHRyYW5zZmVyOiBzZW5kIFVTREMgdG8gYWdlbnQg4pSA4pSACiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnVzZGNfYXNhX2lkLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWRyYXdfYW10LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzgyCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM3OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnVzZGNfYXNhX2lkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVzZGNfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfYXNhX2lkIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM4MAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6Mzc3LTM3OAogICAgLy8gIyDilIDilIAgSW5uZXIgdHJhbnNmZXI6IHNlbmQgVVNEQyB0byBhZ2VudCDilIDilIAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNzctMzgzCiAgICAvLyAjIOKUgOKUgCBJbm5lciB0cmFuc2Zlcjogc2VuZCBVU0RDIHRvIGFnZW50IOKUgOKUgAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi51c2RjX2FzYV9pZC52YWx1ZSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1kcmF3X2FtdCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozODUtMzg2CiAgICAvLyAjIOKUgOKUgCBVcGRhdGUgc3RhdGUg4pSA4pSACiAgICAvLyBzZWxmLmRhaWx5X2RyYXduW1R4bi5zZW5kZXJdICAgICAgPSBuZXdfZGFpbHkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDQgLy8gImRhaWx5X2RyYXduIgogICAgZGlnIDEwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6Mzg3CiAgICAvLyBzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0gPSBkcmF3X2FtdCArIGludGVyZXN0CiAgICBkdXAyCiAgICArCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18yIC8vICJ1c2RjX291dHN0YW5kaW5nIgogICAgZGlnIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozODgKICAgIC8vIHNlbGYudXNkY190cmVhc3VyeV9iYWxhbmNlLnZhbHVlIC09IGRyYXdfYW10CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidXNkY190cmVhc3VyeV9iYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfdHJlYXN1cnlfYmFsYW5jZSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgLQogICAgYnl0ZWNfMCAvLyAidXNkY190cmVhc3VyeV9iYWxhbmNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozOTIKICAgIC8vIGFnZW50PWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozOTQKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0KSwKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM5NQogICAgLy8gb3V0c3RhbmRpbmc9YXJjNC5VSW50NjQoZHJhd19hbXQgKyBpbnRlcmVzdCksCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozOTEtMzk2CiAgICAvLyBVc2RjRHJhd24oCiAgICAvLyAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChkcmF3X2FtdCksCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3QpLAogICAgLy8gICAgIG91dHN0YW5kaW5nPWFyYzQuVUludDY0KGRyYXdfYW10ICsgaW50ZXJlc3QpLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBkaWcgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzkwLTM5NwogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIFVzZGNEcmF3bigKICAgIC8vICAgICAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgICAgICBhbW91bnQ9YXJjNC5VSW50NjQoZHJhd19hbXQpLAogICAgLy8gICAgICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdCksCiAgICAvLyAgICAgICAgIG91dHN0YW5kaW5nPWFyYzQuVUludDY0KGRyYXdfYW10ICsgaW50ZXJlc3QpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDE4ZTUxNGQxIC8vIG1ldGhvZCAiVXNkY0RyYXduKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weToyODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZHJhd191c2RjX2Vsc2VfYm9keUAyNToKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNjYKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMik6CiAgICBkaWcgNQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBkcmF3X3VzZGNfZWxzZV9ib2R5QDI3CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzY3CiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8yX0FQUl9CUFMpCiAgICBwdXNoaW50IDkwMAogICAgYiBkcmF3X3VzZGNfYWZ0ZXJfaWZfZWxzZUAzMgoKZHJhd191c2RjX2Vsc2VfYm9keUAyNzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNjgKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X3VzZGNfZWxzZV9ib2R5QDI5CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzY5CiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8xX0FQUl9CUFMpCiAgICBwdXNoaW50IDE2MDAKICAgIGIgZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMzIKCmRyYXdfdXNkY19lbHNlX2JvZHlAMjk6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzcxCiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8wX0FQUl9CUFMpCiAgICBwdXNoaW50IDI0MDAKICAgIGIgZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMzIKCmRyYXdfdXNkY19lbHNlX2JvZHlAMTY6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzUyCiAgICAvLyBlbGlmIHRpZXIgPT0gVUludDY0KDIpOgogICAgZGlnIDUKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYnogZHJhd191c2RjX2Vsc2VfYm9keUAxOAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjM1MwogICAgLy8gYXNzZXJ0IG5ld19kYWlseSA8PSBUSUVSXzJfREFJTFlfQ0FQLCAiRXhjZWVkcyBkYWlseSBjYXAiCiAgICBkaWcgNgogICAgaW50YyAxMCAvLyAxMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAogICAgYiBkcmF3X3VzZGNfYWZ0ZXJfaWZfZWxzZUAyMwoKZHJhd191c2RjX2Vsc2VfYm9keUAxODoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNTQKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X3VzZGNfZWxzZV9ib2R5QDIwCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzU1CiAgICAvLyBhc3NlcnQgbmV3X2RhaWx5IDw9IFRJRVJfMV9EQUlMWV9DQVAsICJFeGNlZWRzIGRhaWx5IGNhcCIKICAgIGRpZyA2CiAgICBpbnRjIDUgLy8gMjAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAogICAgYiBkcmF3X3VzZGNfYWZ0ZXJfaWZfZWxzZUAyMwoKZHJhd191c2RjX2Vsc2VfYm9keUAyMDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNTcKICAgIC8vIGFzc2VydCBuZXdfZGFpbHkgPD0gVElFUl8wX0RBSUxZX0NBUCwgIkV4Y2VlZHMgZGFpbHkgY2FwIgogICAgZGlnIDYKICAgIGludGMgNiAvLyA1MDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gRXhjZWVkcyBkYWlseSBjYXAKICAgIGIgZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMjMKCmRyYXdfdXNkY19lbHNlX2JvZHlANzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNDEKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMik6CiAgICBkaWcgNQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBkcmF3X3VzZGNfZWxzZV9ib2R5QDkKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNDIKICAgIC8vIGFzc2VydCBkcmF3X2FtdCA8PSBUSUVSXzJfTUFYX0RSQVcsICJFeGNlZWRzIGRyYXcgY2FwIgogICAgZGlnIDEKICAgIGludGMgNSAvLyAyMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEV4Y2VlZHMgZHJhdyBjYXAKICAgIGIgZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMTQKCmRyYXdfdXNkY19lbHNlX2JvZHlAOToKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTozNDMKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X3VzZGNfZWxzZV9ib2R5QDExCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzQ0CiAgICAvLyBhc3NlcnQgZHJhd19hbXQgPD0gVElFUl8xX01BWF9EUkFXLCAiRXhjZWVkcyBkcmF3IGNhcCIKICAgIGRpZyAxCiAgICBpbnRjIDYgLy8gNTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEV4Y2VlZHMgZHJhdyBjYXAKICAgIGIgZHJhd191c2RjX2FmdGVyX2lmX2Vsc2VAMTQKCmRyYXdfdXNkY19lbHNlX2JvZHlAMTE6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6MzQ2CiAgICAvLyBhc3NlcnQgZHJhd19hbXQgPD0gVElFUl8wX01BWF9EUkFXLCAiRXhjZWVkcyBkcmF3IGNhcCIKICAgIGRpZyAxCiAgICBpbnRjIDExIC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRyYXcgY2FwCiAgICBiIGRyYXdfdXNkY19hZnRlcl9pZl9lbHNlQDE0CgoKLy8gYmxvb3BhX3VzZGMuQmxvb3BVU0RDLmRyYXdfYW5kX3BheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRyYXdfYW5kX3BheToKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDM2CiAgICAvLyBzZWxmLnVzZGNfYXNhX2lkLnZhbHVlID4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidXNkY19hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19hc2FfaWQgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDM1LTQzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnVzZGNfYXNhX2lkLnZhbHVlID4gVUludDY0KDApCiAgICAvLyApLCAiVVNEQyBub3QgY29uZmlndXJlZCIKICAgIGFzc2VydCAvLyBVU0RDIG5vdCBjb25maWd1cmVkCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDM5CiAgICAvLyBzZWxmLnN0YWtlX2Ftb3VudFtUeG4uc2VuZGVyXSA+IFVJbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInN0YWtlX2Ftb3VudCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YWtlX2Ftb3VudCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0MzgtNDQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3Rha2VfYW1vdW50W1R4bi5zZW5kZXJdID4gVUludDY0KDApCiAgICAvLyApLCAiTm90IHJlZ2lzdGVyZWQiCiAgICBhc3NlcnQgLy8gTm90IHJlZ2lzdGVyZWQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NDIKICAgIC8vIHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSA9PSBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ1c2RjX291dHN0YW5kaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19vdXRzdGFuZGluZyBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NDEtNDQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSA9PSBVSW50NjQoMCkKICAgIC8vICksICJPdXRzdGFuZGluZyBVU0RDIGRlYnQg4oCUIHJlcGF5IGZpcnN0IgogICAgYXNzZXJ0IC8vIE91dHN0YW5kaW5nIFVTREMgZGVidCDigJQgcmVwYXkgZmlyc3QKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NDUKICAgIC8vIGRyYXdfYW10ID0gYW1vdW50Lm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ0NgogICAgLy8gY3VycmVudF9yb3VuZCA9IG9wLkdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDQ4LTQ0OQogICAgLy8gIyDilIDilIAgQXR0ZXN0YXRpb24g4pSA4pSACiAgICAvLyBpZiBzZWxmLnNraXBfYXR0ZXN0YXRpb24udmFsdWUgPT0gVUludDY0KDApOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInNraXBfYXR0ZXN0YXRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2tpcF9hdHRlc3RhdGlvbiBleGlzdHMKICAgIGJueiBkcmF3X2FuZF9wYXlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDUxCiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDUxLTQ1MgogICAgLy8gVHhuLnNlbmRlci5ieXRlcwogICAgLy8gKyBhbW91bnQuYnl0ZXMKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NTMKICAgIC8vICsgb3AuaXRvYihjdXJyZW50X3JvdW5kKQogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NTEtNDUzCiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICAvLyArIGFtb3VudC5ieXRlcwogICAgLy8gKyBvcC5pdG9iKGN1cnJlbnRfcm91bmQpCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NTAtNDU0CiAgICAvLyBleHBlY3RlZCA9IG9wLnNoYTI1NigKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzCiAgICAvLyAgICAgKyBhbW91bnQuYnl0ZXMKICAgIC8vICAgICArIG9wLml0b2IoY3VycmVudF9yb3VuZCkKICAgIC8vICkKICAgIHNoYTI1NgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ1NQogICAgLy8gYXNzZXJ0IGF0dGVzdGF0aW9uX2hhc2guYnl0ZXMgPT0gZXhwZWN0ZWQsICJJbnZhbGlkIGF0dGVzdGF0aW9uIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhdHRlc3RhdGlvbgoKZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NTctNDU4CiAgICAvLyAjIOKUgOKUgCBEYWlseSB3aW5kb3cgcmVzZXQg4pSA4pSACiAgICAvLyBlbGFwc2VkID0gY3VycmVudF9yb3VuZCAtIHNlbGYuZGF5X3N0YXJ0X3JvdW5kW1R4bi5zZW5kZXJdCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZGF5X3N0YXJ0X3JvdW5kIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X3N0YXJ0X3JvdW5kIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NTkKICAgIC8vIGlmIGVsYXBzZWQgPj0gREFZX0lOX1JPVU5EUzoKICAgIGludGMgNCAvLyA4NjQwMAogICAgPj0KICAgIGJ6IGRyYXdfYW5kX3BheV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NjAKICAgIC8vIHNlbGYuZGFpbHlfZHJhd25bVHhuLnNlbmRlcl0gICAgID0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA0IC8vICJkYWlseV9kcmF3biIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDYxCiAgICAvLyBzZWxmLmRheV9zdGFydF9yb3VuZFtUeG4uc2VuZGVyXSA9IGN1cnJlbnRfcm91bmQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDYgLy8gImRheV9zdGFydF9yb3VuZCIKICAgIGRpZyAyCiAgICBhcHBfbG9jYWxfcHV0CgpkcmF3X2FuZF9wYXlfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ2MwogICAgLy8gdGllciA9IHNlbGYuX2dldF90aWVyKHNlbGYucGF5bWVudF9jb3VudFtUeG4uc2VuZGVyXSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwYXltZW50X2NvdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGF5bWVudF9jb3VudCBleGlzdHMgZm9yIGFjY291bnQKICAgIGNhbGxzdWIgX2dldF90aWVyCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ2NS00NjYKICAgIC8vICMg4pSA4pSAIFBlci1kcmF3IGNhcCDilIDilIAKICAgIC8vIGlmIHRpZXIgPT0gVUludDY0KDMpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgZHVwCiAgICBidXJ5IDcKICAgIGJ6IGRyYXdfYW5kX3BheV9lbHNlX2JvZHlANwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ2NwogICAgLy8gYXNzZXJ0IGRyYXdfYW10IDw9IFRJRVJfM19NQVhfRFJBVywgIkV4Y2VlZHMgZHJhdyBjYXAiCiAgICBkaWcgMQogICAgaW50YyA3IC8vIDUwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gRXhjZWVkcyBkcmF3IGNhcAoKZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDc1LTQ3NgogICAgLy8gIyDilIDilIAgRGFpbHkgY2FwIOKUgOKUgAogICAgLy8gbmV3X2RhaWx5ID0gc2VsZi5kYWlseV9kcmF3bltUeG4uc2VuZGVyXSArIGRyYXdfYW10CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZGFpbHlfZHJhd24iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYWlseV9kcmF3biBleGlzdHMgZm9yIGFjY291bnQKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDgKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NzcKICAgIC8vIGlmIHRpZXIgPT0gVUludDY0KDMpOgogICAgZGlnIDUKICAgIGJ6IGRyYXdfYW5kX3BheV9lbHNlX2JvZHlAMTYKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NzgKICAgIC8vIGFzc2VydCBuZXdfZGFpbHkgPD0gVElFUl8zX0RBSUxZX0NBUCwgIkV4Y2VlZHMgZGFpbHkgY2FwIgogICAgZGlnIDcKICAgIGludGMgOCAvLyAyNTAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAoKZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDg3CiAgICAvLyBzZWxmLnVzZGNfdHJlYXN1cnlfYmFsYW5jZS52YWx1ZSA+PSBkcmF3X2FtdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgZXhpc3RzCiAgICBkaWcgMgogICAgPj0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0ODYtNDg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYudXNkY190cmVhc3VyeV9iYWxhbmNlLnZhbHVlID49IGRyYXdfYW10CiAgICAvLyApLCAiSW5zdWZmaWNpZW50IHRyZWFzdXJ5IgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCB0cmVhc3VyeQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ5MC00OTEKICAgIC8vICMg4pSA4pSAIEludGVyZXN0IOKUgOKUgAogICAgLy8gaWYgdGllciA9PSBVSW50NjQoMyk6CiAgICBkaWcgNQogICAgYnogZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAyNQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ5MgogICAgLy8gYXByID0gVUludDY0KFRJRVJfM19BUFJfQlBTKQogICAgcHVzaGludCA0MDAKCmRyYXdfYW5kX3BheV9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjUwMAogICAgLy8gaW50ZXJlc3QgPSAoZHJhd19hbXQgKiBhcHIgKiBEQVlfSU5fUk9VTkRTKSAvLyAoCiAgICBkaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIGludGMgNCAvLyA4NjQwMAogICAgKgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjUwMQogICAgLy8gVUludDY0KDEwXzAwMCkgKiBST1VORFNfUEVSX1lFQVIKICAgIGludGMgOSAvLyAzMTUzNjAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MDAtNTAyCiAgICAvLyBpbnRlcmVzdCA9IChkcmF3X2FtdCAqIGFwciAqIERBWV9JTl9ST1VORFMpIC8vICgKICAgIC8vICAgICBVSW50NjQoMTBfMDAwKSAqIFJPVU5EU19QRVJfWUVBUgogICAgLy8gKQogICAgLwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjUwNC01MTAKICAgIC8vICMg4pSA4pSAIElubmVyIHRyYW5zZmVyOiBzZW5kIFVTREMgdG8gUEFZRUUgKG5vdCBzZW5kZXIpIOKUgOKUgAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi51c2RjX2FzYV9pZC52YWx1ZSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1wYXllZS5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWRyYXdfYW10LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTA5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjUwNgogICAgLy8geGZlcl9hc3NldD1zZWxmLnVzZGNfYXNhX2lkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVzZGNfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfYXNhX2lkIGV4aXN0cwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MDQtNTA1CiAgICAvLyAjIOKUgOKUgCBJbm5lciB0cmFuc2Zlcjogc2VuZCBVU0RDIHRvIFBBWUVFIChub3Qgc2VuZGVyKSDilIDilIAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MDQtNTEwCiAgICAvLyAjIOKUgOKUgCBJbm5lciB0cmFuc2Zlcjogc2VuZCBVU0RDIHRvIFBBWUVFIChub3Qgc2VuZGVyKSDilIDilIAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYudXNkY19hc2FfaWQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cGF5ZWUubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1kcmF3X2FtdCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MTItNTEzCiAgICAvLyAjIOKUgOKUgCBVcGRhdGUgc3RhdGUg4pSA4pSACiAgICAvLyBzZWxmLmRhaWx5X2RyYXduW1R4bi5zZW5kZXJdICAgICAgPSBuZXdfZGFpbHkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDQgLy8gImRhaWx5X2RyYXduIgogICAgZGlnIDEyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTE0CiAgICAvLyBzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0gPSBkcmF3X2FtdCArIGludGVyZXN0CiAgICBkaWcgMQogICAgKwogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAidXNkY19vdXRzdGFuZGluZyIKICAgIGRpZyAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTE1CiAgICAvLyBzZWxmLnVzZGNfdHJlYXN1cnlfYmFsYW5jZS52YWx1ZSAtPSBkcmF3X2FtdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTE5CiAgICAvLyBhZ2VudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTIyCiAgICAvLyBvdXRzdGFuZGluZz1hcmM0LlVJbnQ2NChkcmF3X2FtdCArIGludGVyZXN0KSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MTgtNTIzCiAgICAvLyBVc2RjWDQwMlBhaWQoCiAgICAvLyAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIHBheWVlPXBheWVlLAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChkcmF3X2FtdCksCiAgICAvLyAgICAgb3V0c3RhbmRpbmc9YXJjNC5VSW50NjQoZHJhd19hbXQgKyBpbnRlcmVzdCksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTE3LTUyNAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIFVzZGNYNDAyUGFpZCgKICAgIC8vICAgICAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgICAgICBwYXllZT1wYXllZSwKICAgIC8vICAgICAgICAgYW1vdW50PWFyYzQuVUludDY0KGRyYXdfYW10KSwKICAgIC8vICAgICAgICAgb3V0c3RhbmRpbmc9YXJjNC5VSW50NjQoZHJhd19hbXQgKyBpbnRlcmVzdCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4ODEwOTgwOWEgLy8gbWV0aG9kICJVc2RjWDQwMlBhaWQoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAyNToKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0OTMKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMik6CiAgICBkaWcgNgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBkcmF3X2FuZF9wYXlfZWxzZV9ib2R5QDI3CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDk0CiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8yX0FQUl9CUFMpCiAgICBwdXNoaW50IDkwMAogICAgYiBkcmF3X2FuZF9wYXlfYWZ0ZXJfaWZfZWxzZUAzMgoKZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAyNzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0OTUKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X2FuZF9wYXlfZWxzZV9ib2R5QDI5CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDk2CiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8xX0FQUl9CUFMpCiAgICBwdXNoaW50IDE2MDAKICAgIGIgZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMzIKCmRyYXdfYW5kX3BheV9lbHNlX2JvZHlAMjk6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDk4CiAgICAvLyBhcHIgPSBVSW50NjQoVElFUl8wX0FQUl9CUFMpCiAgICBwdXNoaW50IDI0MDAKICAgIGIgZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMzIKCmRyYXdfYW5kX3BheV9lbHNlX2JvZHlAMTY6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDc5CiAgICAvLyBlbGlmIHRpZXIgPT0gVUludDY0KDIpOgogICAgZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYnogZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAxOAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjQ4MAogICAgLy8gYXNzZXJ0IG5ld19kYWlseSA8PSBUSUVSXzJfREFJTFlfQ0FQLCAiRXhjZWVkcyBkYWlseSBjYXAiCiAgICBkaWcgNwogICAgaW50YyAxMCAvLyAxMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAogICAgYiBkcmF3X2FuZF9wYXlfYWZ0ZXJfaWZfZWxzZUAyMwoKZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAxODoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0ODEKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X2FuZF9wYXlfZWxzZV9ib2R5QDIwCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDgyCiAgICAvLyBhc3NlcnQgbmV3X2RhaWx5IDw9IFRJRVJfMV9EQUlMWV9DQVAsICJFeGNlZWRzIGRhaWx5IGNhcCIKICAgIGRpZyA3CiAgICBpbnRjIDUgLy8gMjAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRhaWx5IGNhcAogICAgYiBkcmF3X2FuZF9wYXlfYWZ0ZXJfaWZfZWxzZUAyMwoKZHJhd19hbmRfcGF5X2Vsc2VfYm9keUAyMDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0ODQKICAgIC8vIGFzc2VydCBuZXdfZGFpbHkgPD0gVElFUl8wX0RBSUxZX0NBUCwgIkV4Y2VlZHMgZGFpbHkgY2FwIgogICAgZGlnIDcKICAgIGludGMgNiAvLyA1MDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gRXhjZWVkcyBkYWlseSBjYXAKICAgIGIgZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMjMKCmRyYXdfYW5kX3BheV9lbHNlX2JvZHlANzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NjgKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMik6CiAgICBkaWcgNgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBkcmF3X2FuZF9wYXlfZWxzZV9ib2R5QDkKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NjkKICAgIC8vIGFzc2VydCBkcmF3X2FtdCA8PSBUSUVSXzJfTUFYX0RSQVcsICJFeGNlZWRzIGRyYXcgY2FwIgogICAgZGlnIDEKICAgIGludGMgNSAvLyAyMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEV4Y2VlZHMgZHJhdyBjYXAKICAgIGIgZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMTQKCmRyYXdfYW5kX3BheV9lbHNlX2JvZHlAOToKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo0NzAKICAgIC8vIGVsaWYgdGllciA9PSBVSW50NjQoMSk6CiAgICBkaWcgNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBkcmF3X2FuZF9wYXlfZWxzZV9ib2R5QDExCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDcxCiAgICAvLyBhc3NlcnQgZHJhd19hbXQgPD0gVElFUl8xX01BWF9EUkFXLCAiRXhjZWVkcyBkcmF3IGNhcCIKICAgIGRpZyAxCiAgICBpbnRjIDYgLy8gNTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEV4Y2VlZHMgZHJhdyBjYXAKICAgIGIgZHJhd19hbmRfcGF5X2FmdGVyX2lmX2Vsc2VAMTQKCmRyYXdfYW5kX3BheV9lbHNlX2JvZHlAMTE6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NDczCiAgICAvLyBhc3NlcnQgZHJhd19hbXQgPD0gVElFUl8wX01BWF9EUkFXLCAiRXhjZWVkcyBkcmF3IGNhcCIKICAgIGRpZyAxCiAgICBpbnRjIDExIC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBFeGNlZWRzIGRyYXcgY2FwCiAgICBiIGRyYXdfYW5kX3BheV9hZnRlcl9pZl9lbHNlQDE0CgoKLy8gYmxvb3BhX3VzZGMuQmxvb3BVU0RDLnJlcGF5X3VzZGNbcm91dGluZ10oKSAtPiB2b2lkOgpyZXBheV91c2RjOgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjUzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTQ2CiAgICAvLyBheGZlci54ZmVyX2Fzc2V0LmlkID09IHNlbGYudXNkY19hc2FfaWQudmFsdWUKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidXNkY19hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19hc2FfaWQgZXhpc3RzCiAgICA9PQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU0NS01NDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXhmZXIueGZlcl9hc3NldC5pZCA9PSBzZWxmLnVzZGNfYXNhX2lkLnZhbHVlCiAgICAvLyApLCAiV3JvbmcgQVNBIgogICAgYXNzZXJ0IC8vIFdyb25nIEFTQQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU0OQogICAgLy8gYXhmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1NDgtNTUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJNdXN0IHNlbmQgdG8gY29udHJhY3QiCiAgICBhc3NlcnQgLy8gTXVzdCBzZW5kIHRvIGNvbnRyYWN0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTUxCiAgICAvLyBhc3NlcnQgYXhmZXIuYXNzZXRfYW1vdW50ID4gVUludDY0KDApLCAiQW1vdW50IG11c3QgYmUgPiAwIgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cG4gMgogICAgYXNzZXJ0IC8vIEFtb3VudCBtdXN0IGJlID4gMAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU1NAogICAgLy8gY3VycmVudF9vdXRzdGFuZGluZyA9IHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInVzZGNfb3V0c3RhbmRpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVzZGNfb3V0c3RhbmRpbmcgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTU2CiAgICAvLyBpZiByZXBheV9hbXQgPj0gY3VycmVudF9vdXRzdGFuZGluZzoKICAgID49CiAgICBieiByZXBheV91c2RjX2Vsc2VfYm9keUAzCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTU3CiAgICAvLyBzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0gPSBVSW50NjQoMCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gInVzZGNfb3V0c3RhbmRpbmciCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU1OC01NTkKICAgIC8vICMgSW5jcmVtZW50IHBheW1lbnRfY291bnQgd2hlbiBkZWJ0IGlzIGZ1bGx5IGNsZWFyZWQKICAgIC8vIHNlbGYucGF5bWVudF9jb3VudFtUeG4uc2VuZGVyXSArPSBVSW50NjQoMSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInBheW1lbnRfY291bnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXltZW50X2NvdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gInBheW1lbnRfY291bnQiCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CgpyZXBheV91c2RjX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1NjMKICAgIC8vIHNlbGYudXNkY190cmVhc3VyeV9iYWxhbmNlLnZhbHVlICs9IHJlcGF5X2FtdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgZXhpc3RzCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBieXRlY18wIC8vICJ1c2RjX3RyZWFzdXJ5X2JhbGFuY2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU2NwogICAgLy8gYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU2OAogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHJlcGF5X2FtdCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NTY5CiAgICAvLyBvdXRzdGFuZGluZz1hcmM0LlVJbnQ2NChzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0pLAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInVzZGNfb3V0c3RhbmRpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX291dHN0YW5kaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU2Ni01NzAKICAgIC8vIFVzZGNSZXBhaWQoCiAgICAvLyAgICAgYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChyZXBheV9hbXQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nPWFyYzQuVUludDY0KHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU2NS01NzEKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBVc2RjUmVwYWlkKAogICAgLy8gICAgICAgICBhZ2VudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgICAgIGFtb3VudD1hcmM0LlVJbnQ2NChyZXBheV9hbXQpLAogICAgLy8gICAgICAgICBvdXRzdGFuZGluZz1hcmM0LlVJbnQ2NChzZWxmLnVzZGNfb3V0c3RhbmRpbmdbVHhuLnNlbmRlcl0pLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGI1OTdkOGRhIC8vIG1ldGhvZCAiVXNkY1JlcGFpZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVwYXlfdXNkY19lbHNlX2JvZHlAMzoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1NjEKICAgIC8vIHNlbGYudXNkY19vdXRzdGFuZGluZ1tUeG4uc2VuZGVyXSA9IGN1cnJlbnRfb3V0c3RhbmRpbmcgLSByZXBheV9hbXQKICAgIGR1cAogICAgZGlnIDIKICAgIC0KICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gInVzZGNfb3V0c3RhbmRpbmciCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIGIgcmVwYXlfdXNkY19hZnRlcl9pZl9lbHNlQDQKCgovLyBibG9vcGFfdXNkYy5CbG9vcFVTREMucmVjb3JkX3BheW1lbnRbcm91dGluZ10oKSAtPiB2b2lkOgpyZWNvcmRfcGF5bWVudDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1OTIKICAgIC8vIHNlbGYuc3Rha2VfYW1vdW50W1R4bi5zZW5kZXJdID4gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic3Rha2VfYW1vdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3Rha2VfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU5MS01OTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGFrZV9hbW91bnRbVHhuLnNlbmRlcl0gPiBVSW50NjQoMCkKICAgIC8vICksICJOb3QgcmVnaXN0ZXJlZCIKICAgIGFzc2VydCAvLyBOb3QgcmVnaXN0ZXJlZAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU5NQogICAgLy8gc2VsZi5wYXltZW50X2NvdW50W1R4bi5zZW5kZXJdICs9IFVJbnQ2NCgxKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicGF5bWVudF9jb3VudCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBheW1lbnRfY291bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAicGF5bWVudF9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1OTYKICAgIC8vIHRpZXIgPSBzZWxmLl9nZXRfdGllcihzZWxmLnBheW1lbnRfY291bnRbVHhuLnNlbmRlcl0pCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicGF5bWVudF9jb3VudCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBheW1lbnRfY291bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICBjYWxsc3ViIF9nZXRfdGllcgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjYwMAogICAgLy8gYWdlbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjYwMgogICAgLy8gdGllcj1hcmM0LlVJbnQ2NCh0aWVyKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo1OTktNjAzCiAgICAvLyBVc2RjUGF5bWVudFJlY29yZGVkKAogICAgLy8gICAgIGFnZW50PWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHRpZXI9YXJjNC5VSW50NjQodGllciksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU5OC02MDQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICBVc2RjUGF5bWVudFJlY29yZGVkKAogICAgLy8gICAgICAgICBhZ2VudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgICAgIHRpZXI9YXJjNC5VSW50NjQodGllciksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MmM2NTU0ZGYgLy8gbWV0aG9kICJVc2RjUGF5bWVudFJlY29yZGVkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjU3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA5IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gYmxvb3BhX3VzZGMuQmxvb3BVU0RDLmdldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wb3NpdGlvbjoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjYzMgogICAgLy8gdGllciA9IHNlbGYuX2dldF90aWVyKHNlbGYucGF5bWVudF9jb3VudFthZGRyXSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInBheW1lbnRfY291bnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXltZW50X2NvdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgY2FsbHN1YiBfZ2V0X3RpZXIKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2MzQKICAgIC8vIGFyYzQuVUludDY0KHNlbGYudXNkY19vdXRzdGFuZGluZ1thZGRyXSksCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInVzZGNfb3V0c3RhbmRpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX291dHN0YW5kaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjYzNQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInVzZGNfdHJlYXN1cnlfYmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51c2RjX3RyZWFzdXJ5X2JhbGFuY2UgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjM2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnBheW1lbnRfY291bnRbYWRkcl0pLAogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwYXltZW50X2NvdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGF5bWVudF9jb3VudCBleGlzdHMgZm9yIGFjY291bnQKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2MzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc3Rha2VfYW1vdW50W2FkZHJdKSwKICAgIHVuY292ZXIgNAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInN0YWtlX2Ftb3VudCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YWtlX2Ftb3VudCBleGlzdHMgZm9yIGFjY291bnQKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2MzgKICAgIC8vIGFyYzQuVUludDY0KHRpZXIpLAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gYmxvb3BhX3VzZGMuQmxvb3BVU0RDLmVuYWJsZV9hdHRlc3RhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmVuYWJsZV9hdHRlc3RhdGlvbjoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2NDkKICAgIC8vIFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjY0OC02NTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApLCAiT25seSBjcmVhdG9yIgogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvcgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjY1MQogICAgLy8gc2VsZi5za2lwX2F0dGVzdGF0aW9uLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJza2lwX2F0dGVzdGF0aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBibG9vcGFfdXNkYy5CbG9vcFVTREMuX2dldF90aWVyKHBheW1lbnRfY291bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfZ2V0X3RpZXI6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjU3LTY1OAogICAgLy8gQGFsZ29weS5zdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF90aWVyKHNlbGYsIHBheW1lbnRfY291bnQ6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjYwCiAgICAvLyBpZiBwYXltZW50X2NvdW50ID49IFRJRVJfM19USFJFU0hPTEQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTAwCiAgICA+PQogICAgYnogX2dldF90aWVyX2Vsc2VfYm9keUAyCiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjYxCiAgICAvLyByZXR1cm4gVUludDY0KDMpCiAgICBwdXNoaW50IDMKICAgIHJldHN1YgoKX2dldF90aWVyX2Vsc2VfYm9keUAyOgogICAgLy8gY29udHJhY3RzL2Jsb29wYV91c2RjLnB5OjY2MgogICAgLy8gZWxpZiBwYXltZW50X2NvdW50ID49IFRJRVJfMl9USFJFU0hPTEQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNTAKICAgID49CiAgICBieiBfZ2V0X3RpZXJfZWxzZV9ib2R5QDQKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2NjMKICAgIC8vIHJldHVybiBVSW50NjQoMikKICAgIGludGNfMiAvLyAyCiAgICByZXRzdWIKCl9nZXRfdGllcl9lbHNlX2JvZHlANDoKICAgIC8vIGNvbnRyYWN0cy9ibG9vcGFfdXNkYy5weTo2NjQKICAgIC8vIGVsaWYgcGF5bWVudF9jb3VudCA+PSBUSUVSXzFfVEhSRVNIT0xEOgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDEwCiAgICA+PQogICAgYnogX2dldF90aWVyX2Vsc2VfYm9keUA2CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjY1CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfZ2V0X3RpZXJfZWxzZV9ib2R5QDY6CiAgICAvLyBjb250cmFjdHMvYmxvb3BhX3VzZGMucHk6NjY3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAMAAECBICjBYCJeqDCHsCWsQLA8PULgPCu55YJgK3iBKCNBiYKFXVzZGNfdHJlYXN1cnlfYmFsYW5jZQ1wYXltZW50X2NvdW50EHVzZGNfb3V0c3RhbmRpbmcLdXNkY19hc2FfaWQLZGFpbHlfZHJhd24Mc3Rha2VfYW1vdW50D2RheV9zdGFydF9yb3VuZBBza2lwX2F0dGVzdGF0aW9uDHRvdGFsX2FnZW50cwQVH3x1MRhAAA4rImcoImcnByNnJwgiZzEbQQBOMRkURDEYRIIJBPBA3Q0EzAsQHwTVPttdBKydDUEEFmjfzQQbSGhABCuJBsIEYF3gywR8r67zNhoAjgkALwCLALoA5QJXA9MESASJBMwAMRmNAgAiAAEAMRhEMQAnBSJmMQApImYxACoiZjEAJwQiZjEAJwYiZiNDMRgUQzEWIwlJOBAjEkRJOAcyChJEOAhJgcCEPQ9EMQAiJwVjRBREMQAnBUsCZjEAKSJmMQAqImYxACcEImYxACcGMgZmIicIZUQjCCcITGcxAEwWUIAEiTWvnUxQsCNDNhoBSRWBCBJEFzEAMgkSRCIrZUQURLEyADIKIrISshRLAbIRJbIQsgGzK0xnI0MxFiMJSTgQJRJEIitlRElESwE4ERJESTgUMgoSRDgSSUQiKGVECChMZyNDgABHAjYaAUcCFYEIEkQ2GgJJTgIVgSASRCIrZUREMQAiJwVjREQxACIqY0QURBcyBiInB2VEQAAOMQBLBFBLARZQAUsDEkQxACInBmNESwFMCSEED0EADTEAJwQiZjEAJwZLAmYxACIpY0SIA4VJRQeBAxJJRQZBAM9LASEHDkQxACInBGNESwIIRQdLBEEAj0sGIQgORCIoZURLAg9ESwRBAFyBkANLAklPAgshBAshCQqxMgAiK2VEMQBLBLISshSyESWyELIBszEAJwRLCmZKCDEAKksCZiIoZURPAwkoTGcxAE8CFk8CFk8CSwZQTwJQTFCABBjlFNFMULAjQ0sFJBJBAAaBhAdC/5pLBSMSQQAGgcAMQv+NgeASQv+HSwUkEkEACUsGIQoOREL/Z0sFIxJBAAlLBiEFDkRC/1dLBiEGDkRC/05LBSQSQQAJSwEhBQ5EQv8nSwUjEkEACUsBIQYOREL/F0sBIQsOREL/DoAARwI2GgFHAhWBCBJENhoCSU4CFYEgEkQ2GgNJTgIVgSASRCIrZUREMQAiJwVjREQxACIqY0QURBcyBiInB2VEQAAOMQBLBVBLARZQAUsDEkQxACInBmNESwFMCSEED0EADTEAJwQiZjEAJwZLAmYxACIpY0SIAghJRQiBAxJJRQdBAM5LASEHDkQxACInBGNESwIIRQhLBUEAjksHIQgORCIoZURLAg9ESwVBAFuBkANLAklPAgshBAshCQqxMgAiK2VESwOyEksHSU4FshSyESWyELIBszEAJwRLDGZLAQgxACpLAmYiKGVETwIJKExnMQBMFkxPAlBLBlBMUIAEgQmAmkxQsCNDSwYkEkEABoGEB0L/m0sGIxJBAAaBwAxC/46B4BJC/4hLBiQSQQAJSwchCg5EQv9oSwYjEkEACUsHIQUOREL/WEsHIQYOREL/T0sGJBJBAAlLASEFDkRC/yhLBiMSQQAJSwEhBg5EQv8YSwEhCw5EQv8PMRYjCUk4ECUSREk4ESIrZUQSREk4FDIKEkQ4EkcCRDEAIipjTElOAk4DRA9BADkxACoiZjEASSIpY0QjCClMZiIoZURLAklOAggoTGcxAEwWMQAiKmNEFk4CUExQgAS1l9jaTFCwI0NJSwIJMQAqTwJmQv/LNhoBSRWBCBJEMQAiJwVjREQxAEkiKWNEIwgpTGYxACIpY0SIAGoxAEwWTE8CUEsBUIAELGVU30xQsCcJTFCwI0M2GgFJFYEgEkRJIiljRIgAPksBIipjRBYiKGVEFksDIiljRBZPBCInBWNEFk8EFk8ETwRQTwNQTwJQTFAnCUxQsCNDMQAyCRJEJwciZyNDigEBi/+BZA9BAAOBA4mL/4EyD0EAAiSJi/+BCg9BAAIjiSKJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 0 } }, "events": [ { "name": "AgentRegistered", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "stake" } ] }, { "name": "UsdcDrawn", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "interest" }, { "type": "uint64", "name": "outstanding" } ] }, { "name": "UsdcX402Paid", "args": [ { "type": "address", "name": "agent" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "outstanding" } ], "desc": "Emitted when draw_and_pay() sends USDC directly to a payee." }, { "name": "UsdcRepaid", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "outstanding" } ] }, { "name": "UsdcPaymentRecorded", "args": [ { "type": "address", "name": "agent" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "tier" } ] } ], "templateVariables": {} }