{ "name": "EscrowContract", "structs": { "MediatorData": [ { "name": "address", "type": "address" }, { "name": "bond_amount", "type": "uint64" }, { "name": "is_bonded", "type": "uint64" }, { "name": "did_hash", "type": "byte[32]" } ] }, "methods": [ { "name": "deploy", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "create_bounty", "args": [ { "type": "byte[]", "name": "bounty_id" }, { "type": "uint64", "name": "escrow_amount" }, { "type": "uint64", "name": "is_hitm" }, { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "review_days" }, { "type": "address", "name": "mediator" }, { "type": "address", "name": "treasury" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_work", "args": [ { "type": "byte[]", "name": "proof_url" }, { "type": "byte[]", "name": "proof_data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "approve_work", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "reject_work", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_dispute", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote_dispute", "args": [ { "type": "uint64", "name": "vote_option" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "resolve_dispute", "args": [ { "type": "byte[]", "name": "resolution" }, { "type": "byte[]", "name": "mediator_signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_resolve_creator_win", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "timeout_dispute", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_release", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_abandoned", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "expire_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "github_verify", "args": [ { "type": "byte[]", "name": "pr_url" }, { "type": "byte[]", "name": "test_hash" }, { "type": "byte[]", "name": "oidc_token" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_github_status", "args": [ { "type": "byte[]", "name": "status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "get_bounty_info", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "register_arbitrator", "args": [ { "type": "address", "name": "address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deregister_arbitrator", "args": [ { "type": "address", "name": "address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "delete_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": { "payout_type": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cGF5b3V0X3R5cGU=" }, "is_hitm": { "keyType": "AVMString", "valueType": "uint64", "key": "aXNfaGl0bQ==" }, "review_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RlYWRsaW5l" }, "rejection_count": { "keyType": "AVMString", "valueType": "uint64", "key": "cmVqZWN0aW9uX2NvdW50" }, "escrow_amount": { "keyType": "AVMString", "valueType": "uint64", "key": "ZXNjcm93X2Ftb3VudA==" }, "asset_id": { "keyType": "AVMString", "valueType": "uint64", "key": "YXNzZXRfaWQ=" }, "creator_address": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcl9hZGRyZXNz" }, "agent_address": { "keyType": "AVMString", "valueType": "address", "key": "YWdlbnRfYWRkcmVzcw==" }, "proof_url": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfdXJs" }, "proof_data": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfZGF0YQ==" }, "bounty_id": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Ym91bnR5X2lk" }, "dispute_reason": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZGlzcHV0ZV9yZWFzb24=" }, "dispute_initiator": { "keyType": "AVMString", "valueType": "address", "key": "ZGlzcHV0ZV9pbml0aWF0b3I=" }, "claim_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fZGVhZGxpbmU=" }, "claim_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fdGltZXN0YW1w" }, "github_status": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Z2l0aHViX3N0YXR1cw==" }, "dispute_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "ZGlzcHV0ZV90aW1lc3RhbXA=" }, "review_days": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RheXM=" }, "state_box": { "keyType": "AVMString", "valueType": "uint64", "key": "c3RhdGU=" }, "mediator_data": { "keyType": "AVMString", "valueType": "MediatorData", "key": "bWVkaWF0b3JfZGF0YQ==" }, "treasury_address": { "keyType": "AVMString", "valueType": "address", "key": "dHJlYXN1cnlfYWRkcmVzcw==" }, "oidc_token": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "b2lkY190b2tlbg==" }, "candidate_count": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2FuZGlkYXRlX2NvdW50" }, "arbitrator_1": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8x" }, "arbitrator_2": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8y" }, "arbitrator_3": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8z" }, "arbitrator_1_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8xX3ZvdGU=" }, "arbitrator_2_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8yX3ZvdGU=" }, "arbitrator_3_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8zX3ZvdGU=" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1467, 2388, 2499, 2604, 3019, 3075, 3186, 3324, 3469, 3604 ], "errorMessage": "Address length is 32 bytes" }, { "pc": [ 4095 ], "errorMessage": "Arbitrator already registered" }, { "pc": [ 4193 ], "errorMessage": "Arbitrator not registered" }, { "pc": [ 981 ], "errorMessage": "Bounty already claimed" }, { "pc": [ 813 ], "errorMessage": "Bounty already initialized" }, { "pc": [ 2146 ], "errorMessage": "Bounty is not disputed" }, { "pc": [ 4305 ], "errorMessage": "Bounty must be fully closed/paid out before deletion" }, { "pc": [ 975 ], "errorMessage": "Cannot claim your own bounty" }, { "pc": [ 3679 ], "errorMessage": "Claim deadline not yet reached" }, { "pc": [ 1004 ], "errorMessage": "Claiming agent must opt-in to the asset first" }, { "pc": [ 4362 ], "errorMessage": "Contract is not opted into the asset" }, { "pc": [ 3274 ], "errorMessage": "Dispute timeout not yet reached" }, { "pc": [ 4254 ], "errorMessage": "Failed to delete address box" }, { "pc": [ 4257 ], "errorMessage": "Failed to delete index box" }, { "pc": [ 4372 ], "errorMessage": "Failed to read contract balance" }, { "pc": [ 4366 ], "errorMessage": "Insufficient asset balance" }, { "pc": [ 4376 ], "errorMessage": "Insufficient contract balance" }, { "pc": [ 2963 ], "errorMessage": "Invalid mediator signature" }, { "pc": [ 1236 ], "errorMessage": "Invalid state for submit_work" }, { "pc": [ 2166 ], "errorMessage": "Invalid vote option" }, { "pc": [ 1134, 1255 ], "errorMessage": "Only claiming agent can submit work" }, { "pc": [ 1417 ], "errorMessage": "Only creator can approve work" }, { "pc": [ 4297 ], "errorMessage": "Only creator can delete application" }, { "pc": [ 1548 ], "errorMessage": "Only creator can reject work" }, { "pc": [ 2202 ], "errorMessage": "Sender is not an assigned arbitrator with a pending vote" }, { "pc": [ 4183 ], "errorMessage": "Sender must match address to deregister" }, { "pc": [ 4084 ], "errorMessage": "Sender must match address to register" }, { "pc": [ 1887, 1963, 2046, 4228 ], "errorMessage": "check Box exists" }, { "pc": [ 1132, 4045 ], "errorMessage": "check self.agent_address exists" }, { "pc": [ 2178, 2423, 2534, 2639 ], "errorMessage": "check self.arbitrator_1 exists" }, { "pc": [ 2186, 2229, 2302 ], "errorMessage": "check self.arbitrator_1_vote exists" }, { "pc": [ 2439, 2550, 2655, 2788 ], "errorMessage": "check self.arbitrator_2 exists" }, { "pc": [ 2235, 2310, 2798 ], "errorMessage": "check self.arbitrator_2_vote exists" }, { "pc": [ 2455, 2566, 2671, 2818 ], "errorMessage": "check self.arbitrator_3 exists" }, { "pc": [ 2242, 2317, 2828 ], "errorMessage": "check self.arbitrator_3_vote exists" }, { "pc": [ 3705, 3889, 4029 ], "errorMessage": "check self.bounty_id exists" }, { "pc": [ 3674 ], "errorMessage": "check self.claim_deadline exists" }, { "pc": [ 973, 1415, 1546, 1659, 1752, 2486, 2576, 2591, 2683, 3062, 3088, 3173, 3200, 3311, 3339, 3552, 3591, 3617, 4040, 4295, 4320, 4453, 4462 ], "errorMessage": "check self.creator_address exists" }, { "pc": [ 3125, 3264 ], "errorMessage": "check self.dispute_timestamp exists" }, { "pc": [ 1421, 2269, 2967, 3153, 3278, 3423, 3558, 4034 ], "errorMessage": "check self.escrow_amount exists" }, { "pc": [ 1458, 2379, 2490, 2595, 2950, 3010, 3066, 3177, 3315, 3460, 3595 ], "errorMessage": "check self.mediator_data exists" }, { "pc": [ 4050 ], "errorMessage": "check self.rejection_count exists" }, { "pc": [ 3414 ], "errorMessage": "check self.review_deadline exists" }, { "pc": [ 965, 1118, 1406, 1537, 1635, 2141, 2899, 3116, 3255, 3393, 3528, 3666, 3828, 4022, 4300 ], "errorMessage": "check self.state_box exists" }, { "pc": [ 1746, 4473 ], "errorMessage": "check self.treasury_address exists" }, { "pc": [ 709, 1074, 1090, 1510, 1608, 2854, 2871, 3769, 3785, 3801, 3901 ], "errorMessage": "invalid array length header" }, { "pc": [ 716, 1081, 1097, 1517, 1615, 2861, 2878, 3776, 3792, 3808, 3908 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 782, 793, 4064, 4163 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 729, 742, 755, 768, 2122 ], "errorMessage": "invalid number of bytes for arc4.uint64" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA2IDg2NDAwIFRNUExfQ0xBSU1fVElNRU9VVCBUTVBMX0RJU1BVVEVfVElNRU9VVAogICAgYnl0ZWNibG9jayAic3RhdGUiICJjcmVhdG9yX2FkZHJlc3MiICJwYXlvdXRfdHlwZSIgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICJtZWRpYXRvcl9kYXRhIiAiZXNjcm93X2Ftb3VudCIgImFzc2V0X2lkIiAicmVqZWN0aW9uX2NvdW50IiAweDYzNjE2ZTY0NWY2MTY0NjQ3MjVmICJhZ2VudF9hZGRyZXNzIiAicHJvb2ZfdXJsIiAicHJvb2ZfZGF0YSIgImJvdW50eV9pZCIgImNhbmRpZGF0ZV9jb3VudCIgImFyYml0cmF0b3JfMSIgImFyYml0cmF0b3JfMiIgImFyYml0cmF0b3JfMyIgImFyYml0cmF0b3JfMV92b3RlIiAiYXJiaXRyYXRvcl8yX3ZvdGUiICJhcmJpdHJhdG9yXzNfdm90ZSIgImlzX2hpdG0iIDB4NTA0MTU5NGY1NTU0IDB4NTI0NTQ2NTU0ZTQ0ICJnaXRodWJfc3RhdHVzIiAidHJlYXN1cnlfYWRkcmVzcyIgInJldmlld19kYXlzIiAicmV2aWV3X2RlYWRsaW5lIiAiZGlzcHV0ZV90aW1lc3RhbXAiIDB4NzA2NTZlNjQ2OTZlNjcgMHg2MzYxNmU2NDVmNjk2NDc4NWYgImNsYWltX2RlYWRsaW5lIiAiZGlzcHV0ZV9yZWFzb24iIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYxNjc2NTZlNzQ1Zjc3Njk2ZSAweDY0Njk3MzcwNzU3NDY1NWY3MjY1NzM2ZjZjNzY2NTY0NWY2MzcyNjU2MTc0NmY3MjVmNzc2OTZlIDB4NTM1MDRjNDk1NCAib2lkY190b2tlbiIKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDFmZjBkN2QyIC8vIG1ldGhvZCAiZGVsZXRlX2JvdW50eSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZGVsZXRlX2JvdW50eV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjYKICAgIHB1c2hieXRlc3MgMHgyODJmMTc3MCAweDRiYzg2N2E2IDB4MjUwOTkzN2MgMHg0MGMzMDY3ZiAweDc3OWVjNjNlIDB4ZTA1YmM5MzUgMHg3YjM1NzlhYiAweGI3NDAyMTUyIDB4ZmU2Y2UxMDIgMHg5NTVmY2M4MSAweGFhZTA0YjJjIDB4ODRmMGFlMjcgMHg4Yjc2YjI2YyAweGRhNzkxNzA0IDB4MTE3ZWY0ZDkgMHg3ZjU4OWNjMiAweDVhMWJhNmJiIDB4ZmRkODk5MDAgLy8gbWV0aG9kICJjcmVhdGVfYm91bnR5KGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImNsYWltX2JvdW50eSgpdm9pZCIsIG1ldGhvZCAic3VibWl0X3dvcmsoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhcHByb3ZlX3dvcmsoKXZvaWQiLCBtZXRob2QgInJlamVjdF93b3JrKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzdWJtaXRfZGlzcHV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidm90ZV9kaXNwdXRlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZXNvbHZlX2Rpc3B1dGUoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhdXRvX3Jlc29sdmVfY3JlYXRvcl93aW4oKXZvaWQiLCBtZXRob2QgInRpbWVvdXRfZGlzcHV0ZSgpdm9pZCIsIG1ldGhvZCAiYXV0b19yZWxlYXNlKCl2b2lkIiwgbWV0aG9kICJjbGFpbV9hYmFuZG9uZWQoKXZvaWQiLCBtZXRob2QgImV4cGlyZV9jbGFpbSgpdm9pZCIsIG1ldGhvZCAiZ2l0aHViX3ZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzZXRfZ2l0aHViX3N0YXR1cyhieXRlW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2JvdW50eV9pbmZvKCl2b2lkIiwgbWV0aG9kICJyZWdpc3Rlcl9hcmJpdHJhdG9yKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZGVyZWdpc3Rlcl9hcmJpdHJhdG9yKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ib3VudHkgY2xhaW1fYm91bnR5IHN1Ym1pdF93b3JrIGFwcHJvdmVfd29yayByZWplY3Rfd29yayBzdWJtaXRfZGlzcHV0ZSB2b3RlX2Rpc3B1dGUgcmVzb2x2ZV9kaXNwdXRlIGF1dG9fcmVzb2x2ZV9jcmVhdG9yX3dpbiB0aW1lb3V0X2Rpc3B1dGUgYXV0b19yZWxlYXNlIGNsYWltX2FiYW5kb25lZCBleHBpcmVfY2xhaW0gZ2l0aHViX3ZlcmlmeSBzZXRfZ2l0aHViX3N0YXR1cyBnZXRfYm91bnR5X2luZm8gcmVnaXN0ZXJfYXJiaXRyYXRvciBkZXJlZ2lzdGVyX2FyYml0cmF0b3IKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAyNjoKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDczOWIwODg5IC8vIG1ldGhvZCAiZGVwbG95KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZXBsb3lfcm91dGVAMjcKICAgIGVycgoKbWFpbl9kZXBsb3lfcm91dGVAMjc6CiAgICAvLyBlc2Nyb3cucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZGVsZXRlX2JvdW50eV9yb3V0ZUA0OgogICAgLy8gZXNjcm93LnB5Ojg0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlX2JvdW50eQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5jcmVhdGVfYm91bnR5W3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlX2JvdW50eToKICAgIC8vIGVzY3Jvdy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgNQogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNQogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGVzY3Jvdy5weToxODgKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxODkKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE5MAogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxOTItMTkzCiAgICAvLyAjIFNFQ1VSSVRZIEZJWDogUHJldmVudCByZS1pbml0aWFsaXphdGlvbgogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLnN0YXRlX2JveC5tYXliZSgpCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gZXNjcm93LnB5OjE5NAogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMsICJCb3VudHkgYWxyZWFkeSBpbml0aWFsaXplZCIKICAgICEKICAgIGFzc2VydCAvLyBCb3VudHkgYWxyZWFkeSBpbml0aWFsaXplZAogICAgLy8gZXNjcm93LnB5OjE5Ni0xOTcKICAgIC8vICMgVmFsaWRhdGUgaW5wdXRzCiAgICAvLyBhc3NlcnQgYm91bnR5X2lkLmxlbmd0aCA8PSA2NAogICAgdW5jb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgNjQKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxOTgKICAgIC8vIGFzc2VydCBlc2Nyb3dfYW1vdW50ID4gMAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxOTkKICAgIC8vIGFzc2VydCBpc19oaXRtIDw9IDEKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjAyLTIwMwogICAgLy8gIyBPUFQtSU4gQVNBOiBJZiBhc3NldF9pZCA+IDAsIHRoZSBhcHAgYWNjb3VudCBtdXN0IG9wdC1pbiB0byBpdCBmaXJzdC4KICAgIC8vIGlmIGFzc2V0X2lkID4gMDoKICAgIGJ6IGNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBlc2Nyb3cucHk6MjA0LTIwOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGVzY3Jvdy5weToyMDYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjIwNwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgNQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGVzY3Jvdy5weToyMDQKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gZXNjcm93LnB5OjIwOAogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGVzY3Jvdy5weToyMDQtMjA5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gZXNjcm93LnB5OjIxMS0yMTIKICAgIC8vICMgSW5pdGlhbGl6ZSBzdGF0ZQogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoT1BFTikKICAgIGludGNfMSAvLyAwCiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjE0LTIyMAogICAgLy8gIyBJbml0aWFsaXplIG1lZGlhdG9yIGRhdGEgaW5zaWRlIGEgc2luZ2xlIGJveAogICAgLy8gc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlID0gTWVkaWF0b3JEYXRhKAogICAgLy8gICAgIGFkZHJlc3M9YXJjNC5BZGRyZXNzKG1lZGlhdG9yKSwKICAgIC8vICAgICBib25kX2Ftb3VudD1hcmM0LlVJbnQ2NCgwKSwgICMgV2lsbCBiZSBwb3B1bGF0ZWQgd2hlbiBib25kZWQKICAgIC8vICAgICBpc19ib25kZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgZGlkX2hhc2g9YXJjNC5TdGF0aWNBcnJheVthcmM0LkJ5dGUsIHR5cGluZy5MaXRlcmFsWzMyXV0uZnJvbV9ieXRlcyhCeXRlcyhiIlx4MDAiICogMzIpKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGVzY3Jvdy5weToyMTkKICAgIC8vIGRpZF9oYXNoPWFyYzQuU3RhdGljQXJyYXlbYXJjNC5CeXRlLCB0eXBpbmcuTGl0ZXJhbFszMl1dLmZyb21fYnl0ZXMoQnl0ZXMoYiJceDAwIiAqIDMyKSkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBlc2Nyb3cucHk6MjE0LTIyMAogICAgLy8gIyBJbml0aWFsaXplIG1lZGlhdG9yIGRhdGEgaW5zaWRlIGEgc2luZ2xlIGJveAogICAgLy8gc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlID0gTWVkaWF0b3JEYXRhKAogICAgLy8gICAgIGFkZHJlc3M9YXJjNC5BZGRyZXNzKG1lZGlhdG9yKSwKICAgIC8vICAgICBib25kX2Ftb3VudD1hcmM0LlVJbnQ2NCgwKSwgICMgV2lsbCBiZSBwb3B1bGF0ZWQgd2hlbiBib25kZWQKICAgIC8vICAgICBpc19ib25kZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgZGlkX2hhc2g9YXJjNC5TdGF0aWNBcnJheVthcmM0LkJ5dGUsIHR5cGluZy5MaXRlcmFsWzMyXV0uZnJvbV9ieXRlcyhCeXRlcyhiIlx4MDAiICogMzIpKQogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBlc2Nyb3cucHk6MjE0LTIxNQogICAgLy8gIyBJbml0aWFsaXplIG1lZGlhdG9yIGRhdGEgaW5zaWRlIGEgc2luZ2xlIGJveAogICAgLy8gc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlID0gTWVkaWF0b3JEYXRhKAogICAgYnl0ZWMgNCAvLyAibWVkaWF0b3JfZGF0YSIKICAgIC8vIGVzY3Jvdy5weToyMTQtMjIwCiAgICAvLyAjIEluaXRpYWxpemUgbWVkaWF0b3IgZGF0YSBpbnNpZGUgYSBzaW5nbGUgYm94CiAgICAvLyBzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUgPSBNZWRpYXRvckRhdGEoCiAgICAvLyAgICAgYWRkcmVzcz1hcmM0LkFkZHJlc3MobWVkaWF0b3IpLAogICAgLy8gICAgIGJvbmRfYW1vdW50PWFyYzQuVUludDY0KDApLCAgIyBXaWxsIGJlIHBvcHVsYXRlZCB3aGVuIGJvbmRlZAogICAgLy8gICAgIGlzX2JvbmRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkaWRfaGFzaD1hcmM0LlN0YXRpY0FycmF5W2FyYzQuQnl0ZSwgdHlwaW5nLkxpdGVyYWxbMzJdXS5mcm9tX2J5dGVzKEJ5dGVzKGIiXHgwMCIgKiAzMikpCiAgICAvLyApCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjIxCiAgICAvLyBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MudmFsdWUgPSB0cmVhc3VyeQogICAgYnl0ZWMgMjQgLy8gInRyZWFzdXJ5X2FkZHJlc3MiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjIyCiAgICAvLyBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUgPSBlc2Nyb3dfYW1vdW50CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJlc2Nyb3dfYW1vdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjIyMwogICAgLy8gc2VsZi5ib3VudHlfaWQudmFsdWUgPSBib3VudHlfaWQKICAgIGJ5dGVjIDEyIC8vICJib3VudHlfaWQiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDEyIC8vICJib3VudHlfaWQiCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjIyNAogICAgLy8gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICB0eG4gU2VuZGVyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjI2CiAgICAvLyBpZiBpc19oaXRtID4gMDoKICAgIGRpZyAzCiAgICBieiBjcmVhdGVfYm91bnR5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gZXNjcm93LnB5OjIyNwogICAgLy8gc2VsZi5pc19oaXRtLnZhbHVlID0gaXNfaGl0bQogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjIDIwIC8vICJpc19oaXRtIgogICAgc3dhcAogICAgYm94X3B1dAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBlc2Nyb3cucHk6MjI4CiAgICAvLyBpZiBhc3NldF9pZCA+IDA6CiAgICBkaWcgMgogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGVzY3Jvdy5weToyMjkKICAgIC8vIHNlbGYuYXNzZXRfaWQudmFsdWUgPSBhc3NldF9pZAogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjIDYgLy8gImFzc2V0X2lkIgogICAgc3dhcAogICAgYm94X3B1dAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBlc2Nyb3cucHk6MjMwCiAgICAvLyBpZiByZXZpZXdfZGF5cyA+IDA6CiAgICBkaWcgMQogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBlc2Nyb3cucHk6MjMxCiAgICAvLyBzZWxmLnJldmlld19kYXlzLnZhbHVlID0gcmV2aWV3X2RheXMKICAgIGRpZyAxCiAgICBpdG9iCiAgICBieXRlYyAyNSAvLyAicmV2aWV3X2RheXMiCiAgICBzd2FwCiAgICBib3hfcHV0CgpjcmVhdGVfYm91bnR5X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBlc2Nyb3cucHk6MjMzCiAgICAvLyBsb2coQnl0ZXMoYiJib3VudHlfY3JlYXRlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY2MzcyNjU2MTc0NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MjM0CiAgICAvLyBsb2coYm91bnR5X2lkKQogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuY2xhaW1fYm91bnR5W3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fYm91bnR5OgogICAgLy8gZXNjcm93LnB5OjIzOAogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIzOQogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjQwCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI0MgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IE9QRU4KICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjQzCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciAhPSBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgIkNhbm5vdCBjbGFpbSB5b3VyIG93biBib3VudHkiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICAhPQogICAgYXNzZXJ0IC8vIENhbm5vdCBjbGFpbSB5b3VyIG93biBib3VudHkKICAgIC8vIGVzY3Jvdy5weToyNDQKICAgIC8vIGFzc2VydCBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSksICJCb3VudHkgYWxyZWFkeSBjbGFpbWVkIgogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0IC8vIEJvdW50eSBhbHJlYWR5IGNsYWltZWQKICAgIC8vIGVzY3Jvdy5weTo4MwogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDYgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weToyNDgKICAgIC8vIGlmIGFzc2V0X2lkID4gMDoKICAgIGJ6IGNsYWltX2JvdW50eV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGVzY3Jvdy5weToyNDkKICAgIC8vIGJhbGFuY2UsIGV4aXN0cyA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKFR4bi5zZW5kZXIsIGFzc2V0X2lkKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBlc2Nyb3cucHk6MjUwCiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiQ2xhaW1pbmcgYWdlbnQgbXVzdCBvcHQtaW4gdG8gdGhlIGFzc2V0IGZpcnN0IgogICAgYXNzZXJ0IC8vIENsYWltaW5nIGFnZW50IG11c3Qgb3B0LWluIHRvIHRoZSBhc3NldCBmaXJzdAoKY2xhaW1fYm91bnR5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGVzY3Jvdy5weToyNTIKICAgIC8vIHNlbGYuYWdlbnRfYWRkcmVzcy52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDkgLy8gImFnZW50X2FkZHJlc3MiCiAgICB0eG4gU2VuZGVyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjUzCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTEFJTUVEKQogICAgaW50Y18wIC8vIDEKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI1NwogICAgLy8gc2VsZi5jbGFpbV9kZWFkbGluZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wICsgY2xhaW1fdGltZW91dAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gZXNjcm93LnB5OjI1NS0yNTYKICAgIC8vICMgU2V0IGNsYWltIGRlYWRsaW5lCiAgICAvLyBjbGFpbV90aW1lb3V0ID0gVGVtcGxhdGVWYXJbVUludDY0XSgiQ0xBSU1fVElNRU9VVCIpCiAgICBpbnRjIDUgLy8gVE1QTF9DTEFJTV9USU1FT1VUCiAgICAvLyBlc2Nyb3cucHk6MjU3CiAgICAvLyBzZWxmLmNsYWltX2RlYWRsaW5lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBjbGFpbV90aW1lb3V0CiAgICArCiAgICBpdG9iCiAgICBieXRlYyAzMCAvLyAiY2xhaW1fZGVhZGxpbmUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjU4CiAgICAvLyBzZWxmLmNsYWltX3RpbWVzdGFtcC52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgImNsYWltX3RpbWVzdGFtcCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyNjAKICAgIC8vIGxvZyhCeXRlcyhiImJvdW50eV9jbGFpbWVkIikpCiAgICBwdXNoYnl0ZXMgMHg2MjZmNzU2ZTc0Nzk1ZjYzNmM2MTY5NmQ2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weToyMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5zdWJtaXRfd29ya1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1Ym1pdF93b3JrOgogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gZXNjcm93LnB5OjI2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIGVzY3Jvdy5weToyNjQKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNjUKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI2NgogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNjgKICAgIC8vIGN1cnJlbnQgPSBzZWxmLnN0YXRlX2JveC52YWx1ZQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weToyNzAKICAgIC8vIGlmIGN1cnJlbnQgPT0gQ0xBSU1FRDoKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogc3VibWl0X3dvcmtfZWxzZV9ib2R5QDYKICAgIHBvcAogICAgLy8gZXNjcm93LnB5OjI3MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hZ2VudF9hZGRyZXNzLnZhbHVlLCAiT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA5IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWdlbnRfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsKICAgIC8vIGVzY3Jvdy5weToyNzIKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoID4gMAogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjczCiAgICAvLyBhc3NlcnQgcHJvb2ZfdXJsLmxlbmd0aCA8PSBNQVhfVVJMX0JZVEVTCiAgICBwdXNoaW50IDUxMgogICAgPD0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI3NAogICAgLy8gYXNzZXJ0IHByb29mX2RhdGEubGVuZ3RoID4gMAogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6Mjc1CiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPD0gTUFYX1BST09GX0JZVEVTCiAgICBwdXNoaW50IDIwNDgKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNzcKICAgIC8vIHNlbGYucHJvb2ZfdXJsLnZhbHVlID0gcHJvb2ZfdXJsCiAgICBieXRlYyAxMCAvLyAicHJvb2ZfdXJsIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMCAvLyAicHJvb2ZfdXJsIgogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Mjc4CiAgICAvLyBzZWxmLnByb29mX2RhdGEudmFsdWUgPSBwcm9vZl9kYXRhCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfZGF0YSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTEgLy8gInByb29mX2RhdGEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Mjc5CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChTVUJNSVRURUQpCiAgICBpbnRjXzIgLy8gMgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjgxLTI4MgogICAgLy8gIyBISVRNOiBTZXQgcmV2aWV3IGRlYWRsaW5lIGlmIGVuYWJsZWQKICAgIC8vIGlzX2hpdG1fdmFsLCBoaXRtX2V4aXN0cyA9IHNlbGYuaXNfaGl0bS5tYXliZSgpCiAgICBieXRlYyAyMCAvLyAiaXNfaGl0bSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ1cnkgMgogICAgLy8gZXNjcm93LnB5OjI4MwogICAgLy8gaWYgaGl0bV9leGlzdHMgYW5kIGlzX2hpdG1fdmFsID09IDE6CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGVzY3Jvdy5weToyODQKICAgIC8vIHJldmlld19kYXlzX3ZhbCwgZGF5c19leGlzdHMgPSBzZWxmLnJldmlld19kYXlzLm1heWJlKCkKICAgIGJ5dGVjIDI1IC8vICJyZXZpZXdfZGF5cyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weToyODUKICAgIC8vIGRheXMgPSByZXZpZXdfZGF5c192YWwgaWYgZGF5c19leGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjI4NgogICAgLy8gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGRheXMgKiA4NjQwMAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgaW50YyA0IC8vIDg2NDAwCiAgICAqCiAgICArCiAgICBpdG9iCiAgICBieXRlYyAyNiAvLyAicmV2aWV3X2RlYWRsaW5lIgogICAgc3dhcAogICAgYm94X3B1dAoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gZXNjcm93LnB5OjI4OAogICAgLy8gbG9nKEJ5dGVzKGIid29ya19zdWJtaXR0ZWQiKSkKICAgIHB1c2hieXRlcyAweDc3NmY3MjZiNWY3Mzc1NjI2ZDY5NzQ3NDY1NjQKICAgIGxvZwoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIGVzY3Jvdy5weToyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKc3VibWl0X3dvcmtfZWxzZV9ib2R5QDY6CiAgICAvLyBlc2Nyb3cucHk6MjkwCiAgICAvLyBlbGlmIGN1cnJlbnQgPT0gUkVKRUNURUQ6CiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzdGF0ZSBmb3Igc3VibWl0X3dvcmsKICAgIC8vIGVzY3Jvdy5weToyOTEKICAgIC8vIGFnZW50X3ZhbCwgYWdlbnRfZXhpc3RzID0gc2VsZi5hZ2VudF9hZGRyZXNzLm1heWJlKCkKICAgIGJ5dGVjIDkgLy8gImFnZW50X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDUKICAgIC8vIGVzY3Jvdy5weToyOTIKICAgIC8vIGFzc2VydCBhZ2VudF9leGlzdHMgYW5kIFR4bi5zZW5kZXIgPT0gYWdlbnRfdmFsLCAiT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsiCiAgICBieiBzdWJtaXRfd29ya19ib29sX2ZhbHNlQDEwCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgPT0KICAgIGJ6IHN1Ym1pdF93b3JrX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMCAvLyAxCgpzdWJtaXRfd29ya19ib29sX21lcmdlQDExOgogICAgLy8gZXNjcm93LnB5OjI5MgogICAgLy8gYXNzZXJ0IGFnZW50X2V4aXN0cyBhbmQgVHhuLnNlbmRlciA9PSBhZ2VudF92YWwsICJPbmx5IGNsYWltaW5nIGFnZW50IGNhbiBzdWJtaXQgd29yayIKICAgIGFzc2VydCAvLyBPbmx5IGNsYWltaW5nIGFnZW50IGNhbiBzdWJtaXQgd29yawogICAgLy8gZXNjcm93LnB5OjI5NAogICAgLy8gcmVqX3ZhbCwgcmVqX2V4aXN0cyA9IHNlbGYucmVqZWN0aW9uX2NvdW50Lm1heWJlKCkKICAgIGJ5dGVjIDcgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weToyOTUKICAgIC8vIHJlamVjdGlvbnMgPSByZWpfdmFsIGlmIHJlal9leGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjI5NgogICAgLy8gYXNzZXJ0IHJlamVjdGlvbnMgPCBNQVhfUkVKRUNUSU9OUwogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI5OAogICAgLy8gYXNzZXJ0IHByb29mX3VybC5sZW5ndGggPiAwCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyOTkKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoIDw9IE1BWF9VUkxfQllURVMKICAgIHB1c2hpbnQgNTEyCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzAwCiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPiAwCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMwMQogICAgLy8gYXNzZXJ0IHByb29mX2RhdGEubGVuZ3RoIDw9IE1BWF9QUk9PRl9CWVRFUwogICAgcHVzaGludCAyMDQ4CiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzAzCiAgICAvLyBzZWxmLnByb29mX3VybC52YWx1ZSA9IHByb29mX3VybAogICAgYnl0ZWMgMTAgLy8gInByb29mX3VybCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTAgLy8gInByb29mX3VybCIKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMwNAogICAgLy8gc2VsZi5wcm9vZl9kYXRhLnZhbHVlID0gcHJvb2ZfZGF0YQogICAgYnl0ZWMgMTEgLy8gInByb29mX2RhdGEiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDExIC8vICJwcm9vZl9kYXRhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMwNQogICAgLy8gc2VsZi5yZWplY3Rpb25fY291bnQudmFsdWUgPSByZWplY3Rpb25zICsgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDcgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozMDYKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KFNVQk1JVFRFRCkKICAgIGludGNfMiAvLyAyCiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozMDgtMzA5CiAgICAvLyAjIEhJVE06IFJlc2V0IHJldmlldyBkZWFkbGluZSBvbiByZXZpc2lvbiBpZiBlbmFibGVkCiAgICAvLyBpc19oaXRtX3ZhbCwgaGl0bV9leGlzdHMgPSBzZWxmLmlzX2hpdG0ubWF5YmUoKQogICAgYnl0ZWMgMjAgLy8gImlzX2hpdG0iCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBidXJ5IDIKICAgIC8vIGVzY3Jvdy5weTozMTAKICAgIC8vIGlmIGhpdG1fZXhpc3RzIGFuZCBpc19oaXRtX3ZhbCA9PSAxOgogICAgYnogc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIGVzY3Jvdy5weTozMTEKICAgIC8vIHJldmlld19kYXlzX3ZhbCwgZGF5c19leGlzdHMgPSBzZWxmLnJldmlld19kYXlzLm1heWJlKCkKICAgIGJ5dGVjIDI1IC8vICJyZXZpZXdfZGF5cyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTozMTIKICAgIC8vIGRheXMgPSByZXZpZXdfZGF5c192YWwgaWYgZGF5c19leGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjMxMwogICAgLy8gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGRheXMgKiA4NjQwMAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgaW50YyA0IC8vIDg2NDAwCiAgICAqCiAgICArCiAgICBpdG9iCiAgICBieXRlYyAyNiAvLyAicmV2aWV3X2RlYWRsaW5lIgogICAgc3dhcAogICAgYm94X3B1dAoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIGVzY3Jvdy5weTozMTUKICAgIC8vIGxvZyhCeXRlcyhiIndvcmtfcmV2aXNlX3N1Ym1pdHRlZCIpKQogICAgcHVzaGJ5dGVzIDB4Nzc2ZjcyNmI1ZjcyNjU3NjY5NzM2NTVmNzM3NTYyNmQ2OTc0NzQ2NTY0CiAgICBsb2cKICAgIGIgc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNwoKc3VibWl0X3dvcmtfYm9vbF9mYWxzZUAxMDoKICAgIGludGNfMSAvLyAwCiAgICBiIHN1Ym1pdF93b3JrX2Jvb2xfbWVyZ2VAMTEKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuYXBwcm92ZV93b3JrW3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwcm92ZV93b3JrOgogICAgLy8gZXNjcm93LnB5OjMyMgogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyMwogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzI0CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyNgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyNwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJPbmx5IGNyZWF0b3IgY2FuIGFwcHJvdmUgd29yayIKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiBhcHByb3ZlIHdvcmsKICAgIC8vIGVzY3Jvdy5weTozMjkKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTozMzEKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjMzMwogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFBBWU9VVCkKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIxIC8vIDB4NTA0MTU5NGY1NTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzM0CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMzOAogICAgLy8gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjMzOQogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTozMzYtMzQwCiAgICAvLyAjIFNwbGl0IHBsYXRmb3JtIGZlZTogMSUgcm95YWx0eSAoY3JlYXRvcikgKyAxJSB0cmVhc3VyeSwgMC4yNSUgbWVkaWF0b3IKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBzZWxmLl9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIC8vICAgICBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIC8vICkKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9mZWVfc3BsaXQKICAgIC8vIGVzY3Jvdy5weTozNDEKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCksIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozNDMKICAgIC8vIGxvZyhCeXRlcyhiIndvcmtfYXBwcm92ZWQiKSkKICAgIHB1c2hieXRlcyAweDc3NmY3MjZiNWY2MTcwNzA3MjZmNzY2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTozMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5yZWplY3Rfd29ya1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlamVjdF93b3JrOgogICAgLy8gZXNjcm93LnB5OjM0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5OjM0NwogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjM0OAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzQ5CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjM1MQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjM1MgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJPbmx5IGNyZWF0b3IgY2FuIHJlamVjdCB3b3JrIgogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIHJlamVjdCB3b3JrCiAgICAvLyBlc2Nyb3cucHk6OTkKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5yZWplY3Rpb25fY291bnQubWF5YmUoKQogICAgYnl0ZWMgNyAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjEwMAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjM1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSA8IE1BWF9SRUpFQ1RJT05TCiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzU1CiAgICAvLyBzZWxmLnJlamVjdGlvbl9jb3VudC52YWx1ZSA9IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSArIDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA3IC8vICJyZWplY3Rpb25fY291bnQiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzU2CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChSRUpFQ1RFRCkKICAgIHB1c2hpbnQgMwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzU4CiAgICAvLyBsb2coQnl0ZXMoYiJ3b3JrX3JlamVjdGVkIikpCiAgICBwdXNoYnl0ZXMgMHg3NzZmNzI2YjVmNzI2NTZhNjU2Mzc0NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MzU5CiAgICAvLyBsb2cocmVhc29uKQogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MzQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3Quc3VibWl0X2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzdWJtaXRfZGlzcHV0ZToKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBlc2Nyb3cucHk6MzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBlc2Nyb3cucHk6MzYzCiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzY0CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNjUKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzY3CiAgICAvLyBzdGF0ZSA9IHNlbGYuc3RhdGVfYm94LnZhbHVlCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZXNjcm93LnB5OjM2OAogICAgLy8gYXNzZXJ0IHN0YXRlID09IFNVQk1JVFRFRCBvciBzdGF0ZSA9PSBSRUpFQ1RFRAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBibnogc3VibWl0X2Rpc3B1dGVfYm9vbF90cnVlQDMKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9ib29sX2ZhbHNlQDQKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18wIC8vIDEKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfbWVyZ2VANToKICAgIC8vIGVzY3Jvdy5weTozNjgKICAgIC8vIGFzc2VydCBzdGF0ZSA9PSBTVUJNSVRURUQgb3Igc3RhdGUgPT0gUkVKRUNURUQKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjM2OQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUgb3IgVHhuLnNlbmRlciA9PSBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICA9PQogICAgYm56IHN1Ym1pdF9kaXNwdXRlX2Jvb2xfdHJ1ZUA3CiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgPT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2Jvb2xfZmFsc2VAOAoKc3VibWl0X2Rpc3B1dGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKc3VibWl0X2Rpc3B1dGVfYm9vbF9tZXJnZUA5OgogICAgLy8gZXNjcm93LnB5OjM2OQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUgb3IgVHhuLnNlbmRlciA9PSBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNzAKICAgIC8vIGFzc2VydCByZWFzb24ubGVuZ3RoID4gMAogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzcxCiAgICAvLyBhc3NlcnQgcmVhc29uLmxlbmd0aCA8PSBNQVhfRElTUFVURV9SRUFTT05fQllURVMKICAgIHB1c2hpbnQgMjU2CiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzczCiAgICAvLyBzZWxmLmRpc3B1dGVfcmVhc29uLnZhbHVlID0gcmVhc29uCiAgICBieXRlYyAzMSAvLyAiZGlzcHV0ZV9yZWFzb24iCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDMxIC8vICJkaXNwdXRlX3JlYXNvbiIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozNzQKICAgIC8vIHNlbGYuZGlzcHV0ZV9pbml0aWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImRpc3B1dGVfaW5pdGlhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM3NQogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoRElTUFVURUQpCiAgICBwdXNoaW50IDQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM3NgogICAgLy8gc2VsZi5kaXNwdXRlX3RpbWVzdGFtcC52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBieXRlYyAyNyAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NzkKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5jYW5kaWRhdGVfY291bnQubWF5YmUoKQogICAgYnl0ZWMgMTMgLy8gImNhbmRpZGF0ZV9jb3VudCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4MAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIGVzY3Jvdy5weTozODAKICAgIC8vIHRyZWFzdXJ5ID0gc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlCiAgICBieXRlYyAyNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6MzgxCiAgICAvLyBjcmVhdG9yID0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTozODIKICAgIC8vIHdvcmtlciA9IHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCkKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBidXJ5IDgKICAgIC8vIGVzY3Jvdy5weTozODgKICAgIC8vIGlmIGNvdW50ID4gVUludDY0KDApOgogICAgYm56IHN1Ym1pdF9kaXNwdXRlX2lmX2JvZHlAMTAKICAgIGR1cAogICAgYnVyeSAxMAogICAgZHVwCiAgICBidXJ5IDExCiAgICBidXJ5IDExCgpzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gZXNjcm93LnB5OjQyNgogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzEudmFsdWUgPSBhcmIxCiAgICBieXRlYyAxNCAvLyAiYXJiaXRyYXRvcl8xIgogICAgZGlnIDExCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0MjcKICAgIC8vIHNlbGYuYXJiaXRyYXRvcl8yLnZhbHVlID0gYXJiMgogICAgYnl0ZWMgMTUgLy8gImFyYml0cmF0b3JfMiIKICAgIGRpZyAxMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDI4CiAgICAvLyBzZWxmLmFyYml0cmF0b3JfMy52YWx1ZSA9IGFyYjMKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzMiCiAgICBkaWcgMTEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQzMAogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzFfdm90ZS52YWx1ZSA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDMxCiAgICAvLyBzZWxmLmFyYml0cmF0b3JfMl92b3RlLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyAxOCAvLyAiYXJiaXRyYXRvcl8yX3ZvdGUiCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQzMgogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzNfdm90ZS52YWx1ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTkgLy8gImFyYml0cmF0b3JfM192b3RlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQzNAogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV9zdWJtaXR0ZWQiKSkKICAgIHB1c2hieXRlcyAweDY0Njk3MzcwNzU3NDY1NWY3Mzc1NjI2ZDY5NzQ3NDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQzNQogICAgLy8gbG9nKGFyYjEuYnl0ZXMpCiAgICB1bmNvdmVyIDIKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQzNgogICAgLy8gbG9nKGFyYjIuYnl0ZXMpCiAgICBzd2FwCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0MzcKICAgIC8vIGxvZyhhcmIzLmJ5dGVzKQogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnN1Ym1pdF9kaXNwdXRlX2lmX2JvZHlAMTA6CiAgICAvLyBlc2Nyb3cucHk6Mzg5CiAgICAvLyBzZWVkID0gb3Auc2hhMjU2KFR4bi50eF9pZCArIG9wLml0b2IoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgdHhuIFR4SUQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBlc2Nyb3cucHk6MzkwCiAgICAvLyBzdGFydF9pZHggPSBvcC5idG9pKHNlZWQpICUgY291bnQKICAgIGJ0b2kKICAgIGRpZyA2CiAgICAlCiAgICAvLyBlc2Nyb3cucHk6Mzk0CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA2CiAgICAvLyBlc2Nyb3cucHk6Mzk1CiAgICAvLyBzZWFyY2hlZCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNAogICAgZGlnIDEKICAgIGJ1cnkgMTMKICAgIGJ1cnkgNAoKc3VibWl0X2Rpc3B1dGVfd2hpbGVfdG9wQDExOgogICAgLy8gZXNjcm93LnB5OjM5NgogICAgLy8gd2hpbGUgc2VhcmNoZWQgPCBjb3VudCBhbmQgbm90IGZvdW5kOgogICAgZGlnIDIKICAgIGRpZyA2CiAgICA8CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl93aGlsZUAxNwogICAgZGlnIDQKICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl93aGlsZUAxNwogICAgLy8gZXNjcm93LnB5OjM5NwogICAgLy8gY2FuZGlkYXRlID0gQm94KEFjY291bnQsIGtleT1CeXRlcyhiImNhbmRfYWRkcl8iKSArIG9wLml0b2IoaWR4KSkudmFsdWUKICAgIGRpZyAzCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4NjM2MTZlNjQ1ZjYxNjQ2NDcyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDExCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgLy8gZXNjcm93LnB5OjM5OAogICAgLy8gaWYgY2FuZGlkYXRlICE9IGNyZWF0b3IgYW5kIGNhbmRpZGF0ZSAhPSB3b3JrZXI6CiAgICBkaWcgOAogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTYKICAgIGRpZyA4CiAgICBkaWcgNwogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGVzY3Jvdy5weTo0MDAKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNQogICAgZGlnIDgKICAgIGJ1cnkgMTIKCnN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBlc2Nyb3cucHk6NDAxCiAgICAvLyBpZHggPSAoaWR4ICsgMSkgJSBjb3VudAogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkaWcgNgogICAgJQogICAgYnVyeSA0CiAgICAvLyBlc2Nyb3cucHk6NDAyCiAgICAvLyBzZWFyY2hlZCA9IHNlYXJjaGVkICsgMQogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgc3VibWl0X2Rpc3B1dGVfd2hpbGVfdG9wQDExCgpzdWJtaXRfZGlzcHV0ZV9hZnRlcl93aGlsZUAxNzoKICAgIC8vIGVzY3Jvdy5weTo0MDQtNDA1CiAgICAvLyAjIFRyeSB0byBmaW5kIGFyYjIKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDUKICAgIC8vIGVzY3Jvdy5weTo0MDYKICAgIC8vIHNlYXJjaGVkID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSAzCiAgICBkdXAKICAgIGJ1cnkgMTEKCnN1Ym1pdF9kaXNwdXRlX3doaWxlX3RvcEAxODoKICAgIC8vIGVzY3Jvdy5weTo0MDcKICAgIC8vIHdoaWxlIHNlYXJjaGVkIDwgY291bnQgYW5kIG5vdCBmb3VuZDoKICAgIGRpZyAyCiAgICBkaWcgNgogICAgPAogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfd2hpbGVAMjUKICAgIGRpZyA0CiAgICBibnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfd2hpbGVAMjUKICAgIC8vIGVzY3Jvdy5weTo0MDgKICAgIC8vIGNhbmRpZGF0ZSA9IEJveChBY2NvdW50LCBrZXk9Qnl0ZXMoYiJjYW5kX2FkZHJfIikgKyBvcC5pdG9iKGlkeCkpLnZhbHVlCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDYzNjE2ZTY0NWY2MTY0NjQ3MjVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTo0MDkKICAgIC8vIGlmIGNhbmRpZGF0ZSAhPSBjcmVhdG9yIGFuZCBjYW5kaWRhdGUgIT0gd29ya2VyIGFuZCBjYW5kaWRhdGUgIT0gYXJiMToKICAgIGRpZyA4CiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAyNAogICAgZGlnIDgKICAgIGRpZyA3CiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAyNAogICAgZGlnIDgKICAgIGRpZyAxMgogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIGVzY3Jvdy5weTo0MTEKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNQogICAgZGlnIDgKICAgIGJ1cnkgMTEKCnN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBlc2Nyb3cucHk6NDEyCiAgICAvLyBpZHggPSAoaWR4ICsgMSkgJSBjb3VudAogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkaWcgNgogICAgJQogICAgYnVyeSA0CiAgICAvLyBlc2Nyb3cucHk6NDEzCiAgICAvLyBzZWFyY2hlZCA9IHNlYXJjaGVkICsgMQogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgc3VibWl0X2Rpc3B1dGVfd2hpbGVfdG9wQDE4CgpzdWJtaXRfZGlzcHV0ZV9hZnRlcl93aGlsZUAyNToKICAgIC8vIGVzY3Jvdy5weTo0MTUtNDE2CiAgICAvLyAjIFRyeSB0byBmaW5kIGFyYjMKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDUKICAgIC8vIGVzY3Jvdy5weTo0MTcKICAgIC8vIHNlYXJjaGVkID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSAzCiAgICBidXJ5IDkKCnN1Ym1pdF9kaXNwdXRlX3doaWxlX3RvcEAyNjoKICAgIC8vIGVzY3Jvdy5weTo0MTgKICAgIC8vIHdoaWxlIHNlYXJjaGVkIDwgY291bnQgYW5kIG5vdCBmb3VuZDoKICAgIGRpZyAxCiAgICBkaWcgNQogICAgPAogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQogICAgZGlnIDMKICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDM1CiAgICAvLyBlc2Nyb3cucHk6NDE5CiAgICAvLyBjYW5kaWRhdGUgPSBCb3goQWNjb3VudCwga2V5PUJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihpZHgpKS52YWx1ZQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6NDIwCiAgICAvLyBpZiBjYW5kaWRhdGUgIT0gY3JlYXRvciBhbmQgY2FuZGlkYXRlICE9IHdvcmtlciBhbmQgY2FuZGlkYXRlICE9IGFyYjEgYW5kIGNhbmRpZGF0ZSAhPSBhcmIyOgogICAgZGlnIDcKICAgICE9CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICBkaWcgNwogICAgZGlnIDYKICAgICE9CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICBkaWcgNwogICAgZGlnIDExCiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgZGlnIDcKICAgIGRpZyAxMAogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIGVzY3Jvdy5weTo0MjIKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNAogICAgZGlnIDcKICAgIGJ1cnkgOQoKc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIGVzY3Jvdy5weTo0MjMKICAgIC8vIGlkeCA9IChpZHggKyAxKSAlIGNvdW50CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGRpZyA1CiAgICAlCiAgICBidXJ5IDMKICAgIC8vIGVzY3Jvdy5weTo0MjQKICAgIC8vIHNlYXJjaGVkID0gc2VhcmNoZWQgKyAxCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBzdWJtaXRfZGlzcHV0ZV93aGlsZV90b3BAMjYKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMSAvLyAwCiAgICBiIHN1Ym1pdF9kaXNwdXRlX2Jvb2xfbWVyZ2VAOQoKc3VibWl0X2Rpc3B1dGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgc3VibWl0X2Rpc3B1dGVfYm9vbF9tZXJnZUA1CgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnZvdGVfZGlzcHV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZvdGVfZGlzcHV0ZToKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBlc2Nyb3cucHk6NDM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo0NDEKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0NDIKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ0MwogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0NDUKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRCwgIkJvdW50eSBpcyBub3QgZGlzcHV0ZWQiCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBCb3VudHkgaXMgbm90IGRpc3B1dGVkCiAgICAvLyBlc2Nyb3cucHk6NDQ2CiAgICAvLyBhc3NlcnQgdm90ZV9vcHRpb24gPT0gVUludDY0KDEpIG9yIHZvdGVfb3B0aW9uID09IFVJbnQ2NCgyKSBvciB2b3RlX29wdGlvbiA9PSBVSW50NjQoMyksICJJbnZhbGlkIHZvdGUgb3B0aW9uIgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBibnogdm90ZV9kaXNwdXRlX2Jvb2xfdHJ1ZUA0CiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYm56IHZvdGVfZGlzcHV0ZV9ib29sX3RydWVANAogICAgZHVwCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfYm9vbF9mYWxzZUA1Cgp2b3RlX2Rpc3B1dGVfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzAgLy8gMQoKdm90ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANjoKICAgIC8vIGVzY3Jvdy5weTo0NDYKICAgIC8vIGFzc2VydCB2b3RlX29wdGlvbiA9PSBVSW50NjQoMSkgb3Igdm90ZV9vcHRpb24gPT0gVUludDY0KDIpIG9yIHZvdGVfb3B0aW9uID09IFVJbnQ2NCgzKSwgIkludmFsaWQgdm90ZSBvcHRpb24iCiAgICBhc3NlcnQgLy8gSW52YWxpZCB2b3RlIG9wdGlvbgogICAgLy8gZXNjcm93LnB5OjQ0OAogICAgLy8gc2VuZGVyID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBlc2Nyb3cucHk6NDQ5CiAgICAvLyB2b3RlZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA1CiAgICAvLyBlc2Nyb3cucHk6NDUwCiAgICAvLyBpZiBzZW5kZXIgPT0gc2VsZi5hcmJpdHJhdG9yXzEudmFsdWUgYW5kIHNlbGYuYXJiaXRyYXRvcl8xX3ZvdGUudmFsdWUgPT0gVUludDY0KDApOgogICAgYnl0ZWMgMTQgLy8gImFyYml0cmF0b3JfMSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMSBleGlzdHMKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDkKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMV92b3RlIGV4aXN0cwogICAgYnRvaQogICAgYm56IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAOQogICAgLy8gZXNjcm93LnB5OjQ1MQogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzFfdm90ZS52YWx1ZSA9IHZvdGVfb3B0aW9uCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0NTIKICAgIC8vIHZvdGVkID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNAoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBlc2Nyb3cucHk6NDYwCiAgICAvLyBhc3NlcnQgdm90ZWQsICJTZW5kZXIgaXMgbm90IGFuIGFzc2lnbmVkIGFyYml0cmF0b3Igd2l0aCBhIHBlbmRpbmcgdm90ZSIKICAgIGRpZyAzCiAgICBhc3NlcnQgLy8gU2VuZGVyIGlzIG5vdCBhbiBhc3NpZ25lZCBhcmJpdHJhdG9yIHdpdGggYSBwZW5kaW5nIHZvdGUKICAgIC8vIGVzY3Jvdy5weTo0NjIKICAgIC8vIGxvZyhCeXRlcyhiImFyYml0cmF0b3Jfdm90ZWQiKSkKICAgIHB1c2hieXRlcyAweDYxNzI2MjY5NzQ3MjYxNzQ2ZjcyNWY3NjZmNzQ2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0NjMKICAgIC8vIGxvZyhzZW5kZXIuYnl0ZXMpCiAgICBzd2FwCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0NjQKICAgIC8vIGxvZyhvcC5pdG9iKHZvdGVfb3B0aW9uKSkKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQ2Ni00NjcKICAgIC8vICMgQ2hlY2sgY29uc2Vuc3VzCiAgICAvLyB2MSA9IHNlbGYuYXJiaXRyYXRvcl8xX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMV92b3RlIGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICAvLyBlc2Nyb3cucHk6NDY4CiAgICAvLyB2MiA9IHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE4IC8vICJhcmJpdHJhdG9yXzJfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMl92b3RlIGV4aXN0cwogICAgYnRvaQogICAgYnVyeSA2CiAgICAvLyBlc2Nyb3cucHk6NDY5CiAgICAvLyB2MyA9IHNlbGYuYXJiaXRyYXRvcl8zX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE5IC8vICJhcmJpdHJhdG9yXzNfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfM192b3RlIGV4aXN0cwogICAgYnRvaQogICAgYnVyeSA1CiAgICAvLyBlc2Nyb3cucHk6NDcxCiAgICAvLyBjb25zZW5zdXNfb3B0aW9uID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA4CiAgICAvLyBlc2Nyb3cucHk6NDcyCiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCkgYW5kIHYxID09IHYyOgogICAgYnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyMAogICAgZHVwCiAgICBkaWcgNQogICAgPT0KICAgIGJ6IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjAKICAgIGJ1cnkgNgoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBlc2Nyb3cucHk6NDgxCiAgICAvLyBpZiBjb25zZW5zdXNfb3B0aW9uICE9IFVJbnQ2NCgwKToKICAgIGRpZyA1CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gZXNjcm93LnB5OjQ4NQogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNSAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo4MwogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDYgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weTo0ODcKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF92ZXJpZnlfZXNjcm93X2JhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTo0ODkKICAgIC8vIGZlZV9hcmJpdHJhdGlvbiA9IGVzY3Jvd19hbW91bnQgKiA1IC8vIDEwMDAwCiAgICBwdXNoaW50IDUKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weTo0OTEKICAgIC8vIHYxID0gc2VsZi5hcmJpdHJhdG9yXzFfdm90ZS52YWx1ZQogICAgYnl0ZWMgMTcgLy8gImFyYml0cmF0b3JfMV92b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8xX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weTo0OTIKICAgIC8vIHYyID0gc2VsZi5hcmJpdHJhdG9yXzJfdm90ZS52YWx1ZQogICAgYnl0ZWMgMTggLy8gImFyYml0cmF0b3JfMl92b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBidXJ5IDkKICAgIC8vIGVzY3Jvdy5weTo0OTMKICAgIC8vIHYzID0gc2VsZi5hcmJpdHJhdG9yXzNfdm90ZS52YWx1ZQogICAgYnl0ZWMgMTkgLy8gImFyYml0cmF0b3JfM192b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8zX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIGVzY3Jvdy5weTo0OTUKICAgIC8vIHZvdGVkX2NvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA2CiAgICAvLyBlc2Nyb3cucHk6NDk2CiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCk6CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gZXNjcm93LnB5OjQ5NwogICAgLy8gdm90ZWRfY291bnQgPSB2b3RlZF9jb3VudCArIDEKICAgIGludGNfMCAvLyAxCiAgICBidXJ5IDUKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDM4OgogICAgLy8gZXNjcm93LnB5OjQ5OAogICAgLy8gaWYgdjIgIT0gVUludDY0KDApOgogICAgZGlnIDcKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBlc2Nyb3cucHk6NDk5CiAgICAvLyB2b3RlZF9jb3VudCA9IHZvdGVkX2NvdW50ICsgMQogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDUKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gZXNjcm93LnB5OjUwMAogICAgLy8gaWYgdjMgIT0gVUludDY0KDApOgogICAgZGlnIDYKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQyCiAgICAvLyBlc2Nyb3cucHk6NTAxCiAgICAvLyB2b3RlZF9jb3VudCA9IHZvdGVkX2NvdW50ICsgMQogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDUKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gZXNjcm93LnB5OjUwMwogICAgLy8gZmVlX3Blcl9hcmJpdHJhdG9yID0gZmVlX2FyYml0cmF0aW9uIC8vIHZvdGVkX2NvdW50CiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gZXNjcm93LnB5OjUwNAogICAgLy8gYWN0dWFsX2FyYml0cmF0aW9uX3BheW91dCA9IGZlZV9wZXJfYXJiaXRyYXRvciAqIHZvdGVkX2NvdW50CiAgICAqCiAgICBjb3ZlciAyCiAgICAvLyBlc2Nyb3cucHk6NTA2LTUwNwogICAgLy8gIyBQYXkgcGxhdGZvcm0gZmVlIHNwbGl0IChyb3lhbHR5ICsgdHJlYXN1cnkgKyBtZWRpYXRvcikgdGhlbiBhcmJpdHJhdG9ycwogICAgLy8gaWYgY29uc2Vuc3VzX29wdGlvbiA9PSBVSW50NjQoMSk6CiAgICBkaWcgOQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDUwCiAgICAvLyBlc2Nyb3cucHk6NTA5CiAgICAvLyBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICAvLyBlc2Nyb3cucHk6NTEwCiAgICAvLyBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIGJ5dGVjIDQgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBBZGRyZXNzIGxlbmd0aCBpcyAzMiBieXRlcwogICAgLy8gZXNjcm93LnB5OjUwOC01MTEKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBzZWxmLl9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIC8vICAgICBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIC8vICkKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9mZWVfc3BsaXQKICAgIC8vIGVzY3Jvdy5weTo1MTIKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSByZW1haW5pbmdfYW1vdW50IC0gYWN0dWFsX2FyYml0cmF0aW9uX3BheW91dAogICAgdW5jb3ZlciAzCiAgICAtCiAgICAvLyBlc2Nyb3cucHk6NTEzCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUEFZT1VUKQogICAgYnl0ZWNfMiAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMjEgLy8gMHg1MDQxNTk0ZjU1NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1MTQKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTE2LTUxNwogICAgLy8gIyBQYXkgdm90aW5nIGFyYml0cmF0b3JzCiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCk6CiAgICB1bmNvdmVyIDIKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQ1CiAgICAvLyBlc2Nyb3cucHk6NTE4CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmFyYml0cmF0b3JfMS52YWx1ZSwgZmVlX3Blcl9hcmJpdHJhdG9yLCBhc3NldF9pZCkKICAgIGJ5dGVjIDE0IC8vICJhcmJpdHJhdG9yXzEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzEgZXhpc3RzCiAgICBkaWcgNwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0Cgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIGVzY3Jvdy5weTo1MTkKICAgIC8vIGlmIHYyICE9IFVJbnQ2NCgwKToKICAgIGRpZyA1CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gZXNjcm93LnB5OjUyMAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUsIGZlZV9wZXJfYXJiaXRyYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyAxNSAvLyAiYXJiaXRyYXRvcl8yIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yIGV4aXN0cwogICAgZGlnIDcKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBlc2Nyb3cucHk6NTIxCiAgICAvLyBpZiB2MyAhPSBVSW50NjQoMCk6CiAgICBkaWcgNAogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANDkKICAgIC8vIGVzY3Jvdy5weTo1MjIKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuYXJiaXRyYXRvcl8zLnZhbHVlLCBmZWVfcGVyX2FyYml0cmF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgMTYgLy8gImFyYml0cmF0b3JfMyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMyBleGlzdHMKICAgIGRpZyA3CiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQ5OgogICAgLy8gZXNjcm93LnB5OjUyNAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgcmVtYWluaW5nX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjUyNQogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV9yZXNvbHZlZF9hZ2VudF93aW4iKSkKICAgIGJ5dGVjIDMyIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYxNjc2NTZlNzQ1Zjc3Njk2ZQogICAgbG9nCgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIGVzY3Jvdy5weTo0MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA1MDoKICAgIC8vIGVzY3Jvdy5weTo1MjYKICAgIC8vIGVsaWYgY29uc2Vuc3VzX29wdGlvbiA9PSBVSW50NjQoMik6CiAgICBkaWcgOQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDU4CiAgICAvLyBlc2Nyb3cucHk6NTI4CiAgICAvLyBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6NTI5CiAgICAvLyBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIGJ5dGVjIDQgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBBZGRyZXNzIGxlbmd0aCBpcyAzMiBieXRlcwogICAgLy8gZXNjcm93LnB5OjUyNy01MzAKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBzZWxmLl9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICAvLyAgICAgQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDUKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX3NlbmRfZmVlX3NwbGl0CiAgICAvLyBlc2Nyb3cucHk6NTMxCiAgICAvLyByZW1haW5pbmdfYW1vdW50ID0gcmVtYWluaW5nX2Ftb3VudCAtIGFjdHVhbF9hcmJpdHJhdGlvbl9wYXlvdXQKICAgIHVuY292ZXIgMwogICAgLQogICAgLy8gZXNjcm93LnB5OjUzMgogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFJFRlVORCkKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIyIC8vIDB4NTI0NTQ2NTU0ZTQ0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTMzCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjUzNS01MzYKICAgIC8vICMgUGF5IHZvdGluZyBhcmJpdHJhdG9ycwogICAgLy8gaWYgdjEgIT0gVUludDY0KDApOgogICAgdW5jb3ZlciAyCiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA1MwogICAgLy8gZXNjcm93LnB5OjUzNwogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5hcmJpdHJhdG9yXzEudmFsdWUsIGZlZV9wZXJfYXJiaXRyYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyAxNCAvLyAiYXJiaXRyYXRvcl8xIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8xIGV4aXN0cwogICAgZGlnIDcKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANTM6CiAgICAvLyBlc2Nyb3cucHk6NTM4CiAgICAvLyBpZiB2MiAhPSBVSW50NjQoMCk6CiAgICBkaWcgNQogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANTUKICAgIC8vIGVzY3Jvdy5weTo1MzkKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuYXJiaXRyYXRvcl8yLnZhbHVlLCBmZWVfcGVyX2FyYml0cmF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgMTUgLy8gImFyYml0cmF0b3JfMiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMiBleGlzdHMKICAgIGRpZyA3CiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDU1OgogICAgLy8gZXNjcm93LnB5OjU0MAogICAgLy8gaWYgdjMgIT0gVUludDY0KDApOgogICAgZGlnIDQKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDU3CiAgICAvLyBlc2Nyb3cucHk6NTQxCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmFyYml0cmF0b3JfMy52YWx1ZSwgZmVlX3Blcl9hcmJpdHJhdG9yLCBhc3NldF9pZCkKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzMiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzMgZXhpc3RzCiAgICBkaWcgNwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0Cgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA1NzoKICAgIC8vIGVzY3Jvdy5weTo1NDMKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1NDQKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfY3JlYXRvcl93aW4iKSkKICAgIGJ5dGVjIDMzIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYzNzI2NTYxNzQ2ZjcyNWY3NzY5NmUKICAgIGxvZwogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA1ODoKICAgIC8vIGVzY3Jvdy5weTo1NDcKICAgIC8vIHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTo1NDgKICAgIC8vIEFjY291bnQoc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMpLAogICAgYnl0ZWMgNCAvLyAibWVkaWF0b3JfZGF0YSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1lZGlhdG9yX2RhdGEgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIEFkZHJlc3MgbGVuZ3RoIGlzIDMyIGJ5dGVzCiAgICAvLyBlc2Nyb3cucHk6NTQ2LTU0OQogICAgLy8gcmVtYWluaW5nX2Ftb3VudCA9IHNlbGYuX3NlbmRfZmVlX3NwbGl0KAogICAgLy8gICAgIHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIC8vICAgICBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIC8vICkKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9mZWVfc3BsaXQKICAgIC8vIGVzY3Jvdy5weTo1NTAKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSByZW1haW5pbmdfYW1vdW50IC0gYWN0dWFsX2FyYml0cmF0aW9uX3BheW91dAogICAgdW5jb3ZlciAzCiAgICAtCiAgICAvLyBlc2Nyb3cucHk6NTUxCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoU1BMSVQpCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMiAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAzNCAvLyAweDUzNTA0YzQ5NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1NTIKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTU0LTU1NQogICAgLy8gIyBQYXkgdm90aW5nIGFyYml0cmF0b3JzCiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCk6CiAgICB1bmNvdmVyIDIKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDYwCiAgICAvLyBlc2Nyb3cucHk6NTU2CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmFyYml0cmF0b3JfMS52YWx1ZSwgZmVlX3Blcl9hcmJpdHJhdG9yLCBhc3NldF9pZCkKICAgIGJ5dGVjIDE0IC8vICJhcmJpdHJhdG9yXzEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzEgZXhpc3RzCiAgICBkaWcgNwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0Cgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA2MDoKICAgIC8vIGVzY3Jvdy5weTo1NTcKICAgIC8vIGlmIHYyICE9IFVJbnQ2NCgwKToKICAgIGRpZyA1CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA2MgogICAgLy8gZXNjcm93LnB5OjU1OAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUsIGZlZV9wZXJfYXJiaXRyYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyAxNSAvLyAiYXJiaXRyYXRvcl8yIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yIGV4aXN0cwogICAgZGlnIDcKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANjI6CiAgICAvLyBlc2Nyb3cucHk6NTU5CiAgICAvLyBpZiB2MyAhPSBVSW50NjQoMCk6CiAgICBkaWcgNAogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANjQKICAgIC8vIGVzY3Jvdy5weTo1NjAKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuYXJiaXRyYXRvcl8zLnZhbHVlLCBmZWVfcGVyX2FyYml0cmF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgMTYgLy8gImFyYml0cmF0b3JfMyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMyBleGlzdHMKICAgIGRpZyA3CiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDY0OgogICAgLy8gZXNjcm93LnB5OjU2MgogICAgLy8gaGFsZl9hbW91bnQgPSByZW1haW5pbmdfYW1vdW50IC8vIDIKICAgIGludGNfMiAvLyAyCiAgICAvCiAgICAvLyBlc2Nyb3cucHk6NTYzCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgaGFsZl9hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZGlnIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjU2NAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgaGFsZl9hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1NjUKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfc3BsaXQiKSkKICAgIHB1c2hieXRlcyAweDY0Njk3MzcwNzU3NDY1NWY3MjY1NzM2ZjZjNzY2NTY0NWY3MzcwNmM2OTc0CiAgICBsb2cKICAgIGIgdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzUKCnZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjA6CiAgICAvLyBlc2Nyb3cucHk6NDc0CiAgICAvLyBlbGlmIHYxICE9IFVJbnQ2NCgwKSBhbmQgdjEgPT0gdjM6CiAgICBkdXAKICAgIGJ6IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjMKICAgIGR1cAogICAgZGlnIDQKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDIzCiAgICBidXJ5IDYKICAgIGIgdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzMKCnZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjM6CiAgICAvLyBlc2Nyb3cucHk6NDc2CiAgICAvLyBlbGlmIHYyICE9IFVJbnQ2NCgwKSBhbmQgdjIgPT0gdjM6CiAgICBkaWcgNAogICAgYnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyNgogICAgZGlnIDQKICAgIGRpZyA0CiAgICA9PQogICAgYnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyNgogICAgcG9wCiAgICBkaWcgMwogICAgYnVyeSA2CiAgICBiIHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCgp2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDI2OgogICAgLy8gZXNjcm93LnB5OjQ3OAogICAgLy8gZWxpZiB2MSAhPSBVSW50NjQoMCkgYW5kIHYyICE9IFVJbnQ2NCgwKSBhbmQgdjMgIT0gVUludDY0KDApOgogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIGRpZyAzCiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgZGlnIDIKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBlc2Nyb3cucHk6NDc5CiAgICAvLyBjb25zZW5zdXNfb3B0aW9uID0gVUludDY0KDMpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgNgogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA5OgogICAgLy8gZXNjcm93LnB5OjQ1MwogICAgLy8gZWxpZiBzZW5kZXIgPT0gc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUgYW5kIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUgPT0gVUludDY0KDApOgogICAgYnl0ZWMgMTUgLy8gImFyYml0cmF0b3JfMiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMiBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAxMgogICAgYnl0ZWMgMTggLy8gImFyYml0cmF0b3JfMl92b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBibnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAxMgogICAgLy8gZXNjcm93LnB5OjQ1NAogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzJfdm90ZS52YWx1ZSA9IHZvdGVfb3B0aW9uCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDE4IC8vICJhcmJpdHJhdG9yXzJfdm90ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0NTUKICAgIC8vIHZvdGVkID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNAogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNwoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAxMjoKICAgIC8vIGVzY3Jvdy5weTo0NTYKICAgIC8vIGVsaWYgc2VuZGVyID09IHNlbGYuYXJiaXRyYXRvcl8zLnZhbHVlIGFuZCBzZWxmLmFyYml0cmF0b3JfM192b3RlLnZhbHVlID09IFVJbnQ2NCgwKToKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzMiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzMgZXhpc3RzCiAgICBkaWcgMgogICAgPT0KICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDE3CiAgICBieXRlYyAxOSAvLyAiYXJiaXRyYXRvcl8zX3ZvdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzNfdm90ZSBleGlzdHMKICAgIGJ0b2kKICAgIGJueiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gZXNjcm93LnB5OjQ1NwogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzNfdm90ZS52YWx1ZSA9IHZvdGVfb3B0aW9uCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDE5IC8vICJhcmJpdHJhdG9yXzNfdm90ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0NTgKICAgIC8vIHZvdGVkID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNAogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNwoKdm90ZV9kaXNwdXRlX2Jvb2xfZmFsc2VANToKICAgIGludGNfMSAvLyAwCiAgICBiIHZvdGVfZGlzcHV0ZV9ib29sX21lcmdlQDYKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QucmVzb2x2ZV9kaXNwdXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVzb2x2ZV9kaXNwdXRlOgogICAgLy8gZXNjcm93LnB5OjU2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gZXNjcm93LnB5OjU2OQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjU3MAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTcxCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjU3MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IERJU1BVVEVECiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjU3NAogICAgLy8gYXNzZXJ0IHJlc29sdXRpb24gPT0gQnl0ZXMoYiJhZ2VudF93aW4iKSBvciByZXNvbHV0aW9uID09IEJ5dGVzKGIiY3JlYXRvcl93aW4iKQogICAgcHVzaGJ5dGVzIDB4NjE2NzY1NmU3NDVmNzc2OTZlCiAgICA9PQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBibnogcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfdHJ1ZUAzCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4NjM3MjY1NjE3NDZmNzI1Zjc3Njk2ZQogICAgPT0KICAgIGJ6IHJlc29sdmVfZGlzcHV0ZV9ib29sX2ZhbHNlQDQKCnJlc29sdmVfZGlzcHV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMCAvLyAxCgpyZXNvbHZlX2Rpc3B1dGVfYm9vbF9tZXJnZUA1OgogICAgLy8gZXNjcm93LnB5OjU3NAogICAgLy8gYXNzZXJ0IHJlc29sdXRpb24gPT0gQnl0ZXMoYiJhZ2VudF93aW4iKSBvciByZXNvbHV0aW9uID09IEJ5dGVzKGIiY3JlYXRvcl93aW4iKQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTc1CiAgICAvLyBhc3NlcnQgbWVkaWF0b3Jfc2lnbmF0dXJlLmxlbmd0aCA+IDAKICAgIGR1cAogICAgbGVuCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1NzctNTc4CiAgICAvLyAjIENyeXB0b2dyYXBoaWNhbGx5IHZlcmlmeSBtZWRpYXRvciBzaWduYXR1cmUKICAgIC8vIG1lZGlhdG9yX2FkZHIgPSBzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcwogICAgYnl0ZWMgNCAvLyAibWVkaWF0b3JfZGF0YSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1lZGlhdG9yX2RhdGEgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIGVzY3Jvdy5weTo1NzkKICAgIC8vIG1lc3NhZ2UgPSBvcC5pdG9iKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkKSArIHJlc29sdXRpb24KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGVzY3Jvdy5weTo1ODAKICAgIC8vIGFzc2VydCBvcC5lZDI1NTE5dmVyaWZ5KG1lc3NhZ2UsIG1lZGlhdG9yX3NpZ25hdHVyZSwgbWVkaWF0b3JfYWRkciksICJJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZSIKICAgIGNvdmVyIDIKICAgIGVkMjU1MTl2ZXJpZnkKICAgIGFzc2VydCAvLyBJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZQogICAgLy8gZXNjcm93LnB5OjU4MgogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNSAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo4MwogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDYgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gZXNjcm93LnB5OjU4NAogICAgLy8gc2VsZi5fdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKGFzc2V0X2lkLCBlc2Nyb3dfYW1vdW50KQogICAgY2FsbHN1YiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6NTg2CiAgICAvLyBpZiByZXNvbHV0aW9uID09IEJ5dGVzKGIiYWdlbnRfd2luIik6CiAgICB1bmNvdmVyIDIKICAgIGJ6IHJlc29sdmVfZGlzcHV0ZV9lbHNlX2JvZHlANwogICAgLy8gZXNjcm93LnB5OjU4NwogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFBBWU9VVCkKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIxIC8vIDB4NTA0MTU5NGY1NTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTg4CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjU5MAogICAgLy8gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjU5MQogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTo1ODktNTkyCiAgICAvLyByZW1haW5pbmdfYW1vdW50ID0gc2VsZi5fc2VuZF9mZWVfc3BsaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICAvLyAgICAgQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgX3NlbmRfZmVlX3NwbGl0CiAgICAvLyBlc2Nyb3cucHk6NTkzCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NTk0CiAgICAvLyBsb2coQnl0ZXMoYiJkaXNwdXRlX3Jlc29sdmVkX2FnZW50X3dpbiIpKQogICAgYnl0ZWMgMzIgLy8gMHg2NDY5NzM3MDc1NzQ2NTVmNzI2NTczNmY2Yzc2NjU2NDVmNjE2NzY1NmU3NDVmNzc2OTZlCiAgICBsb2cKCnJlc29sdmVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBlc2Nyb3cucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJlc29sdmVfZGlzcHV0ZV9lbHNlX2JvZHlANzoKICAgIC8vIGVzY3Jvdy5weTo1OTYKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMiAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAyMiAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjU5NwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1OTkKICAgIC8vIHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTo2MDAKICAgIC8vIEFjY291bnQoc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMpLAogICAgYnl0ZWMgNCAvLyAibWVkaWF0b3JfZGF0YSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1lZGlhdG9yX2RhdGEgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIEFkZHJlc3MgbGVuZ3RoIGlzIDMyIGJ5dGVzCiAgICAvLyBlc2Nyb3cucHk6NTk4LTYwMQogICAgLy8gcmVtYWluaW5nX2Ftb3VudCA9IHNlbGYuX3NlbmRfZmVlX3NwbGl0KAogICAgLy8gICAgIHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCwKICAgIC8vICAgICBBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwKICAgIC8vICkKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9mZWVfc3BsaXQKICAgIC8vIGVzY3Jvdy5weTo2MDIKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo2MDMKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfY3JlYXRvcl93aW4iKSkKICAgIGJ5dGVjIDMzIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYzNzI2NTYxNzQ2ZjcyNWY3NzY5NmUKICAgIGxvZwogICAgYiByZXNvbHZlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA4CgpyZXNvbHZlX2Rpc3B1dGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5hdXRvX3Jlc29sdmVfY3JlYXRvcl93aW5bcm91dGluZ10oKSAtPiB2b2lkOgphdXRvX3Jlc29sdmVfY3JlYXRvcl93aW46CiAgICAvLyBlc2Nyb3cucHk6NjA3CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjA4CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MTAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MTIKICAgIC8vIGNyZWF0ZWRfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAyNyAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo2MTQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAvLyBlc2Nyb3cucHk6NjEzCiAgICAvLyB0aW1lb3V0ID0gVUludDY0KDE0ICogMjQgKiA2MCAqIDYwKSAgIyAxNCBkYXlzCiAgICBwdXNoaW50IDEyMDk2MDAKICAgIC8vIGVzY3Jvdy5weTo2MTQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICArCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MTYKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMiAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAyMiAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjYxNwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo2MTkKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2MjEKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjYyNAogICAgLy8gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkLAogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgLy8gZXNjcm93LnB5OjYyNQogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTo2MjMtNjI2CiAgICAvLyBzZWxmLl9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICAvLyAgICAgQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICAvLyApCiAgICBzd2FwCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9mZWVfc3BsaXQKICAgIHBvcAogICAgLy8gZXNjcm93LnB5OjYyNwogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo2MjkKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfYXV0b19yZXNvbHZlZF9jcmVhdG9yX3dpbiIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjYxNzU3NDZmNWY3MjY1NzM2ZjZjNzY2NTY0NWY2MzcyNjU2MTc0NmY3MjVmNzc2OTZlCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo2MDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC50aW1lb3V0X2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgp0aW1lb3V0X2Rpc3B1dGU6CiAgICAvLyBlc2Nyb3cucHk6NjMzCiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjM0CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MzYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MzgKICAgIC8vIGRpc3B1dGVfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAyNyAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo2MzkKICAgIC8vIGRpc3B1dGVfdGltZW91dCA9IFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkRJU1BVVEVfVElNRU9VVCIpCiAgICBpbnRjIDYgLy8gVE1QTF9ESVNQVVRFX1RJTUVPVVQKICAgIC8vIGVzY3Jvdy5weTo2NDAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGRpc3B1dGVfdHMgKyBkaXNwdXRlX3RpbWVvdXQsICJEaXNwdXRlIHRpbWVvdXQgbm90IHlldCByZWFjaGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgY292ZXIgMgogICAgKwogICAgPgogICAgYXNzZXJ0IC8vIERpc3B1dGUgdGltZW91dCBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo2NDIKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2NDQKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjY0NgogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFNQTElUKQogICAgYnl0ZWNfMiAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMzQgLy8gMHg1MzUwNGM0OTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NjQ3CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjY1MQogICAgLy8gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkLAogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgLy8gZXNjcm93LnB5OjY1MgogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTo2NDktNjUzCiAgICAvLyAjIFNwbGl0IHBsYXRmb3JtIGZlZTsgcmVtYWluZGVyIHNwbGl0IGJldHdlZW4gY3JlYXRvciBhbmQgYWdlbnQKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBzZWxmLl9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICAvLyAgICAgQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX3NlbmRfZmVlX3NwbGl0CiAgICAvLyBlc2Nyb3cucHk6NjU0CiAgICAvLyBoYWxmX2Ftb3VudCA9IHJlbWFpbmluZ19hbW91bnQgLy8gMgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo2NTUKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NjU2CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjY1OAogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV90aW1lb3V0X3NwbGl0IikpCiAgICBwdXNoYnl0ZXMgMHg2NDY5NzM3MDc1NzQ2NTVmNzQ2OTZkNjU2Zjc1NzQ1ZjczNzA2YzY5NzQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjYzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmF1dG9fcmVsZWFzZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmF1dG9fcmVsZWFzZToKICAgIC8vIGVzY3Jvdy5weTo2NjIKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2NjMKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY2NQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojg3CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuaXNfaGl0bS5tYXliZSgpCiAgICBieXRlYyAyMCAvLyAiaXNfaGl0bSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4OAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjY2NgogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9pc19oaXRtKCkgPT0gMQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2NjgKICAgIC8vIGRlYWRsaW5lID0gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUKICAgIGJ5dGVjIDI2IC8vICJyZXZpZXdfZGVhZGxpbmUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXZpZXdfZGVhZGxpbmUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NjY5CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gZGVhZGxpbmUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2NzEKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2NzMKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjY3NQogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFBBWU9VVCkKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIxIC8vIDB4NTA0MTU5NGY1NTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Njc2CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjY4MAogICAgLy8gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjY4MQogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTo2NzgtNjgyCiAgICAvLyAjIFNwbGl0IHBsYXRmb3JtIGZlZTsgcmVtYWluZGVyIHRvIGFnZW50CiAgICAvLyByZW1haW5pbmdfYW1vdW50ID0gc2VsZi5fc2VuZF9mZWVfc3BsaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQsCiAgICAvLyAgICAgQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICAvLyApCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgX3NlbmRfZmVlX3NwbGl0CiAgICAvLyBlc2Nyb3cucHk6NjgzCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6Njg1CiAgICAvLyBsb2coQnl0ZXMoYiJhdXRvX3JlbGVhc2VkX2hpdG0iKSkKICAgIHB1c2hieXRlcyAweDYxNzU3NDZmNWY3MjY1NmM2NTYxNzM2NTY0NWY2ODY5NzQ2ZAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuY2xhaW1fYWJhbmRvbmVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fYWJhbmRvbmVkOgogICAgLy8gZXNjcm93LnB5OjY4OQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY5MAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjkxCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY5MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFJFSkVDVEVECiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojk5CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYucmVqZWN0aW9uX2NvdW50Lm1heWJlKCkKICAgIGJ5dGVjIDcgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weToxMDAKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2OTQKICAgIC8vIGFzc2VydCBzZWxmLl9nZXRfcmVqZWN0aW9uX2NvdW50KCkgPj0gTUFYX1JFSkVDVElPTlMKICAgIHB1c2hpbnQgMwogICAgPj0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY5NQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2OTcKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2OTkKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjcwMQogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFJFRlVORCkKICAgIGJ5dGVjXzIgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18yIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIyIC8vIDB4NTI0NTQ2NTU0ZTQ0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NzAyCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjcwNgogICAgLy8gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkLAogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgLy8gZXNjcm93LnB5OjcwNwogICAgLy8gQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksCiAgICBieXRlYyA0IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gQWRkcmVzcyBsZW5ndGggaXMgMzIgYnl0ZXMKICAgIC8vIGVzY3Jvdy5weTo3MDQtNzA4CiAgICAvLyAjIFNwbGl0IHBsYXRmb3JtIGZlZTsgcmVtYWluZGVyIHRvIGNyZWF0b3IgKGRlZHVwZWQpCiAgICAvLyByZW1haW5pbmdfYW1vdW50ID0gc2VsZi5fc2VuZF9mZWVfc3BsaXQoCiAgICAvLyAgICAgc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkLAogICAgLy8gICAgIEFjY291bnQoc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMpLAogICAgLy8gKQogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9zZW5kX2ZlZV9zcGxpdAogICAgLy8gZXNjcm93LnB5OjcwOQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjcxMQogICAgLy8gbG9nKEJ5dGVzKGIiYWJhbmRvbmVkX3JlZnVuZGVkX2NyZWF0b3IiKSkKICAgIHB1c2hieXRlcyAweDYxNjI2MTZlNjQ2ZjZlNjU2NDVmNzI2NTY2NzU2ZTY0NjU2NDVmNjM3MjY1NjE3NDZmNzIKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjY4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmV4cGlyZV9jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4cGlyZV9jbGFpbToKICAgIC8vIGVzY3Jvdy5weTo3MTUKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MTYKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjcxOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IENMQUlNRUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MjAKICAgIC8vIGNsYWltX2RlYWRsaW5lID0gc2VsZi5jbGFpbV9kZWFkbGluZS52YWx1ZQogICAgYnl0ZWMgMzAgLy8gImNsYWltX2RlYWRsaW5lIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhaW1fZGVhZGxpbmUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzIxCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBjbGFpbV9kZWFkbGluZSwgIkNsYWltIGRlYWRsaW5lIG5vdCB5ZXQgcmVhY2hlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDwKICAgIGFzc2VydCAvLyBDbGFpbSBkZWFkbGluZSBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo3MjMtNzI0CiAgICAvLyAjIFJlY29yZCBjbGFpbSBleHBpcnkKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMQUlNX0VYUElSRUQpCiAgICBwdXNoaW50IDcKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjcyNQogICAgLy8gbG9nKEJ5dGVzKGIiY2xhaW1fZXhwaXJlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjM2YzYxNjk2ZDVmNjU3ODcwNjk3MjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcyNgogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTIgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcyNwogICAgLy8gbG9nKHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCkuYnl0ZXMpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzI4CiAgICAvLyBsb2coQnl0ZXMoYiJrYXJtYV9wZW5hbHR5XzIwIikpCiAgICBwdXNoYnl0ZXMgMHg2YjYxNzI2ZDYxNWY3MDY1NmU2MTZjNzQ3OTVmMzIzMAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzMwLTczMQogICAgLy8gIyBTRUNVUklUWSBGSVg6IFJldmVydCBhZ2VudCBhZGRyZXNzIHRvIHplcm8gYWRkcmVzcyBzbyBzb21lb25lIGVsc2UgY2FuIGNsYWltCiAgICAvLyBzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUgPSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICBieXRlYyA5IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3MzMtNzM0CiAgICAvLyAjIFJldmVydCB0byBPUEVOIHNvIG90aGVycyBjYW4gY2xhaW0KICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KE9QRU4pCiAgICBpbnRjXzEgLy8gMAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjczNQogICAgLy8gc2VsZi5yZWplY3Rpb25fY291bnQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3MzcKICAgIC8vIGxvZyhCeXRlcyhiImJvdW50eV9yZW9wZW5lZCIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY3MjY1NmY3MDY1NmU2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5naXRodWJfdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2l0aHViX3ZlcmlmeToKICAgIC8vIGVzY3Jvdy5weTo3MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5Ojc0MQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc0MgogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzQzCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc0NQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc0Ny03NDgKICAgIC8vICMgU3RvcmUgR2l0SHViIHZlcmlmaWNhdGlvbiBkYXRhCiAgICAvLyBzZWxmLnByb29mX3VybC52YWx1ZSA9IHByX3VybAogICAgYnl0ZWMgMTAgLy8gInByb29mX3VybCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTAgLy8gInByb29mX3VybCIKICAgIHVuY292ZXIgMwogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc0OQogICAgLy8gc2VsZi5naXRodWJfc3RhdHVzLnZhbHVlID0gQnl0ZXMoYiJwZW5kaW5nIikKICAgIGJ5dGVjIDIzIC8vICJnaXRodWJfc3RhdHVzIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyMyAvLyAiZ2l0aHViX3N0YXR1cyIKICAgIGJ5dGVjIDI4IC8vIDB4NzA2NTZlNjQ2OTZlNjcKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3NTEtNzUyCiAgICAvLyAjIFN0b3JlIHRlc3QgaGFzaCBpbiBwcm9vZl9kYXRhCiAgICAvLyBzZWxmLnByb29mX2RhdGEudmFsdWUgPSB0ZXN0X2hhc2gKICAgIGJ5dGVjIDExIC8vICJwcm9vZl9kYXRhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfZGF0YSIKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc1NC03NTUKICAgIC8vICMgU3RvcmUgT0lEQyB0b2tlbgogICAgLy8gc2VsZi5vaWRjX3Rva2VuLnZhbHVlID0gb2lkY190b2tlbgogICAgYnl0ZWMgMzUgLy8gIm9pZGNfdG9rZW4iCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDM1IC8vICJvaWRjX3Rva2VuIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc1NwogICAgLy8gbG9nKEJ5dGVzKGIiZ2l0aHViX3ZlcmlmaWVkIikpCiAgICBwdXNoYnl0ZXMgMHg2NzY5NzQ2ODc1NjI1Zjc2NjU3MjY5NjY2OTY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc1OAogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTIgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc1OQogICAgLy8gbG9nKEJ5dGVzKGIicGVuZGluZyIpKQogICAgYnl0ZWMgMjggLy8gMHg3MDY1NmU2NDY5NmU2NwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3Quc2V0X2dpdGh1Yl9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfZ2l0aHViX3N0YXR1czoKICAgIC8vIGVzY3Jvdy5weTo3NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gZXNjcm93LnB5Ojc2MwogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc2NAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzY1CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc2NwogICAgLy8gYXNzZXJ0IHN0YXR1cyA9PSBCeXRlcyhiInBhc3MiKSBvciBzdGF0dXMgPT0gQnl0ZXMoYiJmYWlsIikgb3Igc3RhdHVzID09IEJ5dGVzKGIicGVuZGluZyIpCiAgICBwdXNoYnl0ZXMgMHg3MDYxNzM3MwogICAgPT0KICAgIGJueiBzZXRfZ2l0aHViX3N0YXR1c19ib29sX3RydWVANAogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHg2NjYxNjk2YwogICAgPT0KICAgIGJueiBzZXRfZ2l0aHViX3N0YXR1c19ib29sX3RydWVANAogICAgZHVwCiAgICBieXRlYyAyOCAvLyAweDcwNjU2ZTY0Njk2ZTY3CiAgICA9PQogICAgYnogc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF9mYWxzZUA1CgpzZXRfZ2l0aHViX3N0YXR1c19ib29sX3RydWVANDoKICAgIGludGNfMCAvLyAxCgpzZXRfZ2l0aHViX3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBlc2Nyb3cucHk6NzY3CiAgICAvLyBhc3NlcnQgc3RhdHVzID09IEJ5dGVzKGIicGFzcyIpIG9yIHN0YXR1cyA9PSBCeXRlcyhiImZhaWwiKSBvciBzdGF0dXMgPT0gQnl0ZXMoYiJwZW5kaW5nIikKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc2OQogICAgLy8gc2VsZi5naXRodWJfc3RhdHVzLnZhbHVlID0gc3RhdHVzCiAgICBieXRlYyAyMyAvLyAiZ2l0aHViX3N0YXR1cyIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjMgLy8gImdpdGh1Yl9zdGF0dXMiCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc3MQogICAgLy8gbG9nKEJ5dGVzKGIiZ2l0aHViX3N0YXR1c191cGRhdGVkIikpCiAgICBwdXNoYnl0ZXMgMHg2NzY5NzQ2ODc1NjI1ZjczNzQ2MTc0NzU3MzVmNzU3MDY0NjE3NDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc3MgogICAgLy8gbG9nKHN0YXR1cykKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpzZXRfZ2l0aHViX3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzEgLy8gMAogICAgYiBzZXRfZ2l0aHViX3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuZ2V0X2JvdW50eV9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2JvdW50eV9pbmZvOgogICAgLy8gZXNjcm93LnB5Ojc3NgogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc3NwogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6Nzc5CiAgICAvLyBsb2coQnl0ZXMoYiJib3VudHlfaW5mbyIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY2OTZlNjY2ZgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzgwCiAgICAvLyBsb2cob3AuaXRvYihzZWxmLnN0YXRlX2JveC52YWx1ZSkpCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc4MQogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTIgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc4MgogICAgLy8gbG9nKG9wLml0b2Ioc2VsZi5lc2Nyb3dfYW1vdW50LnZhbHVlKSkKICAgIGJ5dGVjIDUgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgaXRvYgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzgzCiAgICAvLyBsb2coc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUuYnl0ZXMpCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3ODQKICAgIC8vIGxvZyhzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUuYnl0ZXMpCiAgICBieXRlYyA5IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWdlbnRfYWRkcmVzcyBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc4NQogICAgLy8gbG9nKG9wLml0b2Ioc2VsZi5yZWplY3Rpb25fY291bnQudmFsdWUpKQogICAgYnl0ZWMgNyAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVqZWN0aW9uX2NvdW50IGV4aXN0cwogICAgYnRvaQogICAgaXRvYgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6Nzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QucmVnaXN0ZXJfYXJiaXRyYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlZ2lzdGVyX2FyYml0cmF0b3I6CiAgICAvLyBlc2Nyb3cucHk6Nzg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGVzY3Jvdy5weTo3ODkKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3OTAKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc5MQogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3OTMKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGFkZHJlc3MsICJTZW5kZXIgbXVzdCBtYXRjaCBhZGRyZXNzIHRvIHJlZ2lzdGVyIgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gU2VuZGVyIG11c3QgbWF0Y2ggYWRkcmVzcyB0byByZWdpc3RlcgogICAgLy8gZXNjcm93LnB5Ojc5NS03OTYKICAgIC8vICMgQ2hlY2sgaWYgYWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBrZXlfaWR4ID0gQnl0ZXMoYiJjYW5kX2lkeF8iKSArIGFkZHJlc3MuYnl0ZXMKICAgIGJ5dGVjIDI5IC8vIDB4NjM2MTZlNjQ1ZjY5NjQ3ODVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBlc2Nyb3cucHk6Nzk3CiAgICAvLyBkdW1teSwgZXhpc3RzID0gb3AuQm94LmdldChrZXlfaWR4KQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIGVzY3Jvdy5weTo3OTgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzLCAiQXJiaXRyYXRvciBhbHJlYWR5IHJlZ2lzdGVyZWQiCiAgICAhCiAgICBhc3NlcnQgLy8gQXJiaXRyYXRvciBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIC8vIGVzY3Jvdy5weTo3OQogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmNhbmRpZGF0ZV9jb3VudC5tYXliZSgpCiAgICBieXRlYyAxMyAvLyAiY2FuZGlkYXRlX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgwCiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6ODAyLTgwMwogICAgLy8gIyBXcml0ZSB0byBwb29sCiAgICAvLyBCb3goQWNjb3VudCwga2V5PUJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihjb3VudCkpLnZhbHVlID0gYWRkcmVzcwogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4NjM2MTZlNjQ1ZjYxNjQ2NDcyNWYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6ODA0CiAgICAvLyBCb3goVUludDY0LCBrZXk9a2V5X2lkeCkudmFsdWUgPSBjb3VudAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6ODA2LTgwNwogICAgLy8gIyBJbmNyZW1lbnQgY291bnQKICAgIC8vIHNlbGYuY2FuZGlkYXRlX2NvdW50LnZhbHVlID0gY291bnQgKyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gImNhbmRpZGF0ZV9jb3VudCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo4MDkKICAgIC8vIGxvZyhCeXRlcyhiImFyYml0cmF0b3JfcmVnaXN0ZXJlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjE3MjYyNjk3NDcyNjE3NDZmNzI1ZjcyNjU2NzY5NzM3NDY1NzI2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo4MTAKICAgIC8vIGxvZyhhZGRyZXNzLmJ5dGVzKQogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6Nzg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuZGVyZWdpc3Rlcl9hcmJpdHJhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVyZWdpc3Rlcl9hcmJpdHJhdG9yOgogICAgLy8gZXNjcm93LnB5OjgxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBlc2Nyb3cucHk6ODE0CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6ODE1CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo4MTYKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6ODE4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBhZGRyZXNzLCAiU2VuZGVyIG11c3QgbWF0Y2ggYWRkcmVzcyB0byBkZXJlZ2lzdGVyIgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gU2VuZGVyIG11c3QgbWF0Y2ggYWRkcmVzcyB0byBkZXJlZ2lzdGVyCiAgICAvLyBlc2Nyb3cucHk6ODIwLTgyMQogICAgLy8gIyBDaGVjayBpZiByZWdpc3RlcmVkCiAgICAvLyBrZXlfaWR4ID0gQnl0ZXMoYiJjYW5kX2lkeF8iKSArIGFkZHJlc3MuYnl0ZXMKICAgIGJ5dGVjIDI5IC8vIDB4NjM2MTZlNjQ1ZjY5NjQ3ODVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgLy8gZXNjcm93LnB5OjgyMgogICAgLy8gZHVtbXksIGV4aXN0cyA9IG9wLkJveC5nZXQoa2V5X2lkeCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gZXNjcm93LnB5OjgyMwogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkFyYml0cmF0b3Igbm90IHJlZ2lzdGVyZWQiCiAgICBhc3NlcnQgLy8gQXJiaXRyYXRvciBub3QgcmVnaXN0ZXJlZAogICAgLy8gZXNjcm93LnB5Ojc5CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuY2FuZGlkYXRlX2NvdW50Lm1heWJlKCkKICAgIGJ5dGVjIDEzIC8vICJjYW5kaWRhdGVfY291bnQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODAKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo4MjcKICAgIC8vIHJlbW92ZV9pZHggPSBpZHhfYm94LnZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNAogICAgLy8gZXNjcm93LnB5OjgyOAogICAgLy8gbGFzdF9pZHggPSBjb3VudCAtIDEKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weTo4MzAKICAgIC8vIGlmIHJlbW92ZV9pZHggIT0gbGFzdF9pZHg6CiAgICAhPQogICAgYnogZGVyZWdpc3Rlcl9hcmJpdHJhdG9yX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gZXNjcm93LnB5OjgzMS04MzIKICAgIC8vICMgU3dhcCB3aXRoIGxhc3QgZWxlbWVudAogICAgLy8gbGFzdF9hZGRyID0gQm94KEFjY291bnQsIGtleT1CeXRlcyhiImNhbmRfYWRkcl8iKSArIG9wLml0b2IobGFzdF9pZHgpKS52YWx1ZQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4NjM2MTZlNjQ1ZjYxNjQ2NDcyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTo4MzMKICAgIC8vIEJveChBY2NvdW50LCBrZXk9Qnl0ZXMoYiJjYW5kX2FkZHJfIikgKyBvcC5pdG9iKHJlbW92ZV9pZHgpKS52YWx1ZSA9IGxhc3RfYWRkcgogICAgZGlnIDQKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo4MzQKICAgIC8vIEJveChVSW50NjQsIGtleT1CeXRlcyhiImNhbmRfaWR4XyIpICsgbGFzdF9hZGRyLmJ5dGVzKS52YWx1ZSA9IHJlbW92ZV9pZHgKICAgIGJ5dGVjIDI5IC8vIDB4NjM2MTZlNjQ1ZjY5NjQ3ODVmCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYm94X3B1dAoKZGVyZWdpc3Rlcl9hcmJpdHJhdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGVzY3Jvdy5weTo4MzYtODM3CiAgICAvLyAjIERlbGV0ZSBsYXN0IGVsZW1lbnQgYm94IGFuZCByZXZlcnNlIG1hcHBpbmcgaW5kZXggYm94CiAgICAvLyBrZXlfYWRkciA9IEJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihsYXN0X2lkeCkKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gZXNjcm93LnB5OjgzOAogICAgLy8gYXNzZXJ0IG9wLkJveC5kZWxldGUoa2V5X2FkZHIpLCAiRmFpbGVkIHRvIGRlbGV0ZSBhZGRyZXNzIGJveCIKICAgIGJveF9kZWwKICAgIGFzc2VydCAvLyBGYWlsZWQgdG8gZGVsZXRlIGFkZHJlc3MgYm94CiAgICAvLyBlc2Nyb3cucHk6ODM5CiAgICAvLyBhc3NlcnQgb3AuQm94LmRlbGV0ZShrZXlfaWR4KSwgIkZhaWxlZCB0byBkZWxldGUgaW5kZXggYm94IgogICAgc3dhcAogICAgYm94X2RlbAogICAgYXNzZXJ0IC8vIEZhaWxlZCB0byBkZWxldGUgaW5kZXggYm94CiAgICAvLyBlc2Nyb3cucHk6ODQxCiAgICAvLyBzZWxmLmNhbmRpZGF0ZV9jb3VudC52YWx1ZSA9IGxhc3RfaWR4CiAgICBieXRlYyAxMyAvLyAiY2FuZGlkYXRlX2NvdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojg0MwogICAgLy8gbG9nKEJ5dGVzKGIiYXJiaXRyYXRvcl9kZXJlZ2lzdGVyZWQiKSkKICAgIHB1c2hieXRlcyAweDYxNzI2MjY5NzQ3MjYxNzQ2ZjcyNWY2NDY1NzI2NTY3Njk3Mzc0NjU3MjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojg0NAogICAgLy8gbG9nKGFkZHJlc3MuYnl0ZXMpCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo4MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5kZWxldGVfYm91bnR5W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JvdW50eToKICAgIC8vIGVzY3Jvdy5weTo4NDgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCAiT25seSBjcmVhdG9yIGNhbiBkZWxldGUgYXBwbGljYXRpb24iCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gZGVsZXRlIGFwcGxpY2F0aW9uCiAgICAvLyBlc2Nyb3cucHk6ODQ5CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0ZV9ib3gudmFsdWUgPT0gQ0xPU0VELCAiQm91bnR5IG11c3QgYmUgZnVsbHkgY2xvc2VkL3BhaWQgb3V0IGJlZm9yZSBkZWxldGlvbiIKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJvdW50eSBtdXN0IGJlIGZ1bGx5IGNsb3NlZC9wYWlkIG91dCBiZWZvcmUgZGVsZXRpb24KICAgIC8vIGVzY3Jvdy5weTo4NTEtODUyCiAgICAvLyAjIFN3ZWVwIGFsbCByZW1haW5pbmcgQUxHTyBhbmQgY2xvc2Ugb3V0IHRoZSBjb250cmFjdCBhY2NvdW50CiAgICAvLyBhcHBfYmFsYW5jZSwgZXhpc3RzID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2JhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTo4NTMKICAgIC8vIGlmIGV4aXN0cyBhbmQgYXBwX2JhbGFuY2UgPiAwOgogICAgYnogZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDUKICAgIGR1cAogICAgYnogZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGVzY3Jvdy5weTo4NTQtODU5CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9c2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBjbG9zZV9yZW1haW5kZXJfdG89c2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGVzY3Jvdy5weTo4NTUKICAgIC8vIHJlY2VpdmVyPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIGVzY3Jvdy5weTo4NTYKICAgIC8vIGFtb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGVzY3Jvdy5weTo4NTQKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGVzY3Jvdy5weTo4NTcKICAgIC8vIGZlZT0wLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBlc2Nyb3cucHk6ODU0LTg1OQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgY2xvc2VfcmVtYWluZGVyX3RvPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBlc2Nyb3cucHk6ODQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0Ll9nZXRfYWdlbnRfYWRkcmVzcygpIC0+IGJ5dGVzOgpfZ2V0X2FnZW50X2FkZHJlc3M6CiAgICAvLyBlc2Nyb3cucHk6OTUKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5hZ2VudF9hZGRyZXNzLm1heWJlKCkKICAgIGJ5dGVjIDkgLy8gImFnZW50X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICAvLyBlc2Nyb3cucHk6OTYKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgYnogX2dldF9hZ2VudF9hZGRyZXNzX3Rlcm5hcnlfZmFsc2VAMgogICAgcmV0c3ViCgpfZ2V0X2FnZW50X2FkZHJlc3NfdGVybmFyeV9mYWxzZUAyOgogICAgcG9wCiAgICAvLyBlc2Nyb3cucHk6OTYKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJldHN1YgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5fdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKGFzc2V0X2lkOiB1aW50NjQsIGVzY3Jvd19hbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZToKICAgIC8vIGVzY3Jvdy5weToxMTYKICAgIC8vIGRlZiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQsIGVzY3Jvd19hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gZXNjcm93LnB5OjExNwogICAgLy8gaWYgYXNzZXRfaWQgPiAwOgogICAgZnJhbWVfZGlnIC0yCiAgICBieiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlX2Vsc2VfYm9keUAyCiAgICAvLyBlc2Nyb3cucHk6MTE5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCBhc3NldF9pZAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGVzY3Jvdy5weToxMTgtMTIwCiAgICAvLyBiYWxhbmNlLCBleGlzdHMgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfYmFsYW5jZSgKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCBhc3NldF9pZAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIC8vIGVzY3Jvdy5weToxMjEKICAgIC8vIGFzc2VydCBleGlzdHMsICJDb250cmFjdCBpcyBub3Qgb3B0ZWQgaW50byB0aGUgYXNzZXQiCiAgICBhc3NlcnQgLy8gQ29udHJhY3QgaXMgbm90IG9wdGVkIGludG8gdGhlIGFzc2V0CiAgICAvLyBlc2Nyb3cucHk6MTIyCiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSBlc2Nyb3dfYW1vdW50LCAiSW5zdWZmaWNpZW50IGFzc2V0IGJhbGFuY2UiCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGFzc2V0IGJhbGFuY2UKICAgIHJldHN1YgoKX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZV9lbHNlX2JvZHlAMjoKICAgIC8vIGVzY3Jvdy5weToxMjQKICAgIC8vIGFwcF9iYWxhbmNlLCBleGlzdHMgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjEyNQogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkZhaWxlZCB0byByZWFkIGNvbnRyYWN0IGJhbGFuY2UiCiAgICBhc3NlcnQgLy8gRmFpbGVkIHRvIHJlYWQgY29udHJhY3QgYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjEyNgogICAgLy8gYXNzZXJ0IGFwcF9iYWxhbmNlID49IGVzY3Jvd19hbW91bnQsICJJbnN1ZmZpY2llbnQgY29udHJhY3QgYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgY29udHJhY3QgYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0Ll9zZW5kX3BheW91dChyZWNlaXZlcjogYnl0ZXMsIGFtb3VudDogdWludDY0LCBhc3NldF9pZDogdWludDY0KSAtPiB2b2lkOgpfc2VuZF9wYXlvdXQ6CiAgICAvLyBlc2Nyb3cucHk6MTI4CiAgICAvLyBkZWYgX3NlbmRfcGF5b3V0KHNlbGYsIHJlY2VpdmVyOiBBY2NvdW50LCBhbW91bnQ6IFVJbnQ2NCwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gZXNjcm93LnB5OjEyOQogICAgLy8gaWYgYXNzZXRfaWQgPT0gMDoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9zZW5kX3BheW91dF9lbHNlX2JvZHlAMwogICAgLy8gZXNjcm93LnB5OjEzMC0xMzQKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBlc2Nyb3cucHk6MTMwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBlc2Nyb3cucHk6MTMzCiAgICAvLyBmZWU9MCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gZXNjcm93LnB5OjEzMC0xMzQKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKX3NlbmRfcGF5b3V0X2Vsc2VfYm9keUAzOgogICAgLy8gZXNjcm93LnB5OjEzNi0xNDEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBlc2Nyb3cucHk6MTM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGVzY3Jvdy5weToxNDAKICAgIC8vIGZlZT0wLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBlc2Nyb3cucHk6MTM2LTE0MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuX3NlbmRfZmVlX3NwbGl0KHByaW1hcnlfcmVjaXBpZW50OiBieXRlcywgZXNjcm93X2Ftb3VudDogdWludDY0LCBhc3NldF9pZDogdWludDY0LCBtZWRpYXRvcl9hZGRyOiBieXRlcykgLT4gdWludDY0Ogpfc2VuZF9mZWVfc3BsaXQ6CiAgICAvLyBlc2Nyb3cucHk6MTQzLTE0OQogICAgLy8gZGVmIF9zZW5kX2ZlZV9zcGxpdCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHByaW1hcnlfcmVjaXBpZW50OiBBY2NvdW50LAogICAgLy8gICAgIGVzY3Jvd19hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICAgICBhc3NldF9pZDogVUludDY0LAogICAgLy8gICAgIG1lZGlhdG9yX2FkZHI6IEFjY291bnQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDQgMQogICAgLy8gZXNjcm93LnB5OjE1NwogICAgLy8gZmVlX3BsYXRmb3JtID0gZXNjcm93X2Ftb3VudCAqIDIgLy8gMTAwICAjIDIlIHRvdGFsIHBsYXRmb3JtIGZlZQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weToxNTgKICAgIC8vIGZlZV9jcmVhdG9yID0gZmVlX3BsYXRmb3JtIC8vIDIgICAgICAgICAgIyAxJSByb3lhbHR5CiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weToxNTkKICAgIC8vIGZlZV90cmVhc3VyeSA9IGZlZV9wbGF0Zm9ybSAtIGZlZV9jcmVhdG9yICAjIDElIHRyZWFzdXJ5CiAgICAtCiAgICAvLyBlc2Nyb3cucHk6MTYwCiAgICAvLyBmZWVfbWVkaWF0b3IgPSBlc2Nyb3dfYW1vdW50ICogMjUgLy8gMTAwMDAgICMgMC4yNSUKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCAyNQogICAgKgogICAgcHVzaGludCAxMDAwMAogICAgLwogICAgLy8gZXNjcm93LnB5OjE2Mi0xNjMKICAgIC8vICMgRGVkdXAgcm95YWx0eSB3aGVuIHByaW1hcnkgcmVjaXBpZW50IGlzIHRoZSBjcmVhdG9yCiAgICAvLyBpc19jcmVhdG9yID0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUgPT0gcHJpbWFyeV9yZWNpcGllbnQKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIGZyYW1lX2RpZyAtNAogICAgPT0KICAgIC8vIGVzY3Jvdy5weToxNjUKICAgIC8vIGlmIG5vdCBpc19jcmVhdG9yOgogICAgYm56IF9zZW5kX2ZlZV9zcGxpdF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGVzY3Jvdy5weToxNjYKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBmZWVfY3JlYXRvciwgYXNzZXRfaWQpCiAgICBieXRlY18xIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBkaWcgMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAoKX3NlbmRfZmVlX3NwbGl0X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGVzY3Jvdy5weToxNjgKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYudHJlYXN1cnlfYWRkcmVzcy52YWx1ZSwgZmVlX3RyZWFzdXJ5LCBhc3NldF9pZCkKICAgIGJ5dGVjIDI0IC8vICJ0cmVhc3VyeV9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJlYXN1cnlfYWRkcmVzcyBleGlzdHMKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6MTY5CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChtZWRpYXRvcl9hZGRyLCBmZWVfbWVkaWF0b3IsIGFzc2V0X2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjE3MQogICAgLy8gcmV0dXJuIGVzY3Jvd19hbW91bnQgLSBmZWVfY3JlYXRvciAtIGZlZV90cmVhc3VyeSAtIGZlZV9tZWRpYXRvcgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIC0KICAgIHN3YXAKICAgIC0KICAgIHN3YXAKICAgIC0KICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "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", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": { "CLAIM_TIMEOUT": { "type": "AVMUint64", "value": "AAAAAAAAAHg=" }, "DISPUTE_TIMEOUT": { "type": "AVMUint64", "value": "AAAAAAAAASw=" } } }