{ "name": "ValidationRegistry", "structs": { "Bid": [ { "name": "job_id", "type": "uint64" }, { "name": "bidder_agent_id", "type": "uint64" }, { "name": "price_micro", "type": "uint64" }, { "name": "pitch_hash", "type": "byte[]" }, { "name": "placed_at", "type": "uint64" }, { "name": "validator_agent_id", "type": "uint64" }, { "name": "fallback_validator_agent_id", "type": "uint64" } ], "Job": [ { "name": "job_id", "type": "uint64" }, { "name": "client", "type": "address" }, { "name": "server_agent_id", "type": "uint64" }, { "name": "validator_agent_id", "type": "uint64" }, { "name": "budget_micro", "type": "uint64" }, { "name": "spec_hash", "type": "byte[]" }, { "name": "result_hash", "type": "byte[]" }, { "name": "status", "type": "uint64" }, { "name": "created_at", "type": "uint64" }, { "name": "updated_at", "type": "uint64" }, { "name": "fallback_validator_agent_id", "type": "uint64" } ] }, "methods": [ { "name": "bootstrap", "args": [ { "type": "uint64", "name": "identity_app" }, { "type": "uint64", "name": "reputation_app" }, { "type": "uint64", "name": "escrow_asset" }, { "type": "uint64", "name": "dispute_window_secs" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Point this registry at an IdentityRegistry and fix the escrow terms.\nAll three are fixed rather than passed per call: a validator address resolved through a registry the caller chose is a validator address the caller invented, an escrow whose asset the caller picks can be funded with something worthless, and a dispute window set per job is a window the client can set to zero.", "events": [], "recommendations": {} }, { "name": "opt_in_asset", "args": [], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Let this app hold the escrow asset. Creator-only, once.\nAn Algorand account cannot receive an ASA it has not opted into, so without this every fund_job would fail at the transfer with an error that says nothing about the cause. The app account needs 0.1 ALGO of minimum balance for the holding before this will succeed.", "events": [], "recommendations": {} }, { "name": "post_job", "args": [ { "type": "pay", "name": "mbr" }, { "type": "byte[]", "name": "spec_hash" }, { "type": "uint64", "name": "budget_micro" }, { "type": "uint64", "name": "validator_agent_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Open a job. The spec is committed by hash so it cannot change later.\n`mbr` covers the `jb_` box this creates; without it a stranger could post jobs until the app account fell below its minimum balance and every fund_job, bid and registration failed for good.", "events": [], "recommendations": {} }, { "name": "assign_job", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "server_agent_id" }, { "type": "uint64", "name": "fallback_validator_agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Give the job to an agent. Client only, and only while still open.\nThe client names the fallback judge here (or 0 for none): the agent who may judge if the named validator stays silent for a window. The worker consents by having taken the assignment. A fallback may not be either party or the validator itself.", "events": [], "recommendations": {} }, { "name": "submit_result", "args": [ { "type": "pay", "name": "mbr" }, { "type": "uint64", "name": "job_id" }, { "type": "byte[]", "name": "result_hash" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "The assignee commits its result by hash. The payload stays offchain.\n`mbr` covers the growth of the `jb_` box: the result hash goes from empty to 32 bytes, and that added storage is charged to the app account.", "events": [], "recommendations": {} }, { "name": "validation_response", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "bool", "name": "passed" }, { "type": "uint64", "name": "as_validator" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Judge a submitted result. Returns the resulting status.\n`as_validator` is the agent id the caller is acting as: the named validator, or the fallback once the validator's window has passed. Only the id the caller CLAIMS is resolved, so a validator that has deregistered cannot strand the job \u2014 the fallback simply acts. No one gets a unilateral verdict. An earlier fix let the client judge a silent validator's job, but that only moved the free option to the client, who could then reject delivered work and refund. The fallback is named at pairing time (assign_job / accept_bid), is never a party to the job, and the other side consents to it by committing. If BOTH judges stay silent, expire_verdict splits the escrow \u2014 neither side wins by default.", "events": [], "recommendations": {} }, { "name": "record_job_verdict", "args": [ { "type": "pay", "name": "mbr" }, { "type": "uint64", "name": "job_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Write a decided job's verdict through to the agent's reputation score.\nSplit out of validation_response so a starved reputation app can never block a verdict (see the note there). Anyone may call it once the job is VALIDATED or DISPUTED; `passed` is read off the job's own status, not supplied. `mbr` pays the reputation app for the score and dedupe boxes that credit may create \u2014 record_validation there refuses a second recording of the same job, so this cannot be replayed to inflate a count.", "events": [], "recommendations": {} }, { "name": "fund_job", "args": [ { "type": "pay", "name": "mbr" }, { "type": "axfer", "name": "payment" }, { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Move the budget into escrow. Returns the total now held.\nThe transfer is a TRANSACTION IN THIS GROUP, so the amount is read off something the AVM has already validated rather than taken as a number the caller supplies \u2014 the same rule that stopped reputation being minted from bytes.\nThis is the one place Ripar takes custody, and it is opt-in: a job runs perfectly well unfunded, with the budget as a stated intention. What funding buys is that the assignee can see the money exists before doing the work.\nFunding may not exceed the agreed budget, and `mbr` covers the `es_` box's storage. The cap matters because a payout to the worker is now capped at the budget and the excess refunded to the client \u2014 refusing the over-funding at the door keeps that impossible to reach by accident.", "events": [], "recommendations": {} }, { "name": "release_escrow", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pay the assignee once the work passed. Returns the amount sent.\nCallable by the client, and \u2014 after the dispute window \u2014 by anyone. That second path is the point: a validator who never returns would otherwise freeze the worker's money for good, and a lock with no key is not escrow, it is confiscation. The window starts when the verdict was written, so a validator who does show up is never pre-empted.", "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "recommendations": {} }, { "name": "refund_escrow", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Return the escrow to the client. Returns the amount sent.\nOnly on a failed verdict or a cancelled job, and payable to the client whoever calls it \u2014 the destination is read off the job rather than from the sender, so triggering a refund can never redirect one.", "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "recommendations": {} }, { "name": "reclaim_stranded", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Return a passed job's escrow to the client when the worker has made\nitself unpayable. Returns the amount refunded.\nA VALIDATED job pays the worker at an address resolved live from the IdentityRegistry. If the worker deregisters, or rotates to an address not opted into the asset, that resolution (or the transfer) fails on every release and refund_escrow refuses VALIDATED \u2014 so the client's escrow was locked forever and the `es_` box blocked deleting the app.\nThis is the client's exit, and it is deliberately slow: only four dispute windows after the verdict. For the first window only the client may release; after it ANYONE may release to the worker, so a worker who is still reachable (or any keeper acting for them) has three further windows to be paid before the client can take the money back. No fee is charged \u2014 the client is recovering their own funds, not settling for work.", "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "recommendations": {} }, { "name": "get_escrow", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "What is actually held for a job. 0 for an unfunded one.", "events": [], "recommendations": {} }, { "name": "set_validator", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "validator_agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Name or change the validator, while the job is still open.\nOnly while OPEN. Once an agent has been assigned, changing who judges the work is changing the terms after the fact \u2014 the assignee took the job partly on who would be marking it.", "events": [], "recommendations": {} }, { "name": "place_bid", "args": [ { "type": "pay", "name": "mbr" }, { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "bidder_agent_id" }, { "type": "uint64", "name": "price_micro" }, { "type": "byte[]", "name": "pitch_hash" }, { "type": "uint64", "name": "fallback_validator_agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Offer to do a job. Only the bidding agent's own address may bid.\nThe docs said flatly \"there is no bid: the client names the agent directly\". This is that gap closed, and the authorisation is the same rule as everywhere else here \u2014 the bidder is resolved through the IdentityRegistry, so an agent cannot be bid on behalf of.\nBids are only accepted while the job is OPEN. Bidding on assigned work is noise, and worse, a bid that looks live on a job somebody else is already doing misleads whoever reads the board.\nA second bid from the same agent REPLACES the first. That is what revising an offer means, and the alternative \u2014 many live bids from one agent \u2014 is a way to bury rivals rather than to compete.", "events": [], "recommendations": {} }, { "name": "withdraw_bid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "bidder_agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Take a bid back, and reclaim its box.\nThe bidder may always withdraw their own bid. The CLIENT may also sweep a bid once the job has left OPEN. Without that second path a losing bid whose bidder later deregisters is a box nobody can remove \u2014 the bidder resolution below would revert for everyone \u2014 and a box nobody can remove blocks deleting the app forever. The client only reaches it on an already-decided job, so it cannot pull a live competitor's bid; the freed deposit goes to whoever does the cleanup.", "events": [], "recommendations": {} }, { "name": "accept_bid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "bidder_agent_id" }, { "type": "uint64", "name": "expected_price_micro" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Assign the job to a bidder, at the price they bid.\nThe budget is overwritten with the bid, which is the point: accepting an offer of 0.4 on a job budgeted at 1.0 should leave the record saying 0.4. Leaving the old number would mean the job, the escrow and any release all disagree about what was agreed.\nThe terms are pinned to what the client read. `expected_price_micro` must equal the bid's price, and the bid's recorded validator must still be the job's validator \u2014 otherwise a bidder could raise the price, or the client could change the validator, between the client reading the bid and accepting it. The bidder's proposed fallback judge is copied onto the job, so accepting a bid IS the client's consent to that fallback.\nThe bid box is NOT swept here. Losing bids stay readable until the client withdraws them or the bidders do \u2014 a board that erases what it rejected cannot be checked afterwards.", "events": [], "recommendations": {} }, { "name": "get_bid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "bidder_agent_id" } ], "returns": { "type": "(uint64,uint64,uint64,byte[],uint64,uint64,uint64)", "struct": "Bid" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "release_partial", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "amount_micro" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pay part of the escrow out. Returns what remains held.\nMilestones, without a milestone schema. A job that runs in stages is the normal case for anything worth escrowing, and an all-or-nothing release forces the client to choose between paying for unfinished work and holding finished work hostage.\nClient only, and only on a passing verdict \u2014 the post-window path in release_escrow deliberately does NOT apply here. That path exists so a worker can rescue their money from an absent validator; letting anyone trigger a partial release would let a stranger dribble it out instead.", "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "recommendations": {} }, { "name": "expire_job", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel an assigned job the assignee never delivered on.\nAnyone may call it, once the deadline has passed, because the client being the only one able to reclaim their own escrow is the same trap the dispute window exists to avoid \u2014 in reverse. The deadline is the same window: an assignment that has sat untouched for longer than the dispute window is one the assignee has abandoned.\nOnly from ASSIGNED. Once a result is submitted the validator decides, and a deadline that could snatch the job away mid-review would let a client escape a verdict by waiting.", "events": [], "recommendations": {} }, { "name": "expire_verdict", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Resolve a submitted result that NEITHER judge answered, by splitting.\nSUBMITTED had exactly one exit \u2014 `validation_response`. A validator who loses their key, abandons the agent, rotates away or simply declines therefore froze the escrow permanently: `expire_job` refuses anything past ASSIGNED, so nobody could move the job, and the `es_` box it needs was locked with no on-chain remedy, which also blocks deleting the app.\nIt waits TWO windows, because there are two judges: the validator's own window, then the fallback's. Only if BOTH stay silent does this fire.\nAnd it SPLITS the escrow rather than handing either side a default win. An earlier version resolved silence to VALIDATED \u2014 but that paid a worker who may have submitted garbage in full, simply for the validator not showing up, which is a free option for the worker. Resolving to CANCELLED instead would be the same free option for the client. A 50/50 split gives neither: a worker who delivered garbage keeps only half, and a client who named a dead validator recovers only half. Both are worse off than agreeing a live judge, which is exactly the incentive this should create. The escrow is divided now into two boxes \u2014 the worker's half stays in `es_`, the client's half moves to `rf_` \u2014 so each half is claimable without the other party's address having to be live.\nAnyone may call it, for the same reason `expire_job` is open: a guarantee that only one party can invoke is not a guarantee.", "events": [], "recommendations": {} }, { "name": "settle_split", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pay the worker's half of a SPLIT job. Anyone; a fee applies as it is a\nsettlement for delivered (if unjudged) work. Returns the amount sent.", "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "recommendations": {} }, { "name": "claim_split_refund", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pay the client's half of a SPLIT job. Anyone may trigger it; the\ndestination is read off the job, so it can only ever go to the client, and it never resolves the worker \u2014 a departed worker strands only their own half. No fee: the client is recovering their own money. Returns the amount.", "events": [], "recommendations": {} }, { "name": "set_fee", "args": [ { "type": "uint64", "name": "fee_bps" }, { "type": "address", "name": "treasury" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set a protocol fee, once, by the creator. Capped at 2.5%.\nOnce and capped on purpose. A fee that can be raised after work is accepted is a fee the assignee never agreed to, and an uncapped one is a rug with extra steps. Zero \u2014 the default \u2014 means no fee is taken and release pays the whole escrow.", "events": [], "recommendations": {} }, { "name": "set_arbiter", "args": [ { "type": "uint64", "name": "arbiter_agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set (or clear, with 0) the protocol arbiter. Creator only.\nThe arbiter is the fallback judge for every job, superseding any party-named fallback \u2014 see the field's comment. It is deliberately NOT one-shot: an arbiter key can be lost or need rotating, and a judge is not a fee, so the creator may change it. That it can be changed is exactly why it is a trusted role, stated plainly: a creator is assumed honest here, and a deployment that cannot make that assumption should leave it at 0 and rely on the party-named fallback and the SPLIT backstop instead.\nThe arbiter must be a registered agent (so it resolves to an address); clearing it back to 0 is always allowed.", "events": [], "recommendations": {} }, { "name": "get_arbiter", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "The protocol arbiter agent id, or 0 if none is set.", "events": [], "recommendations": {} }, { "name": "cancel_job", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw an unassigned job. Once assigned, it must run its course.", "events": [], "recommendations": {} }, { "name": "get_job", "args": [ { "type": "uint64", "name": "job_id" } ], "returns": { "type": "(uint64,address,uint64,uint64,uint64,byte[],byte[],uint64,uint64,uint64,uint64)", "struct": "Job" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "total_jobs", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 7, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "job_count": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "am9iX2NvdW50" }, "identity_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aWRlbnRpdHlfYXBw" }, "escrow_asset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXNjcm93X2Fzc2V0" }, "dispute_window": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGlzcHV0ZV93aW5kb3c=" }, "reputation_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVwdXRhdGlvbl9hcHA=" }, "fee_bps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmVlX2Jwcw==" }, "treasury": { "keyType": "AVMString", "valueType": "address", "key": "dHJlYXN1cnk=" }, "arbiter_agent_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXJiaXRlcl9hZ2VudF9pZA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "jobs": { "keyType": "uint64", "valueType": "Job", "prefix": "amJf" }, "escrow": { "keyType": "uint64", "valueType": "uint64", "prefix": "ZXNf" }, "split_refund": { "keyType": "uint64", "valueType": "uint64", "prefix": "cmZf" }, "bids": { "keyType": "AVMBytes", "valueType": "Bid", "prefix": "YmRf" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 2983 ], "errorMessage": "a fee needs a destination" }, { "pc": [ 602 ], "errorMessage": "a job with no budget attracts no bids" }, { "pc": [ 1956 ], "errorMessage": "a zero bid is not an offer" }, { "pc": [ 490 ], "errorMessage": "a zero dispute window would let anyone claim instantly" }, { "pc": [ 2461 ], "errorMessage": "a zero release moves nothing" }, { "pc": [ 1416 ], "errorMessage": "a zero transfer escrows nothing" }, { "pc": [ 607, 928, 1456, 2012, 2153, 2161, 3180 ], "errorMessage": "account funded" }, { "pc": [ 759 ], "errorMessage": "agent id required" }, { "pc": [ 470 ], "errorMessage": "already bootstrapped" }, { "pc": [ 3091 ], "errorMessage": "an assigned job cannot be cancelled" }, { "pc": [ 1241 ], "errorMessage": "application exists" }, { "pc": [ 911, 3258 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ 1952 ], "errorMessage": "bids close when the job is assigned" }, { "pc": [ 524 ], "errorMessage": "bootstrap first" }, { "pc": [ 2466 ], "errorMessage": "cannot release more than is held" }, { "pc": [ 1066, 1077, 3046 ], "errorMessage": "check self.arbiter_agent_id exists" }, { "pc": [ 1050, 1540, 1755, 2663, 2736 ], "errorMessage": "check self.dispute_window exists" }, { "pc": [ 1431, 1571, 1795, 2774 ], "errorMessage": "check self.escrow entry exists" }, { "pc": [ 522, 1410, 1602, 2525, 2551, 2910, 2987, 3332, 3358 ], "errorMessage": "check self.escrow_asset exists" }, { "pc": [ 2499, 2507, 2965, 3306, 3314 ], "errorMessage": "check self.fee_bps exists" }, { "pc": [ 468, 886, 3231 ], "errorMessage": "check self.identity_app exists" }, { "pc": [ 612, 3144 ], "errorMessage": "check self.job_count exists" }, { "pc": [ 1237 ], "errorMessage": "check self.reputation_app exists" }, { "pc": [ 2530, 2587, 3337, 3393 ], "errorMessage": "check self.treasury exists" }, { "pc": [ 485 ], "errorMessage": "escrow asset required" }, { "pc": [ 1451 ], "errorMessage": "escrow cannot exceed the agreed budget" }, { "pc": [ 1412 ], "errorMessage": "escrow is denominated in one asset; this is not it" }, { "pc": [ 1685 ], "errorMessage": "escrow is refunded on a failed verdict or a cancelled job" }, { "pc": [ 1526, 2439 ], "errorMessage": "escrow is released on a passing verdict" }, { "pc": [ 1396 ], "errorMessage": "escrow must be paid to this app" }, { "pc": [ 475 ], "errorMessage": "identity app id required" }, { "pc": [ 741, 752, 765, 871, 881, 1019, 1028, 1044, 1058, 1168, 1211, 1272, 1364, 1372, 1443, 1480, 1521, 1534, 1546, 1581, 1627, 1665, 1688, 1727, 1736, 1749, 1844, 1853, 1949, 1983, 1994, 2124, 2134, 2234, 2245, 2270, 2281, 2287, 2298, 2426, 2434, 2486, 2645, 2657, 2717, 2730, 2836, 2845, 2883, 2915, 3079, 3088 ], "errorMessage": "index out of bounds" }, { "pc": [ 562, 834, 1915 ], "errorMessage": "invalid array length header" }, { "pc": [ 989 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 573, 842, 1923 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 919, 2954, 3266 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 433, 441, 449, 457, 581, 589, 705, 713, 721, 828, 979, 999, 1196, 1346, 1501, 1649, 1711, 1780, 1817, 1825, 1893, 1901, 1909, 1931, 2073, 2084, 2196, 2204, 2212, 2354, 2362, 2399, 2407, 2626, 2696, 2820, 2867, 2946, 3016, 3061, 3121 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 755, 2248 ], "errorMessage": "job is no longer open" }, { "pc": [ 875 ], "errorMessage": "job is not awaiting a result" }, { "pc": [ 1388 ], "errorMessage": "job is past funding" }, { "pc": [ 2118, 2265, 2380 ], "errorMessage": "no such bid" }, { "pc": [ 1232 ], "errorMessage": "no verdict has been decided yet" }, { "pc": [ 1024 ], "errorMessage": "nothing has been submitted to judge" }, { "pc": [ 2451, 3283, 3291 ], "errorMessage": "nothing is escrowed for this job" }, { "pc": [ 2898 ], "errorMessage": "nothing to refund" }, { "pc": [ 1732 ], "errorMessage": "only a passed job's escrow can be reclaimed" }, { "pc": [ 2888 ], "errorMessage": "only a split job refunds this way" }, { "pc": [ 2841 ], "errorMessage": "only a split job settles this way" }, { "pc": [ 2722 ], "errorMessage": "only a submitted job awaiting a verdict can expire" }, { "pc": [ 2649 ], "errorMessage": "only an assigned job with no result can expire" }, { "pc": [ 923 ], "errorMessage": "only the assigned agent may submit a result" }, { "pc": [ 2147 ], "errorMessage": "only the bidder may withdraw (or the client, once the job has left OPEN)" }, { "pc": [ 1976 ], "errorMessage": "only the bidding agent may place its own bid" }, { "pc": [ 2239 ], "errorMessage": "only the client may accept a bid" }, { "pc": [ 746 ], "errorMessage": "only the client may assign" }, { "pc": [ 3083 ], "errorMessage": "only the client may cancel" }, { "pc": [ 1368 ], "errorMessage": "only the client may fund their own job" }, { "pc": [ 1172 ], "errorMessage": "only the client may judge a job with no validator" }, { "pc": [ 1848 ], "errorMessage": "only the client may name the validator" }, { "pc": [ 1741 ], "errorMessage": "only the client may reclaim" }, { "pc": [ 1554 ], "errorMessage": "only the client may release before the dispute window closes" }, { "pc": [ 2430 ], "errorMessage": "only the client may release part of an escrow" }, { "pc": [ 463 ], "errorMessage": "only the creator may bootstrap" }, { "pc": [ 419 ], "errorMessage": "only the creator may delete" }, { "pc": [ 518 ], "errorMessage": "only the creator may opt in" }, { "pc": [ 3022 ], "errorMessage": "only the creator may set the arbiter" }, { "pc": [ 2960 ], "errorMessage": "only the creator may set the fee" }, { "pc": [ 1105 ], "errorMessage": "only the named validator may judge, or the fallback/arbiter once the validator's window has passed" }, { "pc": [ 3185 ], "errorMessage": "payment must cover the box storage this call adds" }, { "pc": [ 1265 ], "errorMessage": "payment must cover the score and dedupe boxes (>=0.037 ALGO)" }, { "pc": [ 1965 ], "errorMessage": "pitch_hash must be a sha256 digest" }, { "pc": [ 480 ], "errorMessage": "reputation app id required" }, { "pc": [ 862 ], "errorMessage": "result_hash must be a sha256 digest" }, { "pc": [ 598 ], "errorMessage": "spec_hash must be a sha256 digest" }, { "pc": [ 1250 ], "errorMessage": "storage payment must be sent to the reputation app" }, { "pc": [ 3164 ], "errorMessage": "storage payment must be sent to this app" }, { "pc": [ 2666 ], "errorMessage": "the assignee still has time" }, { "pc": [ 2275 ], "errorMessage": "the bid changed since you read it" }, { "pc": [ 3217 ], "errorMessage": "the client cannot be the fallback judge" }, { "pc": [ 1988 ], "errorMessage": "the client cannot bid on their own job" }, { "pc": [ 3201 ], "errorMessage": "the fallback must differ from the validator" }, { "pc": [ 2977 ], "errorMessage": "the fee is capped at 2.5%" }, { "pc": [ 2967 ], "errorMessage": "the fee is set once" }, { "pc": [ 1403 ], "errorMessage": "the funder must be the client" }, { "pc": [ 2995 ], "errorMessage": "the treasury must opt into the escrow asset before it can receive a fee" }, { "pc": [ 2292 ], "errorMessage": "the validator changed since this bid was placed" }, { "pc": [ 1856 ], "errorMessage": "the validator is fixed once the job is assigned" }, { "pc": [ 2742 ], "errorMessage": "the validator, then the fallback, still have time" }, { "pc": [ 3221 ], "errorMessage": "the worker cannot be the fallback judge" }, { "pc": [ 3207 ], "errorMessage": "the worker cannot be their own fallback judge" }, { "pc": [ 1761 ], "errorMessage": "the worker still has time to be paid" }, { "pc": [ 1338 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 556, 820, 1185, 1327, 1885 ], "errorMessage": "transaction type is pay" }, { "pc": [ 733, 853, 1010, 1207, 1360, 1516, 1661, 1722, 1836, 1944, 2099, 2225, 2422, 2636, 2708, 2831, 2878, 3071, 3131 ], "errorMessage": "unknown job" }, { "pc": [ 2971 ], "errorMessage": "use zero by leaving it unset" }, { "pc": [ 1114 ], "errorMessage": "you do not control that validator" }, { "pc": [ 1257, 3172 ], "errorMessage": "you must pay for the storage you create" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDAgMSAzMgogICAgYnl0ZWNibG9jayAweDZhNjI1ZiAweDE1MWY3Yzc1IDB4MTUxZjdjNzU4MCAiZXNjcm93X2Fzc2V0IiAiZGlzcHV0ZV93aW5kb3ciICJmZWVfYnBzIiAidHJlYXN1cnkiIDB4NjU3MzVmICJpZGVudGl0eV9hcHAiICJhcmJpdGVyX2FnZW50X2lkIiAiam9iX2NvdW50IiAweDYyNjQ1ZiAicmVwdXRhdGlvbl9hcHAiIDB4YzdiOTcwNjMgMHg5OTE5NTZjOSAweDcyNjY1ZgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEwCiAgICAvLyBzZWxmLmpvYl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTAgLy8gImpvYl9jb3VudCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEyLTExNQogICAgLy8gIyBUaGUgSWRlbnRpdHlSZWdpc3RyeSB0aGlzIGNvbnRyYWN0IHRydXN0cyB0byBzYXkgd2hpY2ggYWRkcmVzcwogICAgLy8gIyBjb250cm9scyBhbiBhZ2VudCBpZC4gdmFsaWRhdGlvbl9yZXNwb25zZSByZXNvbHZlcyB0aGUgbmFtZWQKICAgIC8vICMgdmFsaWRhdG9yIHRocm91Z2ggaXQsIHNvIGEgdmVyZGljdCBjYW5ub3QgYmUgd3JpdHRlbiBieSBhIHN0cmFuZ2VyLgogICAgLy8gc2VsZi5pZGVudGl0eV9hcHAgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDggLy8gImlkZW50aXR5X2FwcCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTM0LTEzNwogICAgLy8gIyBUaGUgYXNzZXQgZXNjcm93IGlzIGRlbm9taW5hdGVkIGluLiBGaXhlZCBhdCBib290c3RyYXAgZm9yIHRoZSBzYW1lCiAgICAvLyAjIHJlYXNvbiB0aGUgUmVwdXRhdGlvblJlZ2lzdHJ5IGZpeGVzIGl0cyBvd246IGFuIGVzY3JvdyB0aGUgY2FsbGVyCiAgICAvLyAjIGNob3NlIHRoZSBhc3NldCBmb3IgY2FuIGJlIGZ1bmRlZCB3aXRoIHNvbWV0aGluZyB3b3J0aGxlc3MuCiAgICAvLyBzZWxmLmVzY3Jvd19hc3NldCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMyAvLyAiZXNjcm93X2Fzc2V0IgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMzktMTQyCiAgICAvLyAjIEhvdyBsb25nIGEgc3VibWl0dGVkIHJlc3VsdCBtYXkgc2l0IHVuanVkZ2VkIGJlZm9yZSB0aGUgYXNzaWduZWUgY2FuCiAgICAvLyAjIGNsYWltIHRoZSBlc2Nyb3cgYW55d2F5LiBXaXRob3V0IGl0IGEgdmFsaWRhdG9yIHdobyBzaW1wbHkgbmV2ZXIKICAgIC8vICMgc2hvd3MgdXAgZnJlZXplcyB0aGUgd29ya2VyJ3MgbW9uZXkgZm9yIGdvb2QuCiAgICAvLyBzZWxmLmRpc3B1dGVfd2luZG93ID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJkaXNwdXRlX3dpbmRvdyIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTQ0LTE0NwogICAgLy8gIyBUaGUgUmVwdXRhdGlvblJlZ2lzdHJ5IGEgdmVyZGljdCBpcyB3cml0dGVuIHRvLiBXaXRob3V0IGl0IGEgam9iIGNhbgogICAgLy8gIyBiZSBqdWRnZWQgYW5kIHRoZSBhZ2VudCdzIHZhbGlkYXRlZC9kaXNwdXRlZCBjb3VudGVycyBuZXZlciBtb3ZlLAogICAgLy8gIyB3aGljaCBpcyB3aGF0IG1hZGUgdGhvc2UgdHdvIGZpZWxkcyBwZXJtYW5lbnRseSB6ZXJvLgogICAgLy8gc2VsZi5yZXB1dGF0aW9uX2FwcCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlcHV0YXRpb25fYXBwIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxNTUtMTU4CiAgICAvLyAjIFByb3RvY29sIGZlZSBpbiBiYXNpcyBwb2ludHMsIHRha2VuIGZyb20gZXNjcm93IG9uIHJlbGVhc2UuIFplcm8gYnkKICAgIC8vICMgZGVmYXVsdCBhbmQgc2V0IG9uY2UsIGJlY2F1c2UgYSBmZWUgdGhhdCBjYW4gbW92ZSBhZnRlciB3b3JrIGhhcyBiZWVuCiAgICAvLyAjIGFjY2VwdGVkIGlzIGEgZmVlIHRoZSBhc3NpZ25lZSBuZXZlciBhZ3JlZWQgdG8uCiAgICAvLyBzZWxmLmZlZV9icHMgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDUgLy8gImZlZV9icHMiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjE1OQogICAgLy8gc2VsZi50cmVhc3VyeSA9IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gInRyZWFzdXJ5IgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTYxLTE2OQogICAgLy8gIyBPcHRpb25hbCBwcm90b2NvbCBhcmJpdGVyOiBhIGNyZWF0b3Itc2V0IGFnZW50IHRoYXQgYWN0cyBhcyB0aGUgZmFsbGJhY2sKICAgIC8vICMganVkZ2UgZm9yIEVWRVJZIGpvYiwgc3VwZXJzZWRpbmcgYW55IHBhcnR5LW5hbWVkIGZhbGxiYWNrLiBaZXJvICh0aGUKICAgIC8vICMgZGVmYXVsdCkgbWVhbnMgbm9uZSwgYW5kIGpvYnMgdXNlIHRoZWlyIHBhcnR5LW5hbWVkIGZhbGxiYWNrIHBsdXMgdGhlCiAgICAvLyAjIHRydXN0bGVzcyBTUExJVCBiYWNrc3RvcC4gU2V0dGluZyBvbmUgY2xvc2VzIHRoZSByZXNpZHVhbCB0aGF0IGEgd29ya2VyCiAgICAvLyAjIGNvdWxkIG5hbWUgYSBzZWNvbmQgYWdlbnQgaXQgY29udHJvbHMgYXMgaXRzIG93biBmYWxsYmFjazogdGhlIGFyYml0ZXIsCiAgICAvLyAjIG5vdCBhIHBhcnR5LCBpcyB0aGVuIHRoZSBzZWNvbmQganVkZ2UuIEl0IGlzIGEgdHJ1c3RlZCByb2xlIOKAlCBhIGNyZWF0b3IKICAgIC8vICMgd2hvIGluc3RhbGxzIGEgY29sbHVkaW5nIGFyYml0ZXIgY2FuIGRlY2lkZSBzaWxlbnQtdmFsaWRhdG9yIGpvYnMg4oCUIHNvCiAgICAvLyAjIGl0IGlzIG9mZiBieSBkZWZhdWx0IGFuZCBuYW1lZCB3aGVyZSBhbnlvbmUgY2FuIHJlYWQgaXQuCiAgICAvLyBzZWxmLmFyYml0ZXJfYWdlbnRfaWQgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDkgLy8gImFyYml0ZXJfYWdlbnRfaWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA4CiAgICAvLyBjbGFzcyBWYWxpZGF0aW9uUmVnaXN0cnkoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AzNwogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NjE3Zjc3YzIgMHg4NGY2ZjdhNCAweDgwM2M2M2IzIDB4MjBkN2NjZWQgMHhhNmRjNDliNSAweGUwODhkNTY4IDB4ODkzYzI4NmYgMHhkMzdiNjEyNyAweDQzZDM4YjBhIDB4OTI4MGJhNmIgMHg5ZGVhNmNlNCAweDEwYzZkNDk4IDB4YmU1YzkwYjAgMHgxZWE5MzFhOSAweDllNGJhOTQ4IDB4MGZmYzljOTAgMHgwZTI3MGNlOSAweDU2NzA2YzJiIDB4MjJiMzdjNTAgMHg0YjY2MmQzYSAweGE3M2UzN2Y1IDB4NDUyYWJmMmEgMHg1ZjNkZjM1MSAweDFmNTY3ODA1IDB4YTRhZWU1ZDEgMHgzNmE4ODFhOCAweDkzNjc2YzJhIDB4Yzc1YzdiMzcgLy8gbWV0aG9kICJib290c3RyYXAodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgIm9wdF9pbl9hc3NldCgpYm9vbCIsIG1ldGhvZCAicG9zdF9qb2IocGF5LGJ5dGVbXSx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYXNzaWduX2pvYih1aW50NjQsdWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJzdWJtaXRfcmVzdWx0KHBheSx1aW50NjQsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZhbGlkYXRpb25fcmVzcG9uc2UodWludDY0LGJvb2wsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicmVjb3JkX2pvYl92ZXJkaWN0KHBheSx1aW50NjQpYm9vbCIsIG1ldGhvZCAiZnVuZF9qb2IocGF5LGF4ZmVyLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInJlbGVhc2VfZXNjcm93KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInJlZnVuZF9lc2Nyb3codWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicmVjbGFpbV9zdHJhbmRlZCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRfZXNjcm93KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF92YWxpZGF0b3IodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJwbGFjZV9iaWQocGF5LHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAid2l0aGRyYXdfYmlkKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAiYWNjZXB0X2JpZCh1aW50NjQsdWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRfYmlkKHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJlbGVhc2VfcGFydGlhbCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZXhwaXJlX2pvYih1aW50NjQpYm9vbCIsIG1ldGhvZCAiZXhwaXJlX3ZlcmRpY3QodWludDY0KWJvb2wiLCBtZXRob2QgInNldHRsZV9zcGxpdCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJjbGFpbV9zcGxpdF9yZWZ1bmQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2ZlZSh1aW50NjQsYWRkcmVzcylib29sIiwgbWV0aG9kICJzZXRfYXJiaXRlcih1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYml0ZXIoKXVpbnQ2NCIsIG1ldGhvZCAiY2FuY2VsX2pvYih1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0X2pvYih1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidG90YWxfam9icygpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIG9wdF9pbl9hc3NldCBwb3N0X2pvYiBhc3NpZ25fam9iIHN1Ym1pdF9yZXN1bHQgdmFsaWRhdGlvbl9yZXNwb25zZSByZWNvcmRfam9iX3ZlcmRpY3QgZnVuZF9qb2IgcmVsZWFzZV9lc2Nyb3cgcmVmdW5kX2VzY3JvdyByZWNsYWltX3N0cmFuZGVkIGdldF9lc2Nyb3cgc2V0X3ZhbGlkYXRvciBwbGFjZV9iaWQgd2l0aGRyYXdfYmlkIGFjY2VwdF9iaWQgZ2V0X2JpZCByZWxlYXNlX3BhcnRpYWwgZXhwaXJlX2pvYiBleHBpcmVfdmVyZGljdCBzZXR0bGVfc3BsaXQgY2xhaW1fc3BsaXRfcmVmdW5kIHNldF9mZWUgc2V0X2FyYml0ZXIgZ2V0X2FyYml0ZXIgY2FuY2VsX2pvYiBnZXRfam9iIHRvdGFsX2pvYnMKICAgIGVycgoKbWFpbl9iYXJlX3JvdXRpbmdAMzc6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDgKICAgIC8vIGNsYXNzIFZhbGlkYXRpb25SZWdpc3RyeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIE5vT3AKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOCBtYWluX2RlbGV0ZUAzOQogICAgZXJyCgptYWluX2RlbGV0ZUAzOToKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcwNgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcxNAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IGRlbGV0ZSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBkZWxldGUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcwNgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzg6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuYm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjE4NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IGJvb3RzdHJhcCIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBib290c3RyYXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjE4OAogICAgLy8gYXNzZXJ0IHNlbGYuaWRlbnRpdHlfYXBwID09IDAsICJhbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA4IC8vICJpZGVudGl0eV9hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaWRlbnRpdHlfYXBwIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxODkKICAgIC8vIGFzc2VydCBpZGVudGl0eV9hcHAubmF0aXZlID4gMCwgImlkZW50aXR5IGFwcCBpZCByZXF1aXJlZCIKICAgIHVuY292ZXIgMwogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gaWRlbnRpdHkgYXBwIGlkIHJlcXVpcmVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxOTAKICAgIC8vIGFzc2VydCByZXB1dGF0aW9uX2FwcC5uYXRpdmUgPiAwLCAicmVwdXRhdGlvbiBhcHAgaWQgcmVxdWlyZWQiCiAgICB1bmNvdmVyIDMKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIHJlcHV0YXRpb24gYXBwIGlkIHJlcXVpcmVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxOTEKICAgIC8vIGFzc2VydCBlc2Nyb3dfYXNzZXQubmF0aXZlID4gMCwgImVzY3JvdyBhc3NldCByZXF1aXJlZCIKICAgIHVuY292ZXIgMwogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gZXNjcm93IGFzc2V0IHJlcXVpcmVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxOTIKICAgIC8vIGFzc2VydCBkaXNwdXRlX3dpbmRvd19zZWNzLm5hdGl2ZSA+IDAsICJhIHplcm8gZGlzcHV0ZSB3aW5kb3cgd291bGQgbGV0IGFueW9uZSBjbGFpbSBpbnN0YW50bHkiCiAgICB1bmNvdmVyIDMKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIGEgemVybyBkaXNwdXRlIHdpbmRvdyB3b3VsZCBsZXQgYW55b25lIGNsYWltIGluc3RhbnRseQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTkzCiAgICAvLyBzZWxmLmlkZW50aXR5X2FwcCA9IGlkZW50aXR5X2FwcC5uYXRpdmUKICAgIGJ5dGVjIDggLy8gImlkZW50aXR5X2FwcCIKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjE5NAogICAgLy8gc2VsZi5yZXB1dGF0aW9uX2FwcCA9IHJlcHV0YXRpb25fYXBwLm5hdGl2ZQogICAgYnl0ZWMgMTIgLy8gInJlcHV0YXRpb25fYXBwIgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTk1CiAgICAvLyBzZWxmLmVzY3Jvd19hc3NldCA9IGVzY3Jvd19hc3NldC5uYXRpdmUKICAgIGJ5dGVjXzMgLy8gImVzY3Jvd19hc3NldCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjE5NgogICAgLy8gc2VsZi5kaXNwdXRlX3dpbmRvdyA9IGRpc3B1dGVfd2luZG93X3NlY3MubmF0aXZlCiAgICBieXRlYyA0IC8vICJkaXNwdXRlX3dpbmRvdyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5Lm9wdF9pbl9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbl9hc3NldDoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIwOAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IG9wdCBpbiIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBvcHQgaW4KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIwOQogICAgLy8gYXNzZXJ0IHNlbGYuZXNjcm93X2Fzc2V0ID4gMCwgImJvb3RzdHJhcCBmaXJzdCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJlc2Nyb3dfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Fzc2V0IGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIGZpcnN0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMTAtMjE1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjEyCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIxMwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjEwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIxNAogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIxMC0yMTUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5wb3N0X2pvYltyb3V0aW5nXSgpIC0+IHZvaWQ6CnBvc3Rfam9iOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNTIKICAgIC8vIGFzc2VydCBzcGVjX2hhc2gubmF0aXZlLmxlbmd0aCA9PSAzMiwgInNwZWNfaGFzaCBtdXN0IGJlIGEgc2hhMjU2IGRpZ2VzdCIKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gc3BlY19oYXNoIG11c3QgYmUgYSBzaGEyNTYgZGlnZXN0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNTMKICAgIC8vIGFzc2VydCBidWRnZXRfbWljcm8ubmF0aXZlID4gMCwgImEgam9iIHdpdGggbm8gYnVkZ2V0IGF0dHJhY3RzIG5vIGJpZHMiCiAgICBkaWcgMQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGEgam9iIHdpdGggbm8gYnVkZ2V0IGF0dHJhY3RzIG5vIGJpZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI1NQogICAgLy8gbWJyX2JlZm9yZSA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjU2CiAgICAvLyBzZWxmLmpvYl9jb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTAgLy8gImpvYl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5qb2JfY291bnQgZXhpc3RzCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYnl0ZWMgMTAgLy8gImpvYl9jb3VudCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjIwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI2MQogICAgLy8gam9iX2lkPWFyYzQuVUludDY0KGppZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNjIKICAgIC8vIGNsaWVudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNjMKICAgIC8vIHNlcnZlcl9hZ2VudF9pZD1hcmM0LlVJbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNjkKICAgIC8vIGNyZWF0ZWRfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjYwLTI3MgogICAgLy8gc2VsZi5qb2JzW2ppZF0gPSBKb2IoCiAgICAvLyAgICAgam9iX2lkPWFyYzQuVUludDY0KGppZCksCiAgICAvLyAgICAgY2xpZW50PWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICBzZXJ2ZXJfYWdlbnRfaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdmFsaWRhdG9yX2FnZW50X2lkPXZhbGlkYXRvcl9hZ2VudF9pZCwKICAgIC8vICAgICBidWRnZXRfbWljcm89YnVkZ2V0X21pY3JvLAogICAgLy8gICAgIHNwZWNfaGFzaD1zcGVjX2hhc2guY29weSgpLAogICAgLy8gICAgIHJlc3VsdF9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKEJ5dGVzKGIiIikpLAogICAgLy8gICAgIHN0YXR1cz1hcmM0LlVJbnQ2NChPUEVOKSwKICAgIC8vICAgICBjcmVhdGVkX2F0PWFyYzQuVUludDY0KG5vdyksCiAgICAvLyAgICAgdXBkYXRlZF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIGZhbGxiYWNrX3ZhbGlkYXRvcl9hZ2VudF9pZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDY0CiAgICBjb25jYXQKICAgIHB1c2hpbnQgMTAwCiAgICB1bmNvdmVyIDYKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjY3CiAgICAvLyByZXN1bHRfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhCeXRlcyhiIiIpKSwKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI2MC0yNzIKICAgIC8vIHNlbGYuam9ic1tqaWRdID0gSm9iKAogICAgLy8gICAgIGpvYl9pZD1hcmM0LlVJbnQ2NChqaWQpLAogICAgLy8gICAgIGNsaWVudD1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIHZhbGlkYXRvcl9hZ2VudF9pZD12YWxpZGF0b3JfYWdlbnRfaWQsCiAgICAvLyAgICAgYnVkZ2V0X21pY3JvPWJ1ZGdldF9taWNybywKICAgIC8vICAgICBzcGVjX2hhc2g9c3BlY19oYXNoLmNvcHkoKSwKICAgIC8vICAgICByZXN1bHRfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhCeXRlcyhiIiIpKSwKICAgIC8vICAgICBzdGF0dXM9YXJjNC5VSW50NjQoT1BFTiksCiAgICAvLyAgICAgY3JlYXRlZF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIHVwZGF0ZWRfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICAgICBmYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI2MAogICAgLy8gc2VsZi5qb2JzW2ppZF0gPSBKb2IoCiAgICBieXRlY18wIC8vIDB4NmE2MjVmCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyNjAtMjcyCiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IEpvYigKICAgIC8vICAgICBqb2JfaWQ9YXJjNC5VSW50NjQoamlkKSwKICAgIC8vICAgICBjbGllbnQ9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIHNlcnZlcl9hZ2VudF9pZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICB2YWxpZGF0b3JfYWdlbnRfaWQ9dmFsaWRhdG9yX2FnZW50X2lkLAogICAgLy8gICAgIGJ1ZGdldF9taWNybz1idWRnZXRfbWljcm8sCiAgICAvLyAgICAgc3BlY19oYXNoPXNwZWNfaGFzaC5jb3B5KCksCiAgICAvLyAgICAgcmVzdWx0X2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoQnl0ZXMoYiIiKSksCiAgICAvLyAgICAgc3RhdHVzPWFyYzQuVUludDY0KE9QRU4pLAogICAgLy8gICAgIGNyZWF0ZWRfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICAgICB1cGRhdGVkX2F0PWFyYzQuVUludDY0KG5vdyksCiAgICAvLyAgICAgZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkPWFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI3MwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvdmVyc19ib3hfZ3Jvd3RoKG1iciwgbWJyX2JlZm9yZSkKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9jb3ZlcnNfYm94X2dyb3d0aAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5hc3NpZ25fam9iW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzaWduX2pvYjoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyOTAKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIHVuY292ZXIgMgogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjkxCiAgICAvLyBhc3NlcnQgamlkIGluIHNlbGYuam9icywgInVua25vd24gam9iIgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyOTIKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyOTItMjkzCiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBhc3NlcnQgai5jbGllbnQubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBjbGllbnQgbWF5IGFzc2lnbiIKICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI5MwogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSBhc3NpZ24iCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY2xpZW50IG1heSBhc3NpZ24KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI5NAogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBPUEVOLCAiam9iIGlzIG5vIGxvbmdlciBvcGVuIgogICAgZGlnIDEKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIGpvYiBpcyBubyBsb25nZXIgb3BlbgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Mjk1CiAgICAvLyBhc3NlcnQgc2VydmVyX2FnZW50X2lkLm5hdGl2ZSA+IDAsICJhZ2VudCBpZCByZXF1aXJlZCIKICAgIGRpZyA0CiAgICBidG9pCiAgICBhc3NlcnQgLy8gYWdlbnQgaWQgcmVxdWlyZWQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjI5OQogICAgLy8gai52YWxpZGF0b3JfYWdlbnRfaWQsCiAgICBkaWcgMQogICAgcHVzaGludCA0OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMDIKICAgIC8vIHNlbGYuX2FnZW50X2FkZHJlc3Moc2VydmVyX2FnZW50X2lkKSwKICAgIGRpZyA1CiAgICBjYWxsc3ViIF9hZ2VudF9hZGRyZXNzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyOTctMzAzCiAgICAvLyBzZWxmLl9jaGVja19mYWxsYmFjaygKICAgIC8vICAgICBmYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQsCiAgICAvLyAgICAgai52YWxpZGF0b3JfYWdlbnRfaWQsCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkLAogICAgLy8gICAgIGouY2xpZW50Lm5hdGl2ZSwKICAgIC8vICAgICBzZWxmLl9hZ2VudF9hZGRyZXNzKHNlcnZlcl9hZ2VudF9pZCksCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBkaWcgNwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgX2NoZWNrX2ZhbGxiYWNrCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMDQKICAgIC8vIGouc2VydmVyX2FnZW50X2lkID0gc2VydmVyX2FnZW50X2lkCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMDUKICAgIC8vIGouZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkID0gZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDkyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMDYKICAgIC8vIGouc3RhdHVzID0gYXJjNC5VSW50NjQoQVNTSUdORUQpCiAgICBpbnRjXzIgLy8gMQogICAgaXRvYgogICAgcmVwbGFjZTIgNjgKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMDcKICAgIC8vIGoudXBkYXRlZF9hdCA9IGFyYzQuVUludDY0KHNlbGYuX25vdygpKQogICAgaXRvYgogICAgcmVwbGFjZTIgODQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjMwOAogICAgLy8gc2VsZi5qb2JzW2ppZF0gPSBqLmNvcHkoKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Mjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5zdWJtaXRfcmVzdWx0W3JvdXRpbmddKCkgLT4gdm9pZDoKc3VibWl0X3Jlc3VsdDoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMjAKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjMyMQogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzIyCiAgICAvLyBhc3NlcnQgcmVzdWx0X2hhc2gubmF0aXZlLmxlbmd0aCA9PSAzMiwgInJlc3VsdF9oYXNoIG11c3QgYmUgYSBzaGEyNTYgZGlnZXN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyByZXN1bHRfaGFzaCBtdXN0IGJlIGEgc2hhMjU2IGRpZ2VzdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzI0CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzI0LTMyNQogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBBU1NJR05FRCwgImpvYiBpcyBub3QgYXdhaXRpbmcgYSByZXN1bHQiCiAgICBkdXAKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzI1CiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IEFTU0lHTkVELCAiam9iIGlzIG5vdCBhd2FpdGluZyBhIHJlc3VsdCIKICAgIGJ0b2kKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGpvYiBpcyBub3QgYXdhaXRpbmcgYSByZXN1bHQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjMyNy0zMzYKICAgIC8vICMgT25seSB0aGUgYXNzaWduZWUgbWF5IHN1Ym1pdC4gVGhpcyB3YXMgcHJldmlvdXNseSBsZWZ0IHRvIHRoZSBjbGllbnQKICAgIC8vICMgU0RLLCB3aXRoIGEgbm90ZSBzYXlpbmcgYW4gaW5uZXIgYXBwIGNhbGwgd2FzICJ0aGUgbmV4dCBpdGVyYXRpb24iIOKAlAogICAgLy8gIyB3aGljaCBtZWFudCBhbnlvbmUgY291bGQgY29tbWl0IGEgcmVzdWx0IGhhc2ggYWdhaW5zdCBhbnlvbmUncyBqb2IgYW5kCiAgICAvLyAjIG1vdmUgaXQgdG8gU1VCTUlUVEVELCBhbmQgdGhlIHJlYWwgYXNzaWduZWUgY291bGQgdGhlbiBuZXZlciBzdWJtaXQuCiAgICAvLyAjIEEgY2hlY2sgdGhhdCBsaXZlcyBpbiB0aGUgU0RLIGlzIG5vdCBhIGNoZWNrLgogICAgLy8gYXNzaWduZWVfYWRkciwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5BZGRyZXNzXSgKICAgIC8vICAgICAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIsCiAgICAvLyAgICAgai5zZXJ2ZXJfYWdlbnRfaWQsCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzM0CiAgICAvLyBqLnNlcnZlcl9hZ2VudF9pZCwKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMzUKICAgIC8vIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA4IC8vICJpZGVudGl0eV9hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaWRlbnRpdHlfYXBwIGV4aXN0cwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMjctMzM2CiAgICAvLyAjIE9ubHkgdGhlIGFzc2lnbmVlIG1heSBzdWJtaXQuIFRoaXMgd2FzIHByZXZpb3VzbHkgbGVmdCB0byB0aGUgY2xpZW50CiAgICAvLyAjIFNESywgd2l0aCBhIG5vdGUgc2F5aW5nIGFuIGlubmVyIGFwcCBjYWxsIHdhcyAidGhlIG5leHQgaXRlcmF0aW9uIiDigJQKICAgIC8vICMgd2hpY2ggbWVhbnQgYW55b25lIGNvdWxkIGNvbW1pdCBhIHJlc3VsdCBoYXNoIGFnYWluc3QgYW55b25lJ3Mgam9iIGFuZAogICAgLy8gIyBtb3ZlIGl0IHRvIFNVQk1JVFRFRCwgYW5kIHRoZSByZWFsIGFzc2lnbmVlIGNvdWxkIHRoZW4gbmV2ZXIgc3VibWl0LgogICAgLy8gIyBBIGNoZWNrIHRoYXQgbGl2ZXMgaW4gdGhlIFNESyBpcyBub3QgYSBjaGVjay4KICAgIC8vIGFzc2lnbmVlX2FkZHIsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuQWRkcmVzc10oCiAgICAvLyAgICAgImFnZW50X2FkZHJlc3ModWludDY0KWFkZHJlc3MiLAogICAgLy8gICAgIGouc2VydmVyX2FnZW50X2lkLAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIC8vICkKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICBleHRyYWN0IDQgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMzcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGFzc2lnbmVlX2FkZHIubmF0aXZlLCAib25seSB0aGUgYXNzaWduZWQgYWdlbnQgbWF5IHN1Ym1pdCBhIHJlc3VsdCIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgYXNzaWduZWQgYWdlbnQgbWF5IHN1Ym1pdCBhIHJlc3VsdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzM5CiAgICAvLyBtYnJfYmVmb3JlID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNDAKICAgIC8vIGoucmVzdWx0X2hhc2ggPSByZXN1bHRfaGFzaC5jb3B5KCkKICAgIGRpZyAyCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM0MQogICAgLy8gai5zdGF0dXMgPSBhcmM0LlVJbnQ2NChTVUJNSVRURUQpCiAgICBwdXNoaW50IDIKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY4CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzQyCiAgICAvLyBqLnVwZGF0ZWRfYXQgPSBhcmM0LlVJbnQ2NChzZWxmLl9ub3coKSkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDg0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNDMKICAgIC8vIHNlbGYuam9ic1tqaWRdID0gai5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzQ0CiAgICAvLyBzZWxmLl9hc3NlcnRfY292ZXJzX2JveF9ncm93dGgobWJyLCBtYnJfYmVmb3JlKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvdmVyc19ib3hfZ3Jvd3RoCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LnZhbGlkYXRpb25fcmVzcG9uc2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2YWxpZGF0aW9uX3Jlc3BvbnNlOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzY0CiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNjUKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4NmE2MjVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdW5rbm93biBqb2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM2NgogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM2Ni0zNjcKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gU1VCTUlUVEVELCAibm90aGluZyBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8ganVkZ2UiCiAgICBkdXAKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzY3CiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IFNVQk1JVFRFRCwgIm5vdGhpbmcgaGFzIGJlZW4gc3VibWl0dGVkIHRvIGp1ZGdlIgogICAgYnRvaQogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdGhpbmcgaGFzIGJlZW4gc3VibWl0dGVkIHRvIGp1ZGdlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNjkKICAgIC8vIGlmIGoudmFsaWRhdG9yX2FnZW50X2lkLm5hdGl2ZSA+IDA6CiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgYnogdmFsaWRhdGlvbl9yZXNwb25zZV9lbHNlX2JvZHlAMTAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM3MQogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBqLnVwZGF0ZWRfYXQubmF0aXZlICsgc2VsZi5kaXNwdXRlX3dpbmRvdwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4NAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiZGlzcHV0ZV93aW5kb3ciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGlzcHV0ZV93aW5kb3cgZXhpc3RzCiAgICArCiAgICA+CiAgICBjb3ZlciA0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNzMtMzc5CiAgICAvLyAjIFRoZSBzZWNvbmQganVkZ2UgaXMgdGhlIGNyZWF0b3Itc2V0IGFyYml0ZXIgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlCiAgICAvLyAjIHRoZSBmYWxsYmFjayBuYW1lZCBhdCBwYWlyaW5nIHRpbWUuIFdoZW4gYW4gYXJiaXRlciBpcyBzZXQgaXQKICAgIC8vICMgc3VwZXJzZWRlcyBhbnkgcGFydHktbmFtZWQgZmFsbGJhY2ssIHNvIGEgd29ya2VyJ3Mgb3duIHB1cHBldAogICAgLy8gIyBmYWxsYmFjayBjYW4gbmV2ZXIgYWN0IOKAlCB0aGUgYXJiaXRlciwgYSB0cnVzdGVkIGluZGVwZW5kZW50IGp1ZGdlLAogICAgLy8gIyBkb2VzLiBBIGpvYiB0aGF0IG5hbWVkIGEgZmFsbGJhY2sgYmVmb3JlIGFuIGFyYml0ZXIgd2FzIHNldCBoYXMgdGhhdAogICAgLy8gIyBmYWxsYmFjayBxdWlldGx5IG92ZXJyaWRkZW4gaGVyZS4KICAgIC8vIGVmZmVjdGl2ZV9mYWxsYmFjayA9IGouZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkLm5hdGl2ZQogICAgcHVzaGludCA5MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDkKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM4MAogICAgLy8gaWYgc2VsZi5hcmJpdGVyX2FnZW50X2lkID4gMDoKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmJpdGVyX2FnZW50X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0ZXJfYWdlbnRfaWQgZXhpc3RzCiAgICBieiB2YWxpZGF0aW9uX3Jlc3BvbnNlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzgxCiAgICAvLyBlZmZlY3RpdmVfZmFsbGJhY2sgPSBzZWxmLmFyYml0ZXJfYWdlbnRfaWQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmJpdGVyX2FnZW50X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0ZXJfYWdlbnRfaWQgZXhpc3RzCgp2YWxpZGF0aW9uX3Jlc3BvbnNlX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjM4MgogICAgLy8gaXNfcHJpbWFyeSA9IGFzX3ZhbGlkYXRvci5uYXRpdmUgPT0gai52YWxpZGF0b3JfYWdlbnRfaWQubmF0aXZlCiAgICBkaWcgNAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDgKICAgID09CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozODQtMzg2CiAgICAvLyBwcmltYXJ5X3NpbGVudAogICAgLy8gYW5kIGVmZmVjdGl2ZV9mYWxsYmFjayA+IDAKICAgIC8vIGFuZCBhc192YWxpZGF0b3IubmF0aXZlID09IGVmZmVjdGl2ZV9mYWxsYmFjawogICAgdW5jb3ZlciAzCiAgICBieiB2YWxpZGF0aW9uX3Jlc3BvbnNlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJ6IHZhbGlkYXRpb25fcmVzcG9uc2VfYm9vbF9mYWxzZUA4CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozODYKICAgIC8vIGFuZCBhc192YWxpZGF0b3IubmF0aXZlID09IGVmZmVjdGl2ZV9mYWxsYmFjawogICAgZGlnIDUKICAgIGRpZyA4CiAgICA9PQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Mzg0LTM4NgogICAgLy8gcHJpbWFyeV9zaWxlbnQKICAgIC8vIGFuZCBlZmZlY3RpdmVfZmFsbGJhY2sgPiAwCiAgICAvLyBhbmQgYXNfdmFsaWRhdG9yLm5hdGl2ZSA9PSBlZmZlY3RpdmVfZmFsbGJhY2sKICAgIGJ6IHZhbGlkYXRpb25fcmVzcG9uc2VfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzIgLy8gMQoKdmFsaWRhdGlvbl9yZXNwb25zZV9ib29sX21lcmdlQDk6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozODkKICAgIC8vIGlzX3ByaW1hcnkgb3IgaXNfZmFsbGJhY2sKICAgIHx8CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozODgtMzkwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGlzX3ByaW1hcnkgb3IgaXNfZmFsbGJhY2sKICAgIC8vICksICJvbmx5IHRoZSBuYW1lZCB2YWxpZGF0b3IgbWF5IGp1ZGdlLCBvciB0aGUgZmFsbGJhY2svYXJiaXRlciBvbmNlIHRoZSB2YWxpZGF0b3IncyB3aW5kb3cgaGFzIHBhc3NlZCIKICAgIGFzc2VydCAvLyBvbmx5IHRoZSBuYW1lZCB2YWxpZGF0b3IgbWF5IGp1ZGdlLCBvciB0aGUgZmFsbGJhY2svYXJiaXRlciBvbmNlIHRoZSB2YWxpZGF0b3IncyB3aW5kb3cgaGFzIHBhc3NlZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MzkxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLl9hZ2VudF9hZGRyZXNzKGFzX3ZhbGlkYXRvciksICJ5b3UgZG8gbm90IGNvbnRyb2wgdGhhdCB2YWxpZGF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX2FnZW50X2FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8geW91IGRvIG5vdCBjb250cm9sIHRoYXQgdmFsaWRhdG9yCgp2YWxpZGF0aW9uX3Jlc3BvbnNlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozOTUtMzk3CiAgICAvLyAjIEEgUHl0aG9uLWxpdGVyYWwgdGVybmFyeSBpcyBub3QgYSB2YWx1ZSB0aGUgQVZNIGNhbiBob2xkOyBicmFuY2ggYW5kCiAgICAvLyAjIGJ1aWxkIGEgVUludDY0IG9uIGVhY2ggc2lkZSBpbnN0ZWFkLgogICAgLy8gbmV3X3N0YXR1cyA9IFVJbnQ2NChWQUxJREFURUQpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgNQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Mzk4CiAgICAvLyBpZiBub3QgcGFzc2VkLm5hdGl2ZToKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgYm56IHZhbGlkYXRpb25fcmVzcG9uc2VfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Mzk5CiAgICAvLyBuZXdfc3RhdHVzID0gVUludDY0KERJU1BVVEVEKQogICAgcHVzaGludCA0CiAgICBidXJ5IDQKCnZhbGlkYXRpb25fcmVzcG9uc2VfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQwMAogICAgLy8gai5zdGF0dXMgPSBhcmM0LlVJbnQ2NChuZXdfc3RhdHVzKQogICAgZGlnIDMKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA2OAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjIwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQwMQogICAgLy8gai51cGRhdGVkX2F0ID0gYXJjNC5VSW50NjQoc2VsZi5fbm93KCkpCiAgICBpdG9iCiAgICByZXBsYWNlMiA4NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDAyCiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IGouY29weSgpCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKdmFsaWRhdGlvbl9yZXNwb25zZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiB2YWxpZGF0aW9uX3Jlc3BvbnNlX2Jvb2xfbWVyZ2VAOQoKdmFsaWRhdGlvbl9yZXNwb25zZV9lbHNlX2JvZHlAMTA6CiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgcG9wCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTozOTMKICAgIC8vIGFzc2VydCBqLmNsaWVudC5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGNsaWVudCBtYXkganVkZ2UgYSBqb2Igd2l0aCBubyB2YWxpZGF0b3IiCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDgKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY2xpZW50IG1heSBqdWRnZSBhIGpvYiB3aXRoIG5vIHZhbGlkYXRvcgogICAgYiB2YWxpZGF0aW9uX3Jlc3BvbnNlX2FmdGVyX2lmX2Vsc2VAMTEKCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5yZWNvcmRfam9iX3ZlcmRpY3Rbcm91dGluZ10oKSAtPiB2b2lkOgpyZWNvcmRfam9iX3ZlcmRpY3Q6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQyNwogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDI4CiAgICAvLyBhc3NlcnQgamlkIGluIHNlbGYuam9icywgInVua25vd24gam9iIgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0MjktNDMwCiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBzdGF0dXMgPSBqLnN0YXR1cy5uYXRpdmUKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDMwCiAgICAvLyBzdGF0dXMgPSBqLnN0YXR1cy5uYXRpdmUKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDMxCiAgICAvLyBhc3NlcnQgc3RhdHVzID09IFZBTElEQVRFRCBvciBzdGF0dXMgPT0gRElTUFVURUQsICJubyB2ZXJkaWN0IGhhcyBiZWVuIGRlY2lkZWQgeWV0IgogICAgcHVzaGludCAzCiAgICA9PQogICAgZHVwCiAgICBibnogcmVjb3JkX2pvYl92ZXJkaWN0X2Jvb2xfdHJ1ZUAzCiAgICBkaWcgNAogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogcmVjb3JkX2pvYl92ZXJkaWN0X2Jvb2xfZmFsc2VANAoKcmVjb3JkX2pvYl92ZXJkaWN0X2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18yIC8vIDEKCnJlY29yZF9qb2JfdmVyZGljdF9ib29sX21lcmdlQDU6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0MzEKICAgIC8vIGFzc2VydCBzdGF0dXMgPT0gVkFMSURBVEVEIG9yIHN0YXR1cyA9PSBESVNQVVRFRCwgIm5vIHZlcmRpY3QgaGFzIGJlZW4gZGVjaWRlZCB5ZXQiCiAgICBhc3NlcnQgLy8gbm8gdmVyZGljdCBoYXMgYmVlbiBkZWNpZGVkIHlldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDMzCiAgICAvLyByZXAgPSBBcHBsaWNhdGlvbihzZWxmLnJlcHV0YXRpb25fYXBwKS5hZGRyZXNzCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlcHV0YXRpb25fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlcHV0YXRpb25fYXBwIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0MzQKICAgIC8vIGFzc2VydCBtYnIucmVjZWl2ZXIgPT0gcmVwLCAic3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGUgcmVwdXRhdGlvbiBhcHAiCiAgICB1bmNvdmVyIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgID09CiAgICBhc3NlcnQgLy8gc3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGUgcmVwdXRhdGlvbiBhcHAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQzNQogICAgLy8gYXNzZXJ0IG1ici5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInlvdSBtdXN0IHBheSBmb3IgdGhlIHN0b3JhZ2UgeW91IGNyZWF0ZSIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHlvdSBtdXN0IHBheSBmb3IgdGhlIHN0b3JhZ2UgeW91IGNyZWF0ZQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDM2LTQzNwogICAgLy8gIyBPbmUgc2NvcmUgYm94ICh+MC4wMjkzIEFMR08pIHBsdXMgb25lIGRlZHVwZSBib3ggKH4wLjAwNzMpIHdvcnN0IGNhc2UuCiAgICAvLyBhc3NlcnQgbWJyLmFtb3VudCA+PSAzN18wMDAsICJwYXltZW50IG11c3QgY292ZXIgdGhlIHNjb3JlIGFuZCBkZWR1cGUgYm94ZXMgKD49MC4wMzcgQUxHTykiCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMzcwMDAKICAgID49CiAgICBhc3NlcnQgLy8gcGF5bWVudCBtdXN0IGNvdmVyIHRoZSBzY29yZSBhbmQgZGVkdXBlIGJveGVzICg+PTAuMDM3IEFMR08pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0MzktNDQ1CiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgICJyZWNvcmRfdmFsaWRhdGlvbih1aW50NjQsdWludDY0LGJvb2wpYm9vbCIsCiAgICAvLyAgICAgam9iX2lkLAogICAgLy8gICAgIGouc2VydmVyX2FnZW50X2lkLAogICAgLy8gICAgIGFyYzQuQm9vbChzdGF0dXMgPT0gVkFMSURBVEVEKSwKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5yZXB1dGF0aW9uX2FwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ0MgogICAgLy8gai5zZXJ2ZXJfYWdlbnRfaWQsCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDQzCiAgICAvLyBhcmM0LkJvb2woc3RhdHVzID09IFZBTElEQVRFRCksCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDM5LTQ0NQogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICAicmVjb3JkX3ZhbGlkYXRpb24odWludDY0LHVpbnQ2NCxib29sKWJvb2wiLAogICAgLy8gICAgIGpvYl9pZCwKICAgIC8vICAgICBqLnNlcnZlcl9hZ2VudF9pZCwKICAgIC8vICAgICBhcmM0LkJvb2woc3RhdHVzID09IFZBTElEQVRFRCksCiAgICAvLyAgICAgYXBwX2lkPXNlbGYucmVwdXRhdGlvbl9hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg1OGZkODhjNSAvLyBtZXRob2QgInJlY29yZF92YWxpZGF0aW9uKHVpbnQ2NCx1aW50NjQsYm9vbClib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpyZWNvcmRfam9iX3ZlcmRpY3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVjb3JkX2pvYl92ZXJkaWN0X2Jvb2xfbWVyZ2VANQoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LmZ1bmRfam9iW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZF9qb2I6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTY1CiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NjYKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBpdG9iCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NjctNTY4CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBhc3NlcnQgai5jbGllbnQubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBjbGllbnQgbWF5IGZ1bmQgdGhlaXIgb3duIGpvYiIKICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU2OAogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSBmdW5kIHRoZWlyIG93biBqb2IiCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNsaWVudCBtYXkgZnVuZCB0aGVpciBvd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NjkKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gT1BFTiBvciBqLnN0YXR1cy5uYXRpdmUgPT0gQVNTSUdORUQsICJqb2IgaXMgcGFzdCBmdW5kaW5nIgogICAgcHVzaGludCA2OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ6IGZ1bmRfam9iX2Jvb2xfdHJ1ZUAzCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBieiBmdW5kX2pvYl9ib29sX2ZhbHNlQDQKCmZ1bmRfam9iX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18yIC8vIDEKCmZ1bmRfam9iX2Jvb2xfbWVyZ2VANToKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU2OQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBPUEVOIG9yIGouc3RhdHVzLm5hdGl2ZSA9PSBBU1NJR05FRCwgImpvYiBpcyBwYXN0IGZ1bmRpbmciCiAgICBhc3NlcnQgLy8gam9iIGlzIHBhc3QgZnVuZGluZwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTcxCiAgICAvLyBhc3NlcnQgcGF5bWVudC5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiZXNjcm93IG11c3QgYmUgcGFpZCB0byB0aGlzIGFwcCIKICAgIHN3YXAKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gZXNjcm93IG11c3QgYmUgcGFpZCB0byB0aGlzIGFwcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTcyCiAgICAvLyBhc3NlcnQgcGF5bWVudC5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInRoZSBmdW5kZXIgbXVzdCBiZSB0aGUgY2xpZW50IgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gdGhlIGZ1bmRlciBtdXN0IGJlIHRoZSBjbGllbnQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU3MwogICAgLy8gYXNzZXJ0IHBheW1lbnQueGZlcl9hc3NldC5pZCA9PSBzZWxmLmVzY3Jvd19hc3NldCwgImVzY3JvdyBpcyBkZW5vbWluYXRlZCBpbiBvbmUgYXNzZXQ7IHRoaXMgaXMgbm90IGl0IgogICAgZHVwCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJlc2Nyb3dfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Fzc2V0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBlc2Nyb3cgaXMgZGVub21pbmF0ZWQgaW4gb25lIGFzc2V0OyB0aGlzIGlzIG5vdCBpdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTc0CiAgICAvLyBhc3NlcnQgcGF5bWVudC5hc3NldF9hbW91bnQgPiAwLCAiYSB6ZXJvIHRyYW5zZmVyIGVzY3Jvd3Mgbm90aGluZyIKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhIHplcm8gdHJhbnNmZXIgZXNjcm93cyBub3RoaW5nCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NzcKICAgIC8vIGlmIGppZCBpbiBzZWxmLmVzY3JvdzoKICAgIGJ5dGVjIDcgLy8gMHg2NTczNWYKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZnVuZF9qb2JfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NzgKICAgIC8vIGhlbGQgKz0gc2VsZi5lc2Nyb3dbamlkXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3cgZW50cnkgZXhpc3RzCiAgICBidG9pCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKCmZ1bmRfam9iX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU3OQogICAgLy8gYXNzZXJ0IGhlbGQgPD0gai5idWRnZXRfbWljcm8ubmF0aXZlLCAiZXNjcm93IGNhbm5vdCBleGNlZWQgdGhlIGFncmVlZCBidWRnZXQiCiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDU2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gZXNjcm93IGNhbm5vdCBleGNlZWQgdGhlIGFncmVlZCBidWRnZXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU4MQogICAgLy8gbWJyX2JlZm9yZSA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTgyCiAgICAvLyBzZWxmLmVzY3Jvd1tqaWRdID0gaGVsZAogICAgc3dhcAogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTgzCiAgICAvLyBzZWxmLl9hc3NlcnRfY292ZXJzX2JveF9ncm93dGgobWJyLCBtYnJfYmVmb3JlKQogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfYXNzZXJ0X2NvdmVyc19ib3hfZ3Jvd3RoCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTg1CiAgICAvLyBqLnVwZGF0ZWRfYXQgPSBhcmM0LlVJbnQ2NChzZWxmLl9ub3coKSkKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjU4NS01ODYKICAgIC8vIGoudXBkYXRlZF9hdCA9IGFyYzQuVUludDY0KHNlbGYuX25vdygpKQogICAgLy8gc2VsZi5qb2JzW2ppZF0gPSBqLmNvcHkoKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDg0CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKZnVuZF9qb2JfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgZnVuZF9qb2JfYm9vbF9tZXJnZUA1CgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkucmVsZWFzZV9lc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgpyZWxlYXNlX2VzY3JvdzoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTk5CiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICBidG9pCiAgICBkdXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYwMAogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjAxLTYwMgogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBWQUxJREFURUQsICJlc2Nyb3cgaXMgcmVsZWFzZWQgb24gYSBwYXNzaW5nIHZlcmRpY3QiCiAgICBkdXAKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjAyCiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IFZBTElEQVRFRCwgImVzY3JvdyBpcyByZWxlYXNlZCBvbiBhIHBhc3NpbmcgdmVyZGljdCIKICAgIGJ0b2kKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBlc2Nyb3cgaXMgcmVsZWFzZWQgb24gYSBwYXNzaW5nIHZlcmRpY3QKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYwNAogICAgLy8gcGFzdF93aW5kb3cgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGoudXBkYXRlZF9hdC5uYXRpdmUgKyBzZWxmLmRpc3B1dGVfd2luZG93CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkaWcgMQogICAgcHVzaGludCA4NAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiZGlzcHV0ZV93aW5kb3ciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGlzcHV0ZV93aW5kb3cgZXhpc3RzCiAgICArCiAgICA+CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MDUKICAgIC8vIGFzc2VydCBqLmNsaWVudC5uYXRpdmUgPT0gVHhuLnNlbmRlciBvciBwYXN0X3dpbmRvdywgIm9ubHkgdGhlIGNsaWVudCBtYXkgcmVsZWFzZSBiZWZvcmUgdGhlIGRpc3B1dGUgd2luZG93IGNsb3NlcyIKICAgIHN3YXAKICAgIGludGNfMCAvLyA4CiAgICBpbnRjXzMgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIHR4biBTZW5kZXIKICAgID09CiAgICB8fAogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNsaWVudCBtYXkgcmVsZWFzZSBiZWZvcmUgdGhlIGRpc3B1dGUgd2luZG93IGNsb3NlcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjA3LTYxNgogICAgLy8gIyBUaGUgd29ya2VyIGlzIG5ldmVyIHBhaWQgbW9yZSB0aGFuIHRoZSBhZ3JlZWQgYnVkZ2V0LiBFc2Nyb3cgY2FuIGV4Y2VlZAogICAgLy8gIyBpdCDigJQgZnVuZF9qb2Igbm93IHJlZnVzZXMgdGhhdCwgYnV0IGFjY2VwdF9iaWQgcmV3cml0ZXMgdGhlIGJ1ZGdldCBET1dOCiAgICAvLyAjIHRvIHRoZSBiaWQgYWZ0ZXIgZnVuZGluZywgc28gYSBqb2IgZnVuZGVkIGF0IDEuMCB0aGVuIGxldCBhdCAwLjQgaG9sZHMKICAgIC8vICMgMS4wIGFnYWluc3QgYSAwLjQgYnVkZ2V0LiBXaXRob3V0IHRoaXMgdGhlIGFueW9uZS1hZnRlci13aW5kb3cgcmVsZWFzZQogICAgLy8gIyBoYW5kZWQgdGhlIHdob2xlIDEuMCB0byB0aGUgd29ya2VyIGFuZCB0aGUgY2xpZW50IGhhZCBubyB3YXkgdG8gcmVjb3ZlcgogICAgLy8gIyB0aGUgMC42LiBSZXR1cm4gdGhlIGV4Y2VzcyB0byB0aGUgY2xpZW50IGZpcnN0LCB0aGVuIHNldHRsZSB0aGUgcmVzdC4KICAgIC8vICMgR3VhcmRlZCBvbiB0aGUgZXNjcm93IGV4aXN0aW5nIHNvIGFuIHVuZnVuZGVkLWJ1dC12YWxpZGF0ZWQgam9iIHN0aWxsCiAgICAvLyAjIGZhaWxzIHdpdGggX3BheV9lc2Nyb3cncyBvd24gIm5vdGhpbmcgaXMgZXNjcm93ZWQiIG1lc3NhZ2UsIG5vdCBhCiAgICAvLyAjIGJveC1ub3QtZm91bmQgb24gdGhpcyByZWFkLgogICAgLy8gaWYgamlkIGluIHNlbGYuZXNjcm93OgogICAgYnl0ZWMgNyAvLyAweDY1NzM1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogcmVsZWFzZV9lc2Nyb3dfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MTcKICAgIC8vIGhlbGQgPSBzZWxmLmVzY3Jvd1tqaWRdCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93IGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYxOAogICAgLy8gYnVkZ2V0ID0gai5idWRnZXRfbWljcm8ubmF0aXZlCiAgICBkaWcgMQogICAgcHVzaGludCA1NgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjE5CiAgICAvLyBpZiBoZWxkID4gYnVkZ2V0OgogICAgPgogICAgYnogcmVsZWFzZV9lc2Nyb3dfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MjAKICAgIC8vIHNlbGYuZXNjcm93W2ppZF0gPSBidWRnZXQKICAgIGRpZyA1CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MjEtNjI2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1qLmNsaWVudC5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWhlbGQgLSBidWRnZXQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MjIKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5lc2Nyb3dfYXNzZXQsCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiZXNjcm93X2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hc3NldCBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYyNAogICAgLy8gYXNzZXRfYW1vdW50PWhlbGQgLSBidWRnZXQsCiAgICBkaWcgNgogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjIxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYyNQogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYyMS02MjYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWouY2xpZW50Lm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9aGVsZCAtIGJ1ZGdldCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpyZWxlYXNlX2VzY3Jvd19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MjgKICAgIC8vIHBhaWQgPSBzZWxmLl9wYXlfZXNjcm93KGppZCwgc2VsZi5fYWdlbnRfYWRkcmVzcyhqLnNlcnZlcl9hZ2VudF9pZCksIFRydWUpCiAgICBwdXNoaW50IDQwCiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgX2FnZW50X2FkZHJlc3MKICAgIGludGNfMiAvLyAxCiAgICBjYWxsc3ViIF9wYXlfZXNjcm93CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MjkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChwYWlkKQogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5yZWZ1bmRfZXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVmdW5kX2VzY3JvdzoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2MzkKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjQwCiAgICAvLyBhc3NlcnQgamlkIGluIHNlbGYuam9icywgInVua25vd24gam9iIgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NDMKICAgIC8vIGouc3RhdHVzLm5hdGl2ZSA9PSBESVNQVVRFRCBvciBqLnN0YXR1cy5uYXRpdmUgPT0gQ0FOQ0VMTEVECiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCA0CiAgICA9PQogICAgYm56IHJlZnVuZF9lc2Nyb3dfYm9vbF90cnVlQDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBieiByZWZ1bmRfZXNjcm93X2Jvb2xfZmFsc2VANAoKcmVmdW5kX2VzY3Jvd19ib29sX3RydWVAMzoKICAgIGludGNfMiAvLyAxCgpyZWZ1bmRfZXNjcm93X2Jvb2xfbWVyZ2VANToKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY0Mi02NDQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgai5zdGF0dXMubmF0aXZlID09IERJU1BVVEVEIG9yIGouc3RhdHVzLm5hdGl2ZSA9PSBDQU5DRUxMRUQKICAgIC8vICksICJlc2Nyb3cgaXMgcmVmdW5kZWQgb24gYSBmYWlsZWQgdmVyZGljdCBvciBhIGNhbmNlbGxlZCBqb2IiCiAgICBhc3NlcnQgLy8gZXNjcm93IGlzIHJlZnVuZGVkIG9uIGEgZmFpbGVkIHZlcmRpY3Qgb3IgYSBjYW5jZWxsZWQgam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NDYKICAgIC8vIHBhaWQgPSBzZWxmLl9wYXlfZXNjcm93KGppZCwgai5jbGllbnQubmF0aXZlLCBGYWxzZSkKICAgIGludGNfMCAvLyA4CiAgICBpbnRjXzMgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMAogICAgY2FsbHN1YiBfcGF5X2VzY3JvdwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQocGFpZCkKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjYzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpyZWZ1bmRfZXNjcm93X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlZnVuZF9lc2Nyb3dfYm9vbF9tZXJnZUA1CgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkucmVjbGFpbV9zdHJhbmRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlY2xhaW1fc3RyYW5kZWQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjY3CiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NjgKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjY5LTY3MAogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBWQUxJREFURUQsICJvbmx5IGEgcGFzc2VkIGpvYidzIGVzY3JvdyBjYW4gYmUgcmVjbGFpbWVkIgogICAgZHVwCiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY3MAogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBWQUxJREFURUQsICJvbmx5IGEgcGFzc2VkIGpvYidzIGVzY3JvdyBjYW4gYmUgcmVjbGFpbWVkIgogICAgYnRvaQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgYSBwYXNzZWQgam9iJ3MgZXNjcm93IGNhbiBiZSByZWNsYWltZWQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY3MQogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSByZWNsYWltIgogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgaW50Y18zIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNsaWVudCBtYXkgcmVjbGFpbQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjczCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGoudXBkYXRlZF9hdC5uYXRpdmUgKyBzZWxmLmRpc3B1dGVfd2luZG93ICogNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDg0CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJkaXNwdXRlX3dpbmRvdyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3dpbmRvdyBleGlzdHMKICAgIHB1c2hpbnQgNAogICAgKgogICAgKwogICAgPgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjcyLTY3NAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGoudXBkYXRlZF9hdC5uYXRpdmUgKyBzZWxmLmRpc3B1dGVfd2luZG93ICogNAogICAgLy8gKSwgInRoZSB3b3JrZXIgc3RpbGwgaGFzIHRpbWUgdG8gYmUgcGFpZCIKICAgIGFzc2VydCAvLyB0aGUgd29ya2VyIHN0aWxsIGhhcyB0aW1lIHRvIGJlIHBhaWQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY3NgogICAgLy8gcGFpZCA9IHNlbGYuX3BheV9lc2Nyb3coamlkLCBqLmNsaWVudC5uYXRpdmUsIEZhbHNlKQogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgX3BheV9lc2Nyb3cKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY3NwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHBhaWQpCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LmdldF9lc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfZXNjcm93OgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Njc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY4MgogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NjgzCiAgICAvLyBpZiBqaWQgaW4gc2VsZi5lc2Nyb3c6CiAgICBpdG9iCiAgICBieXRlYyA3IC8vIDB4NjU3MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfZXNjcm93X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Njg0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi5lc2Nyb3dbamlkXSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3JvdyBlbnRyeSBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKCmdldF9lc2Nyb3dfYWZ0ZXJfaW5saW5lZF92YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5nZXRfZXNjcm93QDQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKZ2V0X2VzY3Jvd19hZnRlcl9pZl9lbHNlQDM6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY4NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Njc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X2VzY3Jvd19hZnRlcl9pbmxpbmVkX3ZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LmdldF9lc2Nyb3dANAoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LnNldF92YWxpZGF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfdmFsaWRhdG9yOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Njg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY5NQogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgc3dhcAogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Njk2CiAgICAvLyBhc3NlcnQgamlkIGluIHNlbGYuam9icywgInVua25vd24gam9iIgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2OTcKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2OTctNjk4CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBhc3NlcnQgai5jbGllbnQubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBjbGllbnQgbWF5IG5hbWUgdGhlIHZhbGlkYXRvciIKICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjY5OAogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSBuYW1lIHRoZSB2YWxpZGF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNsaWVudCBtYXkgbmFtZSB0aGUgdmFsaWRhdG9yCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2OTkKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gT1BFTiwgInRoZSB2YWxpZGF0b3IgaXMgZml4ZWQgb25jZSB0aGUgam9iIGlzIGFzc2lnbmVkIgogICAgZHVwCiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydCAvLyB0aGUgdmFsaWRhdG9yIGlzIGZpeGVkIG9uY2UgdGhlIGpvYiBpcyBhc3NpZ25lZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzAxCiAgICAvLyBqLnZhbGlkYXRvcl9hZ2VudF9pZCA9IHZhbGlkYXRvcl9hZ2VudF9pZAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMiA0OAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjIwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcwMgogICAgLy8gai51cGRhdGVkX2F0ID0gYXJjNC5VSW50NjQoc2VsZi5fbm93KCkpCiAgICBpdG9iCiAgICByZXBsYWNlMiA4NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzAzCiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IGouY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo2ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LnBsYWNlX2JpZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBsYWNlX2JpZDoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NDcKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIGRpZyA0CiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NDgKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4NmE2MjVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NDktNzUwCiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IE9QRU4sICJiaWRzIGNsb3NlIHdoZW4gdGhlIGpvYiBpcyBhc3NpZ25lZCIKICAgIGR1cAogICAgcHVzaGludCA2OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NTAKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gT1BFTiwgImJpZHMgY2xvc2Ugd2hlbiB0aGUgam9iIGlzIGFzc2lnbmVkIgogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIGJpZHMgY2xvc2Ugd2hlbiB0aGUgam9iIGlzIGFzc2lnbmVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NTEKICAgIC8vIGFzc2VydCBwcmljZV9taWNyby5uYXRpdmUgPiAwLCAiYSB6ZXJvIGJpZCBpcyBub3QgYW4gb2ZmZXIiCiAgICBkaWcgNAogICAgYnRvaQogICAgYXNzZXJ0IC8vIGEgemVybyBiaWQgaXMgbm90IGFuIG9mZmVyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NTIKICAgIC8vIGFzc2VydCBwaXRjaF9oYXNoLm5hdGl2ZS5sZW5ndGggPT0gMzIsICJwaXRjaF9oYXNoIG11c3QgYmUgYSBzaGEyNTYgZGlnZXN0IgogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBwaXRjaF9oYXNoIG11c3QgYmUgYSBzaGEyNTYgZGlnZXN0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NTQKICAgIC8vIGJpZGRlciA9IHNlbGYuX2FnZW50X2FkZHJlc3MoYmlkZGVyX2FnZW50X2lkKQogICAgZGlnIDUKICAgIGNhbGxzdWIgX2FnZW50X2FkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc1NQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gYmlkZGVyLCAib25seSB0aGUgYmlkZGluZyBhZ2VudCBtYXkgcGxhY2UgaXRzIG93biBiaWQiCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBiaWRkaW5nIGFnZW50IG1heSBwbGFjZSBpdHMgb3duIGJpZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzU2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciAhPSBqLmNsaWVudC5uYXRpdmUsICJ0aGUgY2xpZW50IGNhbm5vdCBiaWQgb24gdGhlaXIgb3duIGpvYiIKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gOAogICAgaW50Y18zIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgICE9CiAgICBhc3NlcnQgLy8gdGhlIGNsaWVudCBjYW5ub3QgYmlkIG9uIHRoZWlyIG93biBqb2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc2MQogICAgLy8gZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkLCBqLnZhbGlkYXRvcl9hZ2VudF9pZCwgYmlkZGVyX2FnZW50X2lkLCBqLmNsaWVudC5uYXRpdmUsIGJpZGRlcgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQ4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc1OC03NjIKICAgIC8vICMgVGhlIGZhbGxiYWNrIHRoZSBiaWRkZXIgcHJvcG9zZXMgaXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGpvYidzIHRlcm1zCiAgICAvLyAjIG5vdywgc28gYW4gYWNjZXB0aW5nIGNsaWVudCBzZWVzIGFuIGFscmVhZHktbGVnYWwgZmFsbGJhY2suCiAgICAvLyBzZWxmLl9jaGVja19mYWxsYmFjaygKICAgIC8vICAgICBmYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQsIGoudmFsaWRhdG9yX2FnZW50X2lkLCBiaWRkZXJfYWdlbnRfaWQsIGouY2xpZW50Lm5hdGl2ZSwgYmlkZGVyCiAgICAvLyApCiAgICBkaWcgNAogICAgZGlnIDEKICAgIGRpZyA5CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfY2hlY2tfZmFsbGJhY2sKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc2NAogICAgLy8gbWJyX2JlZm9yZSA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjIwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc3MAogICAgLy8gcGxhY2VkX2F0PWFyYzQuVUludDY0KHNlbGYuX25vdygpKSwKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc2NS03NzMKICAgIC8vIHNlbGYuYmlkc1tzZWxmLl9iaWRfa2V5KGppZCwgYmlkZGVyX2FnZW50X2lkLm5hdGl2ZSldID0gQmlkKAogICAgLy8gICAgIGpvYl9pZD1qb2JfaWQsCiAgICAvLyAgICAgYmlkZGVyX2FnZW50X2lkPWJpZGRlcl9hZ2VudF9pZCwKICAgIC8vICAgICBwcmljZV9taWNybz1wcmljZV9taWNybywKICAgIC8vICAgICBwaXRjaF9oYXNoPXBpdGNoX2hhc2guY29weSgpLAogICAgLy8gICAgIHBsYWNlZF9hdD1hcmM0LlVJbnQ2NChzZWxmLl9ub3coKSksCiAgICAvLyAgICAgdmFsaWRhdG9yX2FnZW50X2lkPWoudmFsaWRhdG9yX2FnZW50X2lkLAogICAgLy8gICAgIGZhbGxiYWNrX3ZhbGlkYXRvcl9hZ2VudF9pZD1mYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQsCiAgICAvLyApCiAgICB1bmNvdmVyIDgKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDMyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzY1CiAgICAvLyBzZWxmLmJpZHNbc2VsZi5fYmlkX2tleShqaWQsIGJpZGRlcl9hZ2VudF9pZC5uYXRpdmUpXSA9IEJpZCgKICAgIHVuY292ZXIgMwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzIwCiAgICAvLyByZXR1cm4gb3AuaXRvYihqb2JfaWQpICsgb3AuaXRvYihiaWRkZXIpICAjIG5vcWE6IFJFVDUwNAogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc2NQogICAgLy8gc2VsZi5iaWRzW3NlbGYuX2JpZF9rZXkoamlkLCBiaWRkZXJfYWdlbnRfaWQubmF0aXZlKV0gPSBCaWQoCiAgICBieXRlYyAxMSAvLyAweDYyNjQ1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3NjUtNzczCiAgICAvLyBzZWxmLmJpZHNbc2VsZi5fYmlkX2tleShqaWQsIGJpZGRlcl9hZ2VudF9pZC5uYXRpdmUpXSA9IEJpZCgKICAgIC8vICAgICBqb2JfaWQ9am9iX2lkLAogICAgLy8gICAgIGJpZGRlcl9hZ2VudF9pZD1iaWRkZXJfYWdlbnRfaWQsCiAgICAvLyAgICAgcHJpY2VfbWljcm89cHJpY2VfbWljcm8sCiAgICAvLyAgICAgcGl0Y2hfaGFzaD1waXRjaF9oYXNoLmNvcHkoKSwKICAgIC8vICAgICBwbGFjZWRfYXQ9YXJjNC5VSW50NjQoc2VsZi5fbm93KCkpLAogICAgLy8gICAgIHZhbGlkYXRvcl9hZ2VudF9pZD1qLnZhbGlkYXRvcl9hZ2VudF9pZCwKICAgIC8vICAgICBmYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQ9ZmFsbGJhY2tfdmFsaWRhdG9yX2FnZW50X2lkLAogICAgLy8gKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc3NAogICAgLy8gc2VsZi5fYXNzZXJ0X2NvdmVyc19ib3hfZ3Jvd3RoKG1iciwgbWJyX2JlZm9yZSkKICAgIGNhbGxzdWIgX2Fzc2VydF9jb3ZlcnNfYm94X2dyb3d0aAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS53aXRoZHJhd19iaWRbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhd19iaWQ6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc4OQogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgc3dhcAogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzkwCiAgICAvLyBhc3NlcnQgamlkIGluIHNlbGYuam9icywgInVua25vd24gam9iIgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3OTEKICAgIC8vIGtleSA9IHNlbGYuX2JpZF9rZXkoamlkLCBiaWRkZXJfYWdlbnRfaWQubmF0aXZlKQogICAgdW5jb3ZlciAyCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3MjAKICAgIC8vIHJldHVybiBvcC5pdG9iKGpvYl9pZCkgKyBvcC5pdG9iKGJpZGRlcikgICMgbm9xYTogUkVUNTA0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NzkyCiAgICAvLyBhc3NlcnQga2V5IGluIHNlbGYuYmlkcywgIm5vIHN1Y2ggYmlkIgogICAgYnl0ZWMgMTEgLy8gMHg2MjY0NWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBubyBzdWNoIGJpZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Nzk1CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IGouY2xpZW50Lm5hdGl2ZSBhbmQgai5zdGF0dXMubmF0aXZlICE9IE9QRU46CiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3OTQtNzk1CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IGouY2xpZW50Lm5hdGl2ZSBhbmQgai5zdGF0dXMubmF0aXZlICE9IE9QRU46CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gOAogICAgaW50Y18zIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6Nzk1CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IGouY2xpZW50Lm5hdGl2ZSBhbmQgai5zdGF0dXMubmF0aXZlICE9IE9QRU46CiAgICA9PQogICAgYnogd2l0aGRyYXdfYmlkX2Vsc2VfYm9keUA0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3OTQtNzk1CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IGouY2xpZW50Lm5hdGl2ZSBhbmQgai5zdGF0dXMubmF0aXZlICE9IE9QRU46CiAgICBkaWcgMQogICAgcHVzaGludCA2OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3OTUKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gai5jbGllbnQubmF0aXZlIGFuZCBqLnN0YXR1cy5uYXRpdmUgIT0gT1BFTjoKICAgIGJ0b2kKICAgIGJueiB3aXRoZHJhd19iaWRfYWZ0ZXJfaWZfZWxzZUA1Cgp3aXRoZHJhd19iaWRfZWxzZV9ib2R5QDQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3OTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5fYWdlbnRfYWRkcmVzcyhiaWRkZXJfYWdlbnRfaWQpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgY2FsbHN1YiBfYWdlbnRfYWRkcmVzcwogICAgPT0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc5OC04MDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLl9hZ2VudF9hZGRyZXNzKGJpZGRlcl9hZ2VudF9pZCkKICAgIC8vICksICJvbmx5IHRoZSBiaWRkZXIgbWF5IHdpdGhkcmF3IChvciB0aGUgY2xpZW50LCBvbmNlIHRoZSBqb2IgaGFzIGxlZnQgT1BFTikiCiAgICBhc3NlcnQgLy8gb25seSB0aGUgYmlkZGVyIG1heSB3aXRoZHJhdyAob3IgdGhlIGNsaWVudCwgb25jZSB0aGUgam9iIGhhcyBsZWZ0IE9QRU4pCgp3aXRoZHJhd19iaWRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODAyCiAgICAvLyBhcHAgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODAzCiAgICAvLyBtYnJfYmVmb3JlID0gYXBwLm1pbl9iYWxhbmNlCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4MDQKICAgIC8vIGRlbCBzZWxmLmJpZHNba2V5XQogICAgdW5jb3ZlciAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgwNS04MDYKICAgIC8vICMgUmV0dXJuIHRoZSBzdG9yYWdlIGRlcG9zaXQgcGxhY2VfYmlkIHRvb2sgbm93IHRoYXQgdGhlIGJveCBpcyBnb25lLgogICAgLy8gZnJlZWQgPSBtYnJfYmVmb3JlIC0gYXBwLm1pbl9iYWxhbmNlCiAgICBzd2FwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLQogICAgZHVwCiAgICBidXJ5IDQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgwNwogICAgLy8gaWYgZnJlZWQgPiAwOgogICAgYnogd2l0aGRyYXdfYmlkX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODA4CiAgICAvLyBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PWZyZWVkLCBmZWU9MCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18yIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKd2l0aGRyYXdfYmlkX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojc3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuYWNjZXB0X2JpZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY2VwdF9iaWQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODM2CiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICB1bmNvdmVyIDIKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgzNwogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdW5rbm93biBqb2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgzOAogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNvdmVyIDQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgzOC04MzkKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIC8vIGFzc2VydCBqLmNsaWVudC5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGNsaWVudCBtYXkgYWNjZXB0IGEgYmlkIgogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgaW50Y18zIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODM5CiAgICAvLyBhc3NlcnQgai5jbGllbnQubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBjbGllbnQgbWF5IGFjY2VwdCBhIGJpZCIKICAgIGR1cAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjbGllbnQgbWF5IGFjY2VwdCBhIGJpZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODQwCiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IE9QRU4sICJqb2IgaXMgbm8gbG9uZ2VyIG9wZW4iCiAgICBkaWcgMQogICAgcHVzaGludCA2OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAhCiAgICBhc3NlcnQgLy8gam9iIGlzIG5vIGxvbmdlciBvcGVuCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NDIKICAgIC8vIGtleSA9IHNlbGYuX2JpZF9rZXkoamlkLCBiaWRkZXJfYWdlbnRfaWQubmF0aXZlKQogICAgZGlnIDQKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjcyMAogICAgLy8gcmV0dXJuIG9wLml0b2Ioam9iX2lkKSArIG9wLml0b2IoYmlkZGVyKSAgIyBub3FhOiBSRVQ1MDQKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NDMKICAgIC8vIGFzc2VydCBrZXkgaW4gc2VsZi5iaWRzLCAibm8gc3VjaCBiaWQiCiAgICBieXRlYyAxMSAvLyAweDYyNjQ1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vIHN1Y2ggYmlkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NDQtODQ1CiAgICAvLyBiaWQgPSBzZWxmLmJpZHNba2V5XS5jb3B5KCkKICAgIC8vIGFzc2VydCBiaWQucHJpY2VfbWljcm8gPT0gZXhwZWN0ZWRfcHJpY2VfbWljcm8sICJ0aGUgYmlkIGNoYW5nZWQgc2luY2UgeW91IHJlYWQgaXQiCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODQ1CiAgICAvLyBhc3NlcnQgYmlkLnByaWNlX21pY3JvID09IGV4cGVjdGVkX3ByaWNlX21pY3JvLCAidGhlIGJpZCBjaGFuZ2VkIHNpbmNlIHlvdSByZWFkIGl0IgogICAgZHVwCiAgICB1bmNvdmVyIDUKICAgIGI9PQogICAgYXNzZXJ0IC8vIHRoZSBiaWQgY2hhbmdlZCBzaW5jZSB5b3UgcmVhZCBpdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODQ2CiAgICAvLyBhc3NlcnQgYmlkLnZhbGlkYXRvcl9hZ2VudF9pZCA9PSBqLnZhbGlkYXRvcl9hZ2VudF9pZCwgInRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSB0aGlzIGJpZCB3YXMgcGxhY2VkIgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzQKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDQKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSB0aGlzIGJpZCB3YXMgcGxhY2VkCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NDkKICAgIC8vIGJpZC5mYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQsCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODUzCiAgICAvLyBzZWxmLl9hZ2VudF9hZGRyZXNzKGJpZGRlcl9hZ2VudF9pZCksCiAgICBkaWcgNQogICAgY2FsbHN1YiBfYWdlbnRfYWRkcmVzcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODQ4LTg1NAogICAgLy8gc2VsZi5fY2hlY2tfZmFsbGJhY2soCiAgICAvLyAgICAgYmlkLmZhbGxiYWNrX3ZhbGlkYXRvcl9hZ2VudF9pZCwKICAgIC8vICAgICBqLnZhbGlkYXRvcl9hZ2VudF9pZCwKICAgIC8vICAgICBiaWRkZXJfYWdlbnRfaWQsCiAgICAvLyAgICAgai5jbGllbnQubmF0aXZlLAogICAgLy8gICAgIHNlbGYuX2FnZW50X2FkZHJlc3MoYmlkZGVyX2FnZW50X2lkKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICB1bmNvdmVyIDMKICAgIGRpZyA3CiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiBfY2hlY2tfZmFsbGJhY2sKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg1NQogICAgLy8gai5zZXJ2ZXJfYWdlbnRfaWQgPSBiaWRkZXJfYWdlbnRfaWQKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICByZXBsYWNlMiA0MAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODU2CiAgICAvLyBqLmZhbGxiYWNrX3ZhbGlkYXRvcl9hZ2VudF9pZCA9IGJpZC5mYWxsYmFja192YWxpZGF0b3JfYWdlbnRfaWQKICAgIHN3YXAKICAgIHJlcGxhY2UyIDkyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NTcKICAgIC8vIGouYnVkZ2V0X21pY3JvID0gYmlkLnByaWNlX21pY3JvCiAgICBzd2FwCiAgICByZXBsYWNlMiA1NgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODU4CiAgICAvLyBqLnN0YXR1cyA9IGFyYzQuVUludDY0KEFTU0lHTkVEKQogICAgaW50Y18yIC8vIDEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY4CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODU5CiAgICAvLyBqLnVwZGF0ZWRfYXQgPSBhcmM0LlVJbnQ2NChzZWxmLl9ub3coKSkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDg0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NjAKICAgIC8vIHNlbGYuam9ic1tqaWRdID0gai5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjgxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuZ2V0X2JpZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9iaWQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODY1CiAgICAvLyBrZXkgPSBzZWxmLl9iaWRfa2V5KGpvYl9pZC5uYXRpdmUsIGJpZGRlcl9hZ2VudF9pZC5uYXRpdmUpCiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo3MjAKICAgIC8vIHJldHVybiBvcC5pdG9iKGpvYl9pZCkgKyBvcC5pdG9iKGJpZGRlcikgICMgbm9xYTogUkVUNTA0CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg2NgogICAgLy8gYXNzZXJ0IGtleSBpbiBzZWxmLmJpZHMsICJubyBzdWNoIGJpZCIKICAgIGJ5dGVjIDExIC8vIDB4NjI2NDVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm8gc3VjaCBiaWQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg2NwogICAgLy8gcmV0dXJuIHNlbGYuYmlkc1trZXldCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkucmVsZWFzZV9wYXJ0aWFsW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVsZWFzZV9wYXJ0aWFsOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODgzCiAgICAvLyBqaWQgPSBqb2JfaWQubmF0aXZlCiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4ODQKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4NmE2MjVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdW5rbm93biBqb2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg4NS04ODYKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIC8vIGFzc2VydCBqLmNsaWVudC5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGNsaWVudCBtYXkgcmVsZWFzZSBwYXJ0IG9mIGFuIGVzY3JvdyIKICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGludGNfMyAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg4NgogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSByZWxlYXNlIHBhcnQgb2YgYW4gZXNjcm93IgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjbGllbnQgbWF5IHJlbGVhc2UgcGFydCBvZiBhbiBlc2Nyb3cKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg4NwogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBWQUxJREFURUQsICJlc2Nyb3cgaXMgcmVsZWFzZWQgb24gYSBwYXNzaW5nIHZlcmRpY3QiCiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBlc2Nyb3cgaXMgcmVsZWFzZWQgb24gYSBwYXNzaW5nIHZlcmRpY3QKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg4OQogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmVzY3JvdywgIm5vdGhpbmcgaXMgZXNjcm93ZWQgZm9yIHRoaXMgam9iIgogICAgYnl0ZWMgNyAvLyAweDY1NzM1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90aGluZyBpcyBlc2Nyb3dlZCBmb3IgdGhpcyBqb2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg5MAogICAgLy8gaGVsZCA9IHNlbGYuZXNjcm93W2ppZF0KICAgIGJveF9nZXQKICAgIHBvcAogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODkxCiAgICAvLyBhc3NlcnQgYW1vdW50X21pY3JvLm5hdGl2ZSA+IDAsICJhIHplcm8gcmVsZWFzZSBtb3ZlcyBub3RoaW5nIgogICAgc3dhcAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBhIHplcm8gcmVsZWFzZSBtb3ZlcyBub3RoaW5nCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4OTIKICAgIC8vIGFzc2VydCBhbW91bnRfbWljcm8ubmF0aXZlIDw9IGhlbGQsICJjYW5ub3QgcmVsZWFzZSBtb3JlIHRoYW4gaXMgaGVsZCIKICAgIGR1cAogICAgZGlnIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gY2Fubm90IHJlbGVhc2UgbW9yZSB0aGFuIGlzIGhlbGQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojg5NAogICAgLy8gcmVtYWluaW5nID0gaGVsZCAtIGFtb3VudF9taWNyby5uYXRpdmUKICAgIC0KICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODk1LTg5NwogICAgLy8gIyBXcml0dGVuIEJFRk9SRSB0aGUgdHJhbnNmZXIsIHNhbWUgYXMgX3BheV9lc2Nyb3c6IGEgZmFpbGVkIGlubmVyCiAgICAvLyAjIHRyYW5zYWN0aW9uIG11c3Qgbm90IGxlYXZlIHRoZSBsZWRnZXIgY2xhaW1pbmcgbW9uZXkgYWxyZWFkeSBzZW50LgogICAgLy8gaWYgcmVtYWluaW5nID4gMDoKICAgIGJ6IHJlbGVhc2VfcGFydGlhbF9lbHNlX2JvZHlAMwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6ODk4CiAgICAvLyBzZWxmLmVzY3Jvd1tqaWRdID0gcmVtYWluaW5nCiAgICBkaWcgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CgpyZWxlYXNlX3BhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTAyLTkxMAogICAgLy8gIyBSZXNvbHZlZCBCRUZPUkUgdGhlIHRyYW5zZmVyIGlzIGJlZ3VuLCBhbmQgdGhhdCBvcmRlcmluZyBpcyBsb2FkCiAgICAvLyAjIGJlYXJpbmcuIF9hZ2VudF9hZGRyZXNzIG1ha2VzIGl0cyBvd24gaW5uZXIgY2FsbCwgc28gcmVzb2x2aW5nIGl0CiAgICAvLyAjIGluc2lkZSB0aGUgYXJndW1lbnQgbGlzdCBjb21waWxlcyB0byBhbiBpdHhuX2JlZ2luIG5lc3RlZCBpbiBhbgogICAgLy8gIyBpdHhuX2JlZ2luLCBhbmQgdGhlIEFWTSByZWplY3RzIHRoZSB3aG9sZSBncm91cCBhdCBydW50aW1lIHdpdGgKICAgIC8vICMgIml0eG5fYmVnaW4gd2l0aG91dCBpdHhuX3N1Ym1pdCIuIE5vdGhpbmcgY2F0Y2hlcyBpdCBlYXJsaWVyOiBpdAogICAgLy8gIyBjb21waWxlcywgZGVwbG95cywgYW5kIHBhc3NlcyBldmVyeSBjaGVjayB0aGF0IGRvZXMgbm90IGFjdHVhbGx5IG1vdmUKICAgIC8vICMgbW9uZXkuIHJlbGVhc2VfZXNjcm93IGF2b2lkcyBpdCBieSBhY2NpZGVudCDigJQgdGhlcmUgdGhlIHJlc29sdXRpb24gaXMKICAgIC8vICMgYW4gYXJndW1lbnQgdG8gYSBzdWJyb3V0aW5lLCB3aGljaCBmaW5pc2hlcyBiZWZvcmUgdGhlIGl0eG4gb3BlbnMuCiAgICAvLyBwYXllZSA9IHNlbGYuX2FnZW50X2FkZHJlc3Moai5zZXJ2ZXJfYWdlbnRfaWQpCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgY2FsbHN1YiBfYWdlbnRfYWRkcmVzcwogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTEyLTkxOQogICAgLy8gIyBUaGUgcHJvdG9jb2wgZmVlIGFwcGxpZXMgaGVyZSBleGFjdGx5IGFzIGl0IGRvZXMgaW4gX3BheV9lc2Nyb3cuCiAgICAvLyAjIFdpdGhvdXQgdGhpcywgdGhlIHR3byBwYXRocyB0aGF0IHBheSBhIFZBTElEQVRFRCBqb2IncyBlc2Nyb3cgdG8gdGhlCiAgICAvLyAjIHNhbWUgd29ya2VyIGNoYXJnZWQgZGlmZmVyZW50IGFtb3VudHM6IHJlbGVhc2VfZXNjcm93IHRvb2sgdGhlIGZlZSBhbmQKICAgIC8vICMgcmVsZWFzZV9wYXJ0aWFsIHRvb2sgbm9uZSwgc28gdGhlIHdob2xlIGVzY3JvdyBjb3VsZCBiZSBkcmFpbmVkCiAgICAvLyAjIGZlZS1mcmVlIGJ5IGFza2luZyBmb3IgaXQgaW4gcGFydHMuIFNhbWUgcmF0ZSwgc2FtZSB0cmVhc3VyeSwgc2FtZQogICAgLy8gIyByb3VuZGluZyDigJQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGljaCBzbGljZSBvZiB0aGUgZXNjcm93IGl0IGlzCiAgICAvLyAjIHRha2VuIGZyb20uCiAgICAvLyBmZWUgPSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjkyMAogICAgLy8gaWYgc2VsZi5mZWVfYnBzID4gMDoKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJmZWVfYnBzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9icHMgZXhpc3RzCiAgICBieiByZWxlYXNlX3BhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MjEKICAgIC8vIGZlZSA9IGFtb3VudF9taWNyby5uYXRpdmUgKiBzZWxmLmZlZV9icHMgLy8gMTBfMDAwCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiZmVlX2JwcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVfYnBzIGV4aXN0cwogICAgZGlnIDEKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MjIKICAgIC8vIGlmIGZlZSA+IDA6CiAgICBieiByZWxlYXNlX3BhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MjMtOTI4CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1zZWxmLnRyZWFzdXJ5LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1mZWUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MjQKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5lc2Nyb3dfYXNzZXQsCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiZXNjcm93X2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hc3NldCBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjkyNQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9c2VsZi50cmVhc3VyeSwKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJ0cmVhc3VyeSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmVhc3VyeSBleGlzdHMKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MjMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTI3CiAgICAvLyBmZWU9MCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTIzLTkyOAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5lc2Nyb3dfYXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi50cmVhc3VyeSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9ZmVlLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnJlbGVhc2VfcGFydGlhbF9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MzAtOTM1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1wYXllZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50X21pY3JvLm5hdGl2ZSAtIGZlZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjkzMQogICAgLy8geGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJlc2Nyb3dfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Fzc2V0IGV4aXN0cwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTMzCiAgICAvLyBhc3NldF9hbW91bnQ9YW1vdW50X21pY3JvLm5hdGl2ZSAtIGZlZSwKICAgIHN3YXAKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC0KICAgIGR1cAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciA0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjkzMAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MzQKICAgIC8vIGZlZT0wLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MzAtOTM1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1wYXllZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50X21pY3JvLm5hdGl2ZSAtIGZlZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NDAKICAgIC8vIGFyYzQuVUludDY0KGFtb3VudF9taWNyby5uYXRpdmUgLSBmZWUpLAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTQxCiAgICAvLyBhcmM0LlVJbnQ2NChmZWUpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTQyCiAgICAvLyBhcmM0LkFkZHJlc3Moc2VsZi50cmVhc3VyeSksCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNiAvLyAidHJlYXN1cnkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJlYXN1cnkgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MzctOTQzCiAgICAvLyBFc2Nyb3dQYWlkKAogICAgLy8gICAgIGFyYzQuVUludDY0KGppZCksCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKHBheWVlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChhbW91bnRfbWljcm8ubmF0aXZlIC0gZmVlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChmZWUpLAogICAgLy8gICAgIGFyYzQuQWRkcmVzcyhzZWxmLnRyZWFzdXJ5KSwKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5MzYtOTQ0CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgRXNjcm93UGFpZCgKICAgIC8vICAgICAgICAgYXJjNC5VSW50NjQoamlkKSwKICAgIC8vICAgICAgICAgYXJjNC5BZGRyZXNzKHBheWVlKSwKICAgIC8vICAgICAgICAgYXJjNC5VSW50NjQoYW1vdW50X21pY3JvLm5hdGl2ZSAtIGZlZSksCiAgICAvLyAgICAgICAgIGFyYzQuVUludDY0KGZlZSksCiAgICAvLyAgICAgICAgIGFyYzQuQWRkcmVzcyhzZWxmLnRyZWFzdXJ5KSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlYyAxNCAvLyBtZXRob2QgIkVzY3Jvd1BhaWQodWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NDUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChyZW1haW5pbmcpCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo4NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKcmVsZWFzZV9wYXJ0aWFsX2Vsc2VfYm9keUAzOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTAwCiAgICAvLyBkZWwgc2VsZi5lc2Nyb3dbamlkXQogICAgc3dhcAogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJlbGVhc2VfcGFydGlhbF9hZnRlcl9pZl9lbHNlQDQKCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5leHBpcmVfam9iW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhwaXJlX2pvYjoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NjEKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojk2MgogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTYzCiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTYzLTk2NAogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBBU1NJR05FRCwgIm9ubHkgYW4gYXNzaWduZWQgam9iIHdpdGggbm8gcmVzdWx0IGNhbiBleHBpcmUiCiAgICBkdXAKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTY0CiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IEFTU0lHTkVELCAib25seSBhbiBhc3NpZ25lZCBqb2Igd2l0aCBubyByZXN1bHQgY2FuIGV4cGlyZSIKICAgIGJ0b2kKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgYW4gYXNzaWduZWQgam9iIHdpdGggbm8gcmVzdWx0IGNhbiBleHBpcmUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojk2NgogICAgLy8gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBqLnVwZGF0ZWRfYXQubmF0aXZlICsgc2VsZi5kaXNwdXRlX3dpbmRvdwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIHB1c2hpbnQgODQKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImRpc3B1dGVfd2luZG93IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRpc3B1dGVfd2luZG93IGV4aXN0cwogICAgKwogICAgPgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTY1LTk2NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGoudXBkYXRlZF9hdC5uYXRpdmUgKyBzZWxmLmRpc3B1dGVfd2luZG93CiAgICAvLyApLCAidGhlIGFzc2lnbmVlIHN0aWxsIGhhcyB0aW1lIgogICAgYXNzZXJ0IC8vIHRoZSBhc3NpZ25lZSBzdGlsbCBoYXMgdGltZQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTY5CiAgICAvLyBqLnN0YXR1cyA9IGFyYzQuVUludDY0KENBTkNFTExFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICByZXBsYWNlMiA2OAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjIwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5Ojk3MAogICAgLy8gai51cGRhdGVkX2F0ID0gYXJjNC5VSW50NjQoc2VsZi5fbm93KCkpCiAgICBpdG9iCiAgICByZXBsYWNlMiA4NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6OTcxCiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IGouY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LmV4cGlyZV92ZXJkaWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZXhwaXJlX3ZlcmRpY3Q6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAwNQogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAwNgogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweDZhNjI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAwNwogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMDctMTAwOAogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBTVUJNSVRURUQsICJvbmx5IGEgc3VibWl0dGVkIGpvYiBhd2FpdGluZyBhIHZlcmRpY3QgY2FuIGV4cGlyZSIKICAgIGR1cAogICAgcHVzaGludCA2OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDA4CiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IFNVQk1JVFRFRCwgIm9ubHkgYSBzdWJtaXR0ZWQgam9iIGF3YWl0aW5nIGEgdmVyZGljdCBjYW4gZXhwaXJlIgogICAgYnRvaQogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgYSBzdWJtaXR0ZWQgam9iIGF3YWl0aW5nIGEgdmVyZGljdCBjYW4gZXhwaXJlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDEwCiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGoudXBkYXRlZF9hdC5uYXRpdmUgKyBzZWxmLmRpc3B1dGVfd2luZG93ICogMgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIHB1c2hpbnQgODQKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImRpc3B1dGVfd2luZG93IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRpc3B1dGVfd2luZG93IGV4aXN0cwogICAgcHVzaGludCAyCiAgICAqCiAgICArCiAgICA+CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDA5LTEwMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBqLnVwZGF0ZWRfYXQubmF0aXZlICsgc2VsZi5kaXNwdXRlX3dpbmRvdyAqIDIKICAgIC8vICksICJ0aGUgdmFsaWRhdG9yLCB0aGVuIHRoZSBmYWxsYmFjaywgc3RpbGwgaGF2ZSB0aW1lIgogICAgYXNzZXJ0IC8vIHRoZSB2YWxpZGF0b3IsIHRoZW4gdGhlIGZhbGxiYWNrLCBzdGlsbCBoYXZlIHRpbWUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMTMKICAgIC8vIGouc3RhdHVzID0gYXJjNC5VSW50NjQoU1BMSVQpCiAgICBwdXNoaW50IDYKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgNjgKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDE0CiAgICAvLyBqLnVwZGF0ZWRfYXQgPSBhcmM0LlVJbnQ2NChzZWxmLl9ub3coKSkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDg0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDE1CiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IGouY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDE3CiAgICAvLyBpZiBqaWQgaW4gc2VsZi5lc2Nyb3c6CiAgICBieXRlYyA3IC8vIDB4NjU3MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBleHBpcmVfdmVyZGljdF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMTgKICAgIC8vIGFtb3VudCA9IHNlbGYuZXNjcm93W2ppZF0KICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93IGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAxOQogICAgLy8gd29ya2VyX2hhbGYgPSBhbW91bnQgLy8gMgogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDIwCiAgICAvLyBjbGllbnRfaGFsZiA9IGFtb3VudCAtIHdvcmtlcl9oYWxmICAjIHRoZSBvZGQgYmFzZSB1bml0IGdvZXMgdG8gdGhlIGNsaWVudAogICAgZGlnIDEKICAgIC0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMjEKICAgIC8vIHNlbGYuc3BsaXRfcmVmdW5kW2ppZF0gPSBjbGllbnRfaGFsZgogICAgYnl0ZWMgMTUgLy8gMHg3MjY2NWYKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMjIKICAgIC8vIGlmIHdvcmtlcl9oYWxmID4gMDoKICAgIGJ6IGV4cGlyZV92ZXJkaWN0X2Vsc2VfYm9keUA0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDIzCiAgICAvLyBzZWxmLmVzY3Jvd1tqaWRdID0gd29ya2VyX2hhbGYKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CgpleHBpcmVfdmVyZGljdF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo5NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1ODAKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKZXhwaXJlX3ZlcmRpY3RfZWxzZV9ib2R5QDQ6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMjUKICAgIC8vIGRlbCBzZWxmLmVzY3Jvd1tqaWRdCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiBleHBpcmVfdmVyZGljdF9hZnRlcl9pZl9lbHNlQDYKCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5zZXR0bGVfc3BsaXRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXR0bGVfc3BsaXQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMzIKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMzMKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAzNC0xMDM1CiAgICAvLyBqID0gc2VsZi5qb2JzW2ppZF0uY29weSgpCiAgICAvLyBhc3NlcnQgai5zdGF0dXMubmF0aXZlID09IFNQTElULCAib25seSBhIHNwbGl0IGpvYiBzZXR0bGVzIHRoaXMgd2F5IgogICAgZHVwCiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwMzUKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gU1BMSVQsICJvbmx5IGEgc3BsaXQgam9iIHNldHRsZXMgdGhpcyB3YXkiCiAgICBidG9pCiAgICBwdXNoaW50IDYKICAgID09CiAgICBhc3NlcnQgLy8gb25seSBhIHNwbGl0IGpvYiBzZXR0bGVzIHRoaXMgd2F5CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDM2CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi5fcGF5X2VzY3JvdyhqaWQsIHNlbGYuX2FnZW50X2FkZHJlc3Moai5zZXJ2ZXJfYWdlbnRfaWQpLCBUcnVlKSkgICMgbm9xYTogRkJUMDAzCiAgICBwdXNoaW50IDQwCiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgX2FnZW50X2FkZHJlc3MKICAgIGludGNfMiAvLyAxCiAgICBjYWxsc3ViIF9wYXlfZXNjcm93CiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5jbGFpbV9zcGxpdF9yZWZ1bmRbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9zcGxpdF9yZWZ1bmQ6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNDQKICAgIC8vIGppZCA9IGpvYl9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNDUKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5qb2JzLCAidW5rbm93biBqb2IiCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4NmE2MjVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDQ2LTEwNDcKICAgIC8vIGogPSBzZWxmLmpvYnNbamlkXS5jb3B5KCkKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gU1BMSVQsICJvbmx5IGEgc3BsaXQgam9iIHJlZnVuZHMgdGhpcyB3YXkiCiAgICBkdXAKICAgIHB1c2hpbnQgNjgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA0NwogICAgLy8gYXNzZXJ0IGouc3RhdHVzLm5hdGl2ZSA9PSBTUExJVCwgIm9ubHkgYSBzcGxpdCBqb2IgcmVmdW5kcyB0aGlzIHdheSIKICAgIGJ0b2kKICAgIHB1c2hpbnQgNgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGEgc3BsaXQgam9iIHJlZnVuZHMgdGhpcyB3YXkKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNDgKICAgIC8vIGFzc2VydCBqaWQgaW4gc2VsZi5zcGxpdF9yZWZ1bmQsICJub3RoaW5nIHRvIHJlZnVuZCIKICAgIGJ5dGVjIDE1IC8vIDB4NzI2NjVmCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3RoaW5nIHRvIHJlZnVuZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA0OQogICAgLy8gYW1vdW50ID0gc2VsZi5zcGxpdF9yZWZ1bmRbamlkXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNTAKICAgIC8vIGRlbCBzZWxmLnNwbGl0X3JlZnVuZFtqaWRdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNTEtMTA1NgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5lc2Nyb3dfYXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9ai5jbGllbnQubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDUyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImVzY3Jvd19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYXNzZXQgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDUzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1qLmNsaWVudC5uYXRpdmUsCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyA4CiAgICBpbnRjXzMgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA1MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDU1CiAgICAvLyBmZWU9MCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA1MS0xMDU2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1qLmNsaWVudC5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDU3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYW1vdW50KQogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTAzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuc2V0X2ZlZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9mZWU6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA2OAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IHNldCB0aGUgZmVlIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGNyZWF0b3IgbWF5IHNldCB0aGUgZmVlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDY5CiAgICAvLyBhc3NlcnQgc2VsZi5mZWVfYnBzID09IDAsICJ0aGUgZmVlIGlzIHNldCBvbmNlIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZlZV9icHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2JwcyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyB0aGUgZmVlIGlzIHNldCBvbmNlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDcwCiAgICAvLyBhc3NlcnQgZmVlX2Jwcy5uYXRpdmUgPiAwLCAidXNlIHplcm8gYnkgbGVhdmluZyBpdCB1bnNldCIKICAgIHN3YXAKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIHVzZSB6ZXJvIGJ5IGxlYXZpbmcgaXQgdW5zZXQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNzEKICAgIC8vIGFzc2VydCBmZWVfYnBzLm5hdGl2ZSA8PSAyNTAsICJ0aGUgZmVlIGlzIGNhcHBlZCBhdCAyLjUlIgogICAgZHVwCiAgICBwdXNoaW50IDI1MAogICAgPD0KICAgIGFzc2VydCAvLyB0aGUgZmVlIGlzIGNhcHBlZCBhdCAyLjUlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDcyCiAgICAvLyBhc3NlcnQgdHJlYXN1cnkubmF0aXZlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJhIGZlZSBuZWVkcyBhIGRlc3RpbmF0aW9uIgogICAgZGlnIDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhIGZlZSBuZWVkcyBhIGRlc3RpbmF0aW9uCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDgxCiAgICAvLyBBc3NldChzZWxmLmVzY3Jvd19hc3NldCkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJlc2Nyb3dfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Fzc2V0IGV4aXN0cwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA3My0xMDgyCiAgICAvLyAjIFRoZSB0cmVhc3VyeSBtdXN0IGFscmVhZHkgaG9sZCB0aGUgZXNjcm93IGFzc2V0LiBBbiBBbGdvcmFuZCBhY2NvdW50CiAgICAvLyAjIGNhbm5vdCByZWNlaXZlIGFuIEFTQSBpdCBoYXMgbm90IG9wdGVkIGludG8sIGFuZCB0aGUgZmVlIHRyYW5zZmVyIGluCiAgICAvLyAjIF9wYXlfZXNjcm93IGlzIGFuIGlubmVyIHRyYW5zYWN0aW9uIG9mIHRoZSBwYXlvdXQ6IGlmIGl0IGZhaWxzLCB0aGUKICAgIC8vICMgd2hvbGUgcGF5b3V0IGZhaWxzLiBCZWNhdXNlIHNldF9mZWUgaXMgb25lLXNob3QsIGEgdHJlYXN1cnkgdGhhdCBuZXZlcgogICAgLy8gIyBvcHRlZCBpbiB3b3VsZCBtYWtlIHJlbGVhc2VfZXNjcm93LCByZWZ1bmRfZXNjcm93IGFuZCByZWxlYXNlX3BhcnRpYWwKICAgIC8vICMgcGVybWFuZW50bHkgdW5jYWxsYWJsZSBhbmQgZnJlZXplIGV2ZXJ5IGVzY3Jvd2VkIGNlbnQgd2l0aCBubyB3YXkgdG8KICAgIC8vICMgY29ycmVjdCB0aGUgYWRkcmVzcy4gQ2hlY2tlZCBoZXJlLCB3aGVyZSBpdCBpcyBzdGlsbCByZWNvdmVyYWJsZS4KICAgIC8vIGFzc2VydCB0cmVhc3VyeS5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5lc2Nyb3dfYXNzZXQpCiAgICAvLyApLCAidGhlIHRyZWFzdXJ5IG11c3Qgb3B0IGludG8gdGhlIGVzY3JvdyBhc3NldCBiZWZvcmUgaXQgY2FuIHJlY2VpdmUgYSBmZWUiCiAgICBkaWcgMgogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0aGUgdHJlYXN1cnkgbXVzdCBvcHQgaW50byB0aGUgZXNjcm93IGFzc2V0IGJlZm9yZSBpdCBjYW4gcmVjZWl2ZSBhIGZlZQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA4MwogICAgLy8gc2VsZi5mZWVfYnBzID0gZmVlX2Jwcy5uYXRpdmUKICAgIGJ5dGVjIDUgLy8gImZlZV9icHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA4NAogICAgLy8gc2VsZi50cmVhc3VyeSA9IHRyZWFzdXJ5Lm5hdGl2ZQogICAgYnl0ZWMgNiAvLyAidHJlYXN1cnkiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTA1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuc2V0X2FyYml0ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJiaXRlcjoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjEwODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEwMgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IHNldCB0aGUgYXJiaXRlciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBzZXQgdGhlIGFyYml0ZXIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMDMKICAgIC8vIGlmIGFyYml0ZXJfYWdlbnRfaWQubmF0aXZlID4gMDoKICAgIGJ0b2kKICAgIGR1cAogICAgYnogc2V0X2FyYml0ZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTA0LTExMDUKICAgIC8vICMgUmVzb2x2ZSBpdCBub3cgc28gYSB0eXBvIGNhbm5vdCBpbnN0YWxsIGFuIHVuanVkZ2VhYmxlIGFyYml0ZXIuCiAgICAvLyBzZWxmLl9hZ2VudF9hZGRyZXNzKGFyYml0ZXJfYWdlbnRfaWQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfYWdlbnRfYWRkcmVzcwogICAgcG9wCgpzZXRfYXJiaXRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTA2CiAgICAvLyBzZWxmLmFyYml0ZXJfYWdlbnRfaWQgPSBhcmJpdGVyX2FnZW50X2lkLm5hdGl2ZQogICAgYnl0ZWMgOSAvLyAiYXJiaXRlcl9hZ2VudF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMDg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5nZXRfYXJiaXRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmJpdGVyOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTExMgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYuYXJiaXRlcl9hZ2VudF9pZCkKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmJpdGVyX2FnZW50X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0ZXJfYWdlbnRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5jYW5jZWxfam9iW3JvdXRpbmddKCkgLT4gdm9pZDoKY2FuY2VsX2pvYjoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTExNwogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTExOAogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTExOQogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMTktMTEyMAogICAgLy8gaiA9IHNlbGYuam9ic1tqaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGouY2xpZW50Lm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY2xpZW50IG1heSBjYW5jZWwiCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBpbnRjXzMgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTIwCiAgICAvLyBhc3NlcnQgai5jbGllbnQubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBjbGllbnQgbWF5IGNhbmNlbCIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY2xpZW50IG1heSBjYW5jZWwKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMjEKICAgIC8vIGFzc2VydCBqLnN0YXR1cy5uYXRpdmUgPT0gT1BFTiwgImFuIGFzc2lnbmVkIGpvYiBjYW5ub3QgYmUgY2FuY2VsbGVkIgogICAgZHVwCiAgICBwdXNoaW50IDY4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydCAvLyBhbiBhc3NpZ25lZCBqb2IgY2Fubm90IGJlIGNhbmNlbGxlZAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEyMgogICAgLy8gai5zdGF0dXMgPSBhcmM0LlVJbnQ2NChDQU5DRUxMRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgNjgKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTIzCiAgICAvLyBqLnVwZGF0ZWRfYXQgPSBhcmM0LlVJbnQ2NChzZWxmLl9ub3coKSkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDg0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTI0CiAgICAvLyBzZWxmLmpvYnNbamlkXSA9IGouY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToxMTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5nZXRfam9iW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2pvYjoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEyOQogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEzMAogICAgLy8gYXNzZXJ0IGppZCBpbiBzZWxmLmpvYnMsICJ1bmtub3duIGpvYiIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2YTYyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEzMQogICAgLy8gcmV0dXJuIHNlbGYuam9ic1tqaWRdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjExMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5LnRvdGFsX2pvYnNbcm91dGluZ10oKSAtPiB2b2lkOgp0b3RhbF9qb2JzOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEzNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYuam9iX2NvdW50KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJqb2JfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuam9iX2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MTEzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gdmFsaWRhdGlvbl9yZWdpc3RyeS5WYWxpZGF0aW9uUmVnaXN0cnkuX2Fzc2VydF9jb3ZlcnNfYm94X2dyb3d0aChtYnI6IHVpbnQ2NCwgYmVmb3JlOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfY292ZXJzX2JveF9ncm93dGg6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMjItMjIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9hc3NlcnRfY292ZXJzX2JveF9ncm93dGgoc2VsZiwgbWJyOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwgYmVmb3JlOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIzMQogICAgLy8gYXBwID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIzMgogICAgLy8gYXNzZXJ0IG1ici5yZWNlaXZlciA9PSBhcHAsICJzdG9yYWdlIHBheW1lbnQgbXVzdCBiZSBzZW50IHRvIHRoaXMgYXBwIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBSZWNlaXZlcgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gc3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGlzIGFwcAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6MjMzCiAgICAvLyBhc3NlcnQgbWJyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAieW91IG11c3QgcGF5IGZvciB0aGUgc3RvcmFnZSB5b3UgY3JlYXRlIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8geW91IG11c3QgcGF5IGZvciB0aGUgc3RvcmFnZSB5b3UgY3JlYXRlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weToyMzUKICAgIC8vIG1ici5hbW91bnQgPj0gYXBwLm1pbl9iYWxhbmNlIC0gYmVmb3JlCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgPj0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyLmFtb3VudCA+PSBhcHAubWluX2JhbGFuY2UgLSBiZWZvcmUKICAgIC8vICksICJwYXltZW50IG11c3QgY292ZXIgdGhlIGJveCBzdG9yYWdlIHRoaXMgY2FsbCBhZGRzIgogICAgYXNzZXJ0IC8vIHBheW1lbnQgbXVzdCBjb3ZlciB0aGUgYm94IHN0b3JhZ2UgdGhpcyBjYWxsIGFkZHMKICAgIHJldHN1YgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5Ll9jaGVja19mYWxsYmFjayhmYWxsYmFjazogYnl0ZXMsIHByaW1hcnk6IGJ5dGVzLCBzZXJ2ZXI6IGJ5dGVzLCBjbGllbnQ6IGJ5dGVzLCBzZXJ2ZXJfYWRkcjogYnl0ZXMpIC0+IHZvaWQ6Cl9jaGVja19mYWxsYmFjazoKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ0OC00NTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2ZhbGxiYWNrKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZmFsbGJhY2s6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW1hcnk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNlcnZlcjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgY2xpZW50OiBBY2NvdW50LAogICAgLy8gICAgIHNlcnZlcl9hZGRyOiBBY2NvdW50LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNSAwCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0NjcKICAgIC8vIGlmIGZhbGxiYWNrLm5hdGl2ZSA+IDA6CiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGJ6IF9jaGVja19mYWxsYmFja19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ2OAogICAgLy8gYXNzZXJ0IGZhbGxiYWNrICE9IHByaW1hcnksICJ0aGUgZmFsbGJhY2sgbXVzdCBkaWZmZXIgZnJvbSB0aGUgdmFsaWRhdG9yIgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIGIhPQogICAgYXNzZXJ0IC8vIHRoZSBmYWxsYmFjayBtdXN0IGRpZmZlciBmcm9tIHRoZSB2YWxpZGF0b3IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ2OQogICAgLy8gYXNzZXJ0IGZhbGxiYWNrICE9IHNlcnZlciwgInRoZSB3b3JrZXIgY2Fubm90IGJlIHRoZWlyIG93biBmYWxsYmFjayBqdWRnZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC0zCiAgICBiIT0KICAgIGFzc2VydCAvLyB0aGUgd29ya2VyIGNhbm5vdCBiZSB0aGVpciBvd24gZmFsbGJhY2sganVkZ2UKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ3MAogICAgLy8gZmJfYWRkciA9IHNlbGYuX2FnZW50X2FkZHJlc3MoZmFsbGJhY2spCiAgICBmcmFtZV9kaWcgLTUKICAgIGNhbGxzdWIgX2FnZW50X2FkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ3MQogICAgLy8gYXNzZXJ0IGZiX2FkZHIgIT0gY2xpZW50LCAidGhlIGNsaWVudCBjYW5ub3QgYmUgdGhlIGZhbGxiYWNrIGp1ZGdlIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBhc3NlcnQgLy8gdGhlIGNsaWVudCBjYW5ub3QgYmUgdGhlIGZhbGxiYWNrIGp1ZGdlCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0NzIKICAgIC8vIGFzc2VydCBmYl9hZGRyICE9IHNlcnZlcl9hZGRyLCAidGhlIHdvcmtlciBjYW5ub3QgYmUgdGhlIGZhbGxiYWNrIGp1ZGdlIgogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgYXNzZXJ0IC8vIHRoZSB3b3JrZXIgY2Fubm90IGJlIHRoZSBmYWxsYmFjayBqdWRnZQoKX2NoZWNrX2ZhbGxiYWNrX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHZhbGlkYXRpb25fcmVnaXN0cnkuVmFsaWRhdGlvblJlZ2lzdHJ5Ll9hZ2VudF9hZGRyZXNzKGFnZW50X2lkOiBieXRlcykgLT4gYnl0ZXM6Cl9hZ2VudF9hZGRyZXNzOgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NDc0LTQ3NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfYWdlbnRfYWRkcmVzcyhzZWxmLCBhZ2VudF9pZDogYXJjNC5VSW50NjQpIC0+IEFjY291bnQ6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ4Mi00ODYKICAgIC8vIGFkZHIsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuQWRkcmVzc10oCiAgICAvLyAgICAgImFnZW50X2FkZHJlc3ModWludDY0KWFkZHJlc3MiLAogICAgLy8gICAgIGFnZW50X2lkLAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ4NQogICAgLy8gYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImlkZW50aXR5X2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pZGVudGl0eV9hcHAgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ4Mi00ODYKICAgIC8vIGFkZHIsIF90eG4gPSBhcmM0LmFiaV9jYWxsW2FyYzQuQWRkcmVzc10oCiAgICAvLyAgICAgImFnZW50X2FkZHJlc3ModWludDY0KWFkZHJlc3MiLAogICAgLy8gICAgIGFnZW50X2lkLAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIC8vICkKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIGV4dHJhY3QgNCAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjQ4NwogICAgLy8gcmV0dXJuIGFkZHIubmF0aXZlCiAgICByZXRzdWIKCgovLyB2YWxpZGF0aW9uX3JlZ2lzdHJ5LlZhbGlkYXRpb25SZWdpc3RyeS5fcGF5X2VzY3Jvdyhqb2JfaWQ6IHVpbnQ2NCwgdG86IGJ5dGVzLCBjaGFyZ2VfZmVlOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3BheV9lc2Nyb3c6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo0ODktNDkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9wYXlfZXNjcm93KHNlbGYsIGpvYl9pZDogVUludDY0LCB0bzogQWNjb3VudCwgY2hhcmdlX2ZlZTogYm9vbCkgLT4gVUludDY0OiAgIyBub3FhOiBGQlQwMDEKICAgIHByb3RvIDMgMQogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTA0CiAgICAvLyBhc3NlcnQgam9iX2lkIGluIHNlbGYuZXNjcm93LCAibm90aGluZyBpcyBlc2Nyb3dlZCBmb3IgdGhpcyBqb2IiCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWMgNyAvLyAweDY1NzM1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdGhpbmcgaXMgZXNjcm93ZWQgZm9yIHRoaXMgam9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MDUKICAgIC8vIGFtb3VudCA9IHNlbGYuZXNjcm93W2pvYl9pZF0KICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUwNgogICAgLy8gYXNzZXJ0IGFtb3VudCA+IDAsICJub3RoaW5nIGlzIGVzY3Jvd2VkIGZvciB0aGlzIGpvYiIKICAgIGFzc2VydCAvLyBub3RoaW5nIGlzIGVzY3Jvd2VkIGZvciB0aGlzIGpvYgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTA3CiAgICAvLyBkZWwgc2VsZi5lc2Nyb3dbam9iX2lkXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MDktNTEzCiAgICAvLyAjIFRoZSBwcm90b2NvbCBmZWUsIGlmIG9uZSB3YXMgc2V0LiBUYWtlbiBoZXJlIHJhdGhlciB0aGFuIGF0IGZ1bmRpbmcKICAgIC8vICMgc28gdGhlIGNsaWVudCBlc2Nyb3dzIGV4YWN0bHkgd2hhdCB0aGV5IGFncmVlZCB0byBwYXkgYW5kIHRoZSBmZWUKICAgIC8vICMgY29tZXMgb3V0IG9mIHRoZSBzZXR0bGVtZW50IOKAlCBhIGZlZSBkZWR1Y3RlZCBvbiB0aGUgd2F5IElOIHdvdWxkIG1lYW4KICAgIC8vICMgdGhlIGFzc2lnbmVlIHNlZXMgYSBzbWFsbGVyIGVzY3JvdyB0aGFuIHRoZSBidWRnZXQgdGhleSBhY2NlcHRlZC4KICAgIC8vIGZlZSA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUxNAogICAgLy8gaWYgY2hhcmdlX2ZlZSBhbmQgc2VsZi5mZWVfYnBzID4gMDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogX3BheV9lc2Nyb3dfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiZmVlX2JwcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVfYnBzIGV4aXN0cwogICAgYnogX3BheV9lc2Nyb3dfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MTUKICAgIC8vIGZlZSA9IGFtb3VudCAqIHNlbGYuZmVlX2JwcyAvLyAxMF8wMDAKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJmZWVfYnBzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9icHMgZXhpc3RzCiAgICBkaWcgMQogICAgKgogICAgcHVzaGludCAxMDAwMAogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUxNgogICAgLy8gaWYgZmVlID4gMDoKICAgIGJ6IF9wYXlfZXNjcm93X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTE3LTUyMgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5lc2Nyb3dfYXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi50cmVhc3VyeSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9ZmVlLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTE4CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImVzY3Jvd19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYXNzZXQgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MTkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYudHJlYXN1cnksCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNiAvLyAidHJlYXN1cnkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJlYXN1cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTE3CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUyMQogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUxNy01MjIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYudHJlYXN1cnksCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWZlZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpfcGF5X2VzY3Jvd19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MjQtNTI5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmVzY3Jvd19hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj10bywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50IC0gZmVlLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTI1CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImVzY3Jvd19hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYXNzZXQgZXhpc3RzCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MjcKICAgIC8vIGFzc2V0X2Ftb3VudD1hbW91bnQgLSBmZWUsCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAtCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTI0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUyOAogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUyNC01MjkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuZXNjcm93X2Fzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXRvLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQgLSBmZWUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTM0CiAgICAvLyBhcmM0LlVJbnQ2NChhbW91bnQgLSBmZWUpLAogICAgZHVwCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MzUKICAgIC8vIGFyYzQuVUludDY0KGZlZSksCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUzNgogICAgLy8gYXJjNC5BZGRyZXNzKHNlbGYudHJlYXN1cnkpLAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRyZWFzdXJ5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5IGV4aXN0cwogICAgLy8gY29udHJhY3RzL3ZhbGlkYXRpb25fcmVnaXN0cnkucHk6NTMxLTUzNwogICAgLy8gRXNjcm93UGFpZCgKICAgIC8vICAgICBhcmM0LlVJbnQ2NChqb2JfaWQpLAogICAgLy8gICAgIGFyYzQuQWRkcmVzcyh0byksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoYW1vdW50IC0gZmVlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChmZWUpLAogICAgLy8gICAgIGFyYzQuQWRkcmVzcyhzZWxmLnRyZWFzdXJ5KSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvdmFsaWRhdGlvbl9yZWdpc3RyeS5weTo1MzAtNTM4CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgRXNjcm93UGFpZCgKICAgIC8vICAgICAgICAgYXJjNC5VSW50NjQoam9iX2lkKSwKICAgIC8vICAgICAgICAgYXJjNC5BZGRyZXNzKHRvKSwKICAgIC8vICAgICAgICAgYXJjNC5VSW50NjQoYW1vdW50IC0gZmVlKSwKICAgIC8vICAgICAgICAgYXJjNC5VSW50NjQoZmVlKSwKICAgIC8vICAgICAgICAgYXJjNC5BZGRyZXNzKHNlbGYudHJlYXN1cnkpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiRXNjcm93UGFpZCh1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy92YWxpZGF0aW9uX3JlZ2lzdHJ5LnB5OjUzOQogICAgLy8gcmV0dXJuIGFtb3VudCAtIGZlZQogICAgc3dhcAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAECAABICYQA2piXwQVH3x1BRUffHWADGVzY3Jvd19hc3NldA5kaXNwdXRlX3dpbmRvdwdmZWVfYnBzCHRyZWFzdXJ5A2VzXwxpZGVudGl0eV9hcHAQYXJiaXRlcl9hZ2VudF9pZAlqb2JfY291bnQDYmRfDnJlcHV0YXRpb25fYXBwBMe5cGMEmRlWyQNyZl8xGEAAICcKI2cnCCNnKyNnJwQjZycMI2cnBSNnJwYyA2cnCSNnMRtBANMxGRREMRhEghwEYX93wgSE9vekBIA8Y7MEINfM7QSm3Em1BOCI1WgEiTwobwTTe2EnBEPTiwoEkoC6awSd6mzkBBDG1JgEvlyQsAQeqTGpBJ5LqUgED/yckAQOJwzpBFZwbCsEIrN8UARLZi06BKc+N/UERSq/KgRfPfNRBB9WeAUEpK7l0QQ2qIGoBJNnbCoEx1x7NzYaAI4cABwAcwCVASwBnQI6AwoDlwRFBNwFGgVfBYQFxgaCBv8HnQfHCK0I8wlvCZ4J7QoyClQKYAqcCrYAI4EFMRmOAgAMAAEAMRhEMQAyCRJEJEMxGBRDNhoBSRUiEkQ2GgJJFSISRDYaA0kVIhJENhoESRUiEkQxADIJEkQjJwhlRBRETwMXSURPAxdJRE8DF0lETwMXSUQnCE8EZycMTwNnK08CZycETGcqsCRDMQAyCRJEIytlRElEsTIKI7ISshSyEYEEshAjsgGzKrAkQzEWJAlJOBAkEkQ2GgFJI1mBAghLARVJTwISRDYaAkkVIhJENhoDSRUiEkRLA1cCABUlEkRLARdEMgpzAUQjJwplRCQIJwpLAWcyB0wWMQAjFk8DFksDTwNQSwJQTwVQTwVQgAIAZFCBZE8GCBZXBgJQSwJQSwFQTFBMUE8DUIACAABQKEsCUEm8SEy/TgKICZwpTFCwJEM2GgFJFSISRDYaAkkVIhJENhoDSRUiEkRPAhcWKExQSb1FAURJvkhMSSIlukkxABJESwGBRCK6FxRESwQXREsBgTAiuksFiAmUSwVPAksHTwRPBIgJY0xPA1woTwJcXCQWXEQyBxZcVEsBvEi/KrAkQzEWJAlJOBAkEkQ2GgFJFSISRDYaAkkjWYECCEsBFRJETBcWKExQSb1FAURLAVcCABUlEkRJvkhMSYFEIroXJBJEsUmBKCK6IycIZUSyGCcNshqyGoEGshAjsgGztD5JVwAEKRJEVwQASRUlEkQxABJEMgpzAURLAoFCWU8DI08CWE8DUIECFlxEMgcWXFRLArxITwJMv4gIjCqwJEOAAEcCNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFSISRBcWKExQRwK9RQFESb5ITEmBRCK6F4ECEkSBMCK6F0lBAH4yB0sDSU4CgVQiuhcjJwRlRAgNTgSBXCK6F0UJIycJZURBAAgjJwllTEUKREsEF0lFCBJPA0EAQksHQQA9SwVLCBJBADUkEUQxAE8DiAg+EkSBA0UFTwIjU0AABIEERQRLAxZMSwFcRDIHFlxUTwJJvEhMvylMULAkQyNC/8hITwJISwEiJboxABJEQv/DMRYkCUk4ECQSRDYaAUlOAkkVIhJEFxYoTFBHAr1FAUSBRCK6F0lOBIEDEklAAAhLBIEEEkEAUiREIycMZURJcghETwRJTgI4BxJESTgAMQASRDgIgYihAg9EsU8CgSgiuoABACNPBFRPArIYgARY/YjFshpPArIaTLIashqBBrIQI7IBsyqwJEMjQv+rMRaBAglJOBAkEkQxFiQJSTgQgQQSRDYaAUkVIhJEFxZJKExQSU4DSb1FAURJIiW6MQASRIFEIroXSU4DQQAHSwIkEkEAZCRETEk4FDIKEkRJOAAxABJESTgRIytlRBJEOBJJRCcHTwJQSb1FAUEACEm+RBdPAghMSwNJgTgiuhdPA0lPAg5EMgpzAURMFk8DSwG/SwVPAogGkTIHFk8CgVRPArspTFCwJEMjQv+ZgABJNhoBSRUiEkQXSRYoSwFQSU4CSb1FAURJgUQiuheBAxJEMgdLAYFUIroXIycEZUQIDUwiJbpJTgUxABIRRCcHTFBJTgO9RQFBADhLAr5EF0lFBksBgTgiuhdJRQgNQQAiSwVJFksETL+xIytlREsGTwIJshJLBLIUshGBBLIQI7IBs4EoIrqIBjgkiAZhFilMULAkQzYaAUkVIhJEF0kWKExQRwK9RQFEgUQiuhdJTgOBBBJAAAhLAoEFEkEAECREIiW6I4gGJxYpTFCwJEMjQv/tNhoBSRUiEkQXSRYoTFBJvUUBREmBRCK6F4EDEkRJIiW6STEAEkQyB08CgVQiuhcjJwRlRIEECwgNRCOIBd4WKUxQsCRDNhoBSRUiEkQXFicHTFBJvUUBQQAKvkQXFilMULAkQ0gjFkL/9DYaAUkVIhJENhoCSRUiEkRMFxYoTFBJvUUBREm+SExJIiW6MQASREmBRCK6FxRETE8CXDAyBxZcVEsBvEi/KrAkQzEWJAlJOBAkEkQ2GgFJFSISRDYaAkkVIhJENhoDSRUiEkQ2GgRJI1mBAghLARUSRDYaBUkVIhJESwQXFihLAVBJvUUBREmBRCK6FxRESwQXREsDVwIAFSUSREsFiATkMQBLARJEMQBLAiIlukxLARNETwKBMCK6SwRLAUsJTwRPBYgEmzIKcwFEMgcWTwhLCFBPB1CAAgAyUExQTwJQTwNQTwNQTwMXFk8DTFAnC0xQSbxITL+IBEQqsCRDgAA2GgFJFSISRDYaAklOAkkVIhJETBcWKEsBUElOA0m9RQFETwIXFk8CTFAnC0xQSU4CvUUBRDEATCIluhJBAApLAYFEIroXQAAJMQBLA4gENRJEMgpJcwFETwK8SExzAUQJSUUEQQAQsTEASwOyCLIHJLIQI7IBsyqwJEM2GgFJFSISRDYaAkkVIhJENhoDSRUiEkRPAhcWKEsBUEm9RQFESb5ITgRJIiW6STEAEkRLAYFEIroXFERLBBcWTwNMUCcLTFBJvUUBREmBECK6SU8FqERLAYEiIrpLBIEwIrpMSwGoRE8CgSoiuksFiAOXSwFPA0sHTwZPBIgDZk8ETwRcKExcXExcOCQWXEQyBxZcVEsBvEi/KrAkQzYaAUkVIhJENhoCSRUiEkRMF0wXTBZMFlAnC0xQSb1FAUS+SClMULAkQ4AANhoBRwIVIhJENhoCSRUiEkRMFxYoSwFQSU4DSb1FAURJIiW6MQASRIFEIroXgQMSRCcHTFBJTgJJvUUBRL5IF0wXSU4CSURJSwIORAlJTgNBAItLAhZPAky/TwKBKCK6iALdTgIjRQUjJwVlREEALCMnBWVESwELgZBOCklFBkEAGrEjK2VEIycGZURLBrISshSyEYEEshAjsgGzsSMrZURMSwVJTgMJSbISTwRJTgSyFEyyEYEEshAjsgGzFkwWIycGZURPBU8EUE8DUE8CUExQJw5MULAWKUxQsCRDTLxIQv92NhoBSRUiEkQXFihMUEm9RQFESb5ITEmBRCK6FyQSRDIHSwGBVCK6FyMnBGVECA1EgQUWTwJMXEQyBxZcVEsBvEi/KrAkQzYaAUkVIhJEFxZJKEsBUEm9RQFESb5ITEmBRCK6F4ECEkQyB0sBgVQiuhcjJwRlRIECCwgNRIEGFk8CTFxEMgcWXFRLAbxIvycHTFBJvUUBQQAeSb5EF0mBAgpJTwJLAQknD0sFUEwWv0EACRZLAUy/KrAkQ0hJvEhC//U2GgFJFSISRBdJFihMUEm9RQFESYFEIroXgQYSRIEoIrqIAXYkiAGfFilMULAkQzYaAUkVIhJEFxYoSwFQSb1FAURJgUQiuheBBhJEJw9PAlBJvUUBREm+SBdMvEixIytlRE8CIiW6SwKyErIUshGBBLIQI7IBsxYpTFCwJEM2GgFJFSISRDYaAkkVJRJEMQAyCRJEIycFZUQUREwXSURJgfoBDkRLATIDE0QjK2VESwJMcABFAUQnBUxnJwZMZyqwJEM2GgFHAhUiEkQxADIJEkQXSUEABksBiAC+SCcJTGcqsCRDIycJZUQWKUxQsCRDNhoBSRUiEkQXFihMUEm9RQFESb5ITEkiJboxABJESYFEIroXFESBBRZPAkxcRDIHFlxUSwG8SL8qsCRDNhoBSRUiEkQXFihMUEm9RQFEvkgpTFCwJEMjJwplRBYpTFCwJEOKAgAyCov+OAdLARJEi/44ADEAEkSL/jgITHMBRIv/CQ9EiYoFAIv7F0EAGov7i/ypRIv7i/2pRIv7iAAKSYv+E0SL/xNEiYoBAbEjJwhlRLIYJw2yGov/shqBBrIQI7IBs7Q+SVcABCkSRFcEAEkVJRJEiYoDAYv9FkknB0xQSb1FAURJvkgXSU4CRLxII04Ci/9BADQjJwVlREEALCMnBWVESwELgZBOCkmMAEEAGrEjK2VEIycGZUSLALISshSyEYEEshAjsgGzsSMrZURMiwBJTgMJSbISi/6yFEyyEYEEshAjsgGzSRZPAhYjJwZlRE8Ei/5QTwNQTwJQTFAnDkxQsEyJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [ { "name": "EscrowPaid", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "address", "name": "payee" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "fee" }, { "type": "address", "name": "treasury" } ], "desc": "ARC-28 event, emitted on every path that moves escrow out of this app.\n\n Nothing was emitted before. The asset transfers themselves are on chain, so\n the money was always traceable \u2014 but which job a transfer settled, and how\n much of it was protocol fee, existed only as a box diff. Reconciling\n treasury income against jobs meant replaying box state.\n\n Emitted from _pay_escrow and from release_partial, the only two paths that\n pay out, so a consumer that reads this event sees every cent that leaves.\n " } ], "templateVariables": {} }