{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "AdminChange": [ { "name": "changeType", "type": "uint64" }, { "name": "targetGroupId", "type": "uint64" }, { "name": "groupName", "type": "string" }, { "name": "memberAddr", "type": "address" }, { "name": "memberType", "type": "uint64" }, { "name": "memberLabel", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "activeFlag", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "Member": [ { "name": "accountType", "type": "uint64" }, { "name": "label", "type": "string" }, { "name": "addr", "type": "address" } ], "Proposal": [ { "name": "groupId", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "payloadType", "type": "uint64" }, { "name": "approvalsCount", "type": "uint64" }, { "name": "threshold", "type": "uint64" }, { "name": "expiryRound", "type": "uint64" }, { "name": "proposer", "type": "address" }, { "name": "numPayloads", "type": "uint64" } ], "SignerGroup": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "memberCount", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "dailyUsage", "type": "uint64" }, { "name": "dailyPeriodStart", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "monthlyUsage", "type": "uint64" }, { "name": "monthlyPeriodStart", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "active", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialise the safe. The creator becomes the bootstrap admin and must call\n`bootstrap` once (after funding the app account) to create the first admin\nsigner group. The application is intentionally non-updatable and\nnon-deletable for custody safety.", "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "string", "name": "groupName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Genesis bootstrap: create the first admin signer group as a 1-of-1 group\nwhose sole member is the creator, with full admin privileges and all\nactions allowed. Callable exactly once, only by the creator. After this,\nevery privileged change must go through governance.\n\nRequires the app account to be funded for box MBR beforehand.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] } ], "recommendations": {} }, { "name": "proposeTransactionGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,address,uint64,uint64,address,uint64,address,uint64,uint64,address,uint64,uint64,byte[],byte[],byte[],byte[],uint64,byte[],byte[],byte[],uint64,uint64,uint64,string)[]", "name": "payload" }, { "type": "uint64", "name": "expiryRound" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a transaction-group proposal from the first payload chunk. When the\ntotal number of transactions exceeds the ~2 KB per-ABI-argument limit, call\nappendTransactionGroupPayload (once per extra chunk, slots 2\u20136) before the\nproposal is approved and executed. Stores the payload at slot 1.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "appendTransactionGroupPayload", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "(uint64,address,uint64,uint64,address,uint64,address,uint64,uint64,address,uint64,uint64,byte[],byte[],byte[],byte[],uint64,byte[],byte[],byte[],uint64,uint64,uint64,string)[]", "name": "payload" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Append an additional payload chunk (slots 2\u20136) to an existing transaction-group\nproposal. Must be called before the proposal reaches STATUS_READY so all\nchunks are present when the proposal is executed.", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "AdminChange", "name": "change" }, { "type": "uint64", "name": "expiryRound" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a governed signer-group administration proposal.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "approveProposal", "args": [ { "type": "uint64", "name": "proposalId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the caller's approval of a proposal.", "events": [ { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "executeProposal", "args": [ { "type": "uint64", "name": "proposalId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a proposal once its threshold has been met.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "cancelProposal", "args": [ { "type": "uint64", "name": "proposalId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a pending proposal. Allowed for the proposer or any member of the proposal's group.", "events": [ { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "getConfig", "args": [], "returns": { "type": "(string,uint64,uint64,uint64,uint64,string)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getSignerGroup", "args": [ { "type": "uint64", "name": "groupId" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "SignerGroup" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getProposal", "args": [ { "type": "uint64", "name": "proposalId" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,address,uint64)", "struct": "Proposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTransactionGroup", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" } ], "returns": { "type": "(uint64,address,uint64,uint64,address,uint64,address,uint64,uint64,address,uint64,uint64,byte[],byte[],byte[],byte[],uint64,byte[],byte[],byte[],uint64,uint64,uint64,string)[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" } ], "returns": { "type": "(uint64,string,address)", "struct": "Member" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "isMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "account" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdA==" }, "nextGroupId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmdpZA==" }, "nextProposalId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnBpZA==" }, "groupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2NudA==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVy" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "groups": { "keyType": "uint64", "valueType": "SignerGroup", "prefix": "Zw==" }, "members": { "keyType": "Object78E87395", "valueType": "Member", "prefix": "bQ==" }, "proposals": { "keyType": "uint64", "valueType": "Proposal", "prefix": "cA==" }, "approvals": { "keyType": "Object9F556C53", "valueType": "Approval", "prefix": "YQ==" }, "transactionGroups": { "keyType": "uint64", "valueType": "(uint64,address,uint64,uint64,address,uint64,address,uint64,uint64,address,uint64,uint64,byte[],byte[],byte[],byte[],uint64,byte[],byte[],byte[],uint64,uint64,uint64,string)[]", "prefix": "dHhn" }, "adminPayloads": { "keyType": "uint64", "valueType": "AdminChange", "prefix": "ZHA=" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1283, 1454, 1715, 1820, 1862, 1956, 4473, 5042, 5236, 5415, 5436, 5472, 5505 ], "errorMessage": "Box must have value" }, { "pc": [ 119 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 4811 ], "errorMessage": "already a member" }, { "pc": [ 1771 ], "errorMessage": "already approved" }, { "pc": [ 442 ], "errorMessage": "already bootstrapped" }, { "pc": [ 4398 ], "errorMessage": "appId required" }, { "pc": [ 4379 ], "errorMessage": "appl not allowed" }, { "pc": [ 4359 ], "errorMessage": "asset close target required" }, { "pc": [ 4331 ], "errorMessage": "asset receiver required" }, { "pc": [ 4309 ], "errorMessage": "axfer not allowed" }, { "pc": [ 433, 440, 449, 611, 932, 1806, 4503, 4742, 5308, 5313, 5318, 5323, 5328, 5333, 5640 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 2065 ], "errorMessage": "close target required" }, { "pc": [ 2168 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 1266 ], "errorMessage": "empty payload" }, { "pc": [ 911 ], "errorMessage": "empty tx group" }, { "pc": [ 5628 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 1494 ], "errorMessage": "first member required" }, { "pc": [ 5879 ], "errorMessage": "group admin required" }, { "pc": [ 951, 1461, 1868 ], "errorMessage": "group disabled" }, { "pc": [ 5608 ], "errorMessage": "group not found" }, { "pc": [ 2327, 2453, 2556, 2652, 2801, 2925, 3043, 3154, 3337, 3420, 3515, 3622, 3742, 3868, 3999, 4144 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 1502, 1641 ], "errorMessage": "invalid actions" }, { "pc": [ 694, 1042 ], "errorMessage": "invalid array encoding" }, { "pc": [ 309, 416, 664, 727, 749, 770, 791, 812, 834, 856, 877, 1012, 1075, 1097, 1118, 1139, 1160, 1182, 1204, 1225, 1404, 1425, 2310, 2436, 2539, 2635, 2784, 2908, 3026, 3137, 3320, 3403, 3498, 3605, 3725, 3851, 3982, 4127, 5824 ], "errorMessage": "invalid array length header" }, { "pc": [ 316, 423 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 898, 1246 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 5496, 5529, 5570 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 656, 906, 994, 1004, 1376, 1438, 1702, 1799, 5223, 5408, 5429, 5450, 5459, 5486, 5519, 5560 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1430 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 1509, 1671 ], "errorMessage": "invalid privileges" }, { "pc": [ 1263 ], "errorMessage": "invalid slot" }, { "pc": [ 719, 1067 ], "errorMessage": "invalid tail pointer at index 12 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 741, 1089 ], "errorMessage": "invalid tail pointer at index 13 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 762, 1110 ], "errorMessage": "invalid tail pointer at index 14 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 783, 1131 ], "errorMessage": "invalid tail pointer at index 15 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 804, 1152 ], "errorMessage": "invalid tail pointer at index 17 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 826, 1174 ], "errorMessage": "invalid tail pointer at index 18 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 848, 1196 ], "errorMessage": "invalid tail pointer at index 19 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 1396 ], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 869, 1217 ], "errorMessage": "invalid tail pointer at index 23 of (uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))" }, { "pc": [ 1417 ], "errorMessage": "invalid tail pointer at index 5 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 702, 1050 ], "errorMessage": "invalid tail pointer for (len+(uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint8[32],uint64,uint64,uint8[32],uint64,uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,(len+uint8[]),(len+uint8[]),(len+uint8[]),uint64,uint64,uint64,(len+utf8[]))[])" }, { "pc": [ 713, 736, 757, 778, 799, 821, 843, 864, 1061, 1084, 1105, 1126, 1147, 1169, 1191, 1212, 1391, 1412 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 2071, 3204 ], "errorMessage": "keyreg must be single tx" }, { "pc": [ 4426 ], "errorMessage": "keyreg not allowed" }, { "pc": [ 4409 ], "errorMessage": "max 4 app args" }, { "pc": [ 1562 ], "errorMessage": "member required" }, { "pc": [ 2228 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 4515 ], "errorMessage": "new group starts with one member" }, { "pc": [ 1757, 5618 ], "errorMessage": "not a group member" }, { "pc": [ 4923 ], "errorMessage": "not a member" }, { "pc": [ 1290 ], "errorMessage": "not a tx group" }, { "pc": [ 1731 ], "errorMessage": "not approvable" }, { "pc": [ 5278 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 5252 ], "errorMessage": "not cancellable" }, { "pc": [ 1826 ], "errorMessage": "not ready to execute" }, { "pc": [ 435 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 2016 ], "errorMessage": "pay not allowed" }, { "pc": [ 5868 ], "errorMessage": "policy admin required" }, { "pc": [ 1743, 1846 ], "errorMessage": "proposal expired" }, { "pc": [ 1309 ], "errorMessage": "proposal not pending" }, { "pc": [ 2038 ], "errorMessage": "receiver required" }, { "pc": [ 934, 1808 ], "errorMessage": "safe paused" }, { "pc": [ 1555, 1584, 1607, 1634, 1664, 1691 ], "errorMessage": "target group not found" }, { "pc": [ 1486, 1611 ], "errorMessage": "threshold >= 1" }, { "pc": [ 5003 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 1837 ], "errorMessage": "threshold not met" }, { "pc": [ 916 ], "errorMessage": "too many txs" }, { "pc": [ 1679 ], "errorMessage": "unknown change type" }, { "pc": [ 4418 ], "errorMessage": "unknown tx type" }, { "pc": [ 4945 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMiAwIDggMSAxNzggMTkyIDE5NCAyMzggMTk2IDE5OCAxMzAgMjA4IDE0NgogICAgYnl0ZWNibG9jayAiZyIgIm0iIDB4MTUxZjdjNzUgInAiICJuZ2lkIiAiZ2NudCIgIm5waWQiICJwYXVzZWQiIDB4N2M2MDU5ZTYgImJvb3QiIDB4ZDA3MDUwN2EgImEiICJ0eGciIDB4MDY4MTAxICJuYW1lIiAiY3JlYXRvciIgInZlciIgMHgwMDEyIDB4MGNkNzM1N2MgImRwIiAweDAwMmEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGV4cG9ydCBjbGFzcyBBbGdvU2FmZSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxOAogICAgcHVzaGJ5dGVzcyAweDkxNGJhNjMzIDB4OWNjNjE4ZmMgMHhmMzAzMjA5MyAweGNiYTkwMTc2IDB4OTIxMzliNjAgMHhmMWZmMjhhYSAweGJmYjUyNDhmIDB4OWVjMzBkMzEgMHg4ZmM0ODUzNyAweGRkOGQ2MWM1IDB4MTUyODJjNGQgMHgxY2YxOTA2OSAweDBiMTZiZTVhIDB4OGI2NGVkNzIgLy8gbWV0aG9kICJib290c3RyYXAoc3RyaW5nKXZvaWQiLCBtZXRob2QgInByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKHVpbnQ2NCwodWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NCx1aW50NjQsc3RyaW5nKVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQsdWludDY0LHN0cmluZylbXSl2b2lkIiwgbWV0aG9kICJwcm9wb3NlQWRtaW5DaGFuZ2UodWludDY0LCh1aW50NjQsdWludDY0LHN0cmluZyxhZGRyZXNzLHVpbnQ2NCxzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYXBwcm92ZVByb3Bvc2FsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJleGVjdXRlUHJvcG9zYWwodWludDY0KXZvaWQiLCBtZXRob2QgImNhbmNlbFByb3Bvc2FsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRDb25maWcoKShzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHN0cmluZykiLCBtZXRob2QgImdldFNpZ25lckdyb3VwKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFByb3Bvc2FsKHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQpIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvbkdyb3VwKHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQsdWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAiZ2V0TWVtYmVyKHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsc3RyaW5nLGFkZHJlc3MpIiwgbWV0aG9kICJpc01lbWJlcih1aW50NjQsYWRkcmVzcylib29sIiwgbWV0aG9kICJoYXNBcHByb3ZlZCh1aW50NjQsYWRkcmVzcylib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkIHByb3Bvc2VBZG1pbkNoYW5nZSBhcHByb3ZlUHJvcG9zYWwgZXhlY3V0ZVByb3Bvc2FsIGNhbmNlbFByb3Bvc2FsIGdldENvbmZpZyBnZXRTaWduZXJHcm91cCBnZXRQcm9wb3NhbCBnZXRUcmFuc2FjdGlvbkdyb3VwIGdldE1lbWJlciBpc01lbWJlciBoYXNBcHByb3ZlZAogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29TYWZlIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MTE1NzU2ZGIgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBlcnIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDYKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAxMyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDEzIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIG5hbWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAnbmFtZScgfSkKICAgIGJ5dGVjIDE0IC8vICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgMTUgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyB0aGlzLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNQogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA5IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDQgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzMgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyA2IC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18zIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA4CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzNwogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA3IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjM4CiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogJ3ZlcicgfSkKICAgIGJ5dGVjIDE2IC8vICJ2ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSBDT05UUkFDVF9WRVJTSU9OCiAgICBwdXNoYnl0ZXMgIkJJQVRFQ0gtQUxHTy1TQUZFLXYxLjAuMCIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyBlbWl0PFNhZmVDcmVhdGVkPih7IG5hbWUsIGNyZWF0b3I6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAyMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZTI5YzhiNDcgLy8gbWV0aG9kICJTYWZlQ3JlYXRlZChzdHJpbmcsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18zIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gcHVibGljIGJvb3RzdHJhcChncm91cE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDE1IC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDkgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNTUKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA0IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1NgogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1OC0yNzMKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgaW50Y18zIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNTgtMjczCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1OC0yNzMKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwNmEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDcwMDAwMDAwMDAwMDAwMDBmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGRpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBVaW50NjQoMSksIGxhYmVsOiAnY3JlYXRvcicsIGFkZHI6IFR4bi5zZW5kZXIgfQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMTAwMmEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwNzYzNzI2NTYxNzQ2ZjcyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzcKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkaWcgMQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWNfMSAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICB1bmNvdmVyIDMKICAgIGludGNfMyAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgNCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA4CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDUgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDkgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18zIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IGdyb3VwTmFtZSwgdGhyZXNob2xkOiBVaW50NjQoMSkgfSkKICAgIGR1cAogICAgYnl0ZWMgMTcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyBtZXRob2QgIkdyb3VwQ3JlYXRlZCh1aW50NjQsc3RyaW5nLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogVHhuLnNlbmRlciwgYWNjb3VudFR5cGU6IFVpbnQ2NCgxKSB9KQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjUxCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwKGdyb3VwTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcm9wb3NlVHJhbnNhY3Rpb25Hcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZDogU2FmZVR4bkdyb3VwLCBleHBpcnlSb3VuZDogdWludDY0KTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDAKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIHB1YmxpYyBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cChncm91cElkOiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMjQwIC8vIDI0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxMiBvZiAodWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyNDIgLy8gMjQyCiAgICArCiAgICBkaWcgMgogICAgaW50YyA2IC8vIDE5NAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTMgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAyCiAgICArCiAgICArCiAgICBkaWcgMgogICAgaW50YyA4IC8vIDE5NgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTQgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAyCiAgICArCiAgICArCiAgICBkaWcgMgogICAgaW50YyA5IC8vIDE5OAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTUgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAyCiAgICArCiAgICArCiAgICBkaWcgMgogICAgaW50YyAxMSAvLyAyMDgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDE3IG9mICh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjEwIC8vIDIxMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTggb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAyCiAgICArCiAgICArCiAgICBkaWcgMgogICAgcHVzaGludCAyMTIgLy8gMjEyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxOSBvZiAodWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pKQogICAgZGlnIDMKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDIKICAgICsKICAgICsKICAgIGRpZyAyCiAgICBpbnRjIDcgLy8gMjM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAyMyBvZiAodWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMQoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoZ3JvdXBJZDogdWludDY0LCBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsIGV4cGlyeVJvdW5kOiB1aW50NjQpOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMCAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSB0eCBncm91cCcpCiAgICBkaWcgNQogICAgZHVwCiAgICBhc3NlcnQgLy8gZW1wdHkgdHggZ3JvdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA8PSBNQVhfR1JPVVBfVFhOUywgJ3RvbyBtYW55IHR4cycpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgdHhzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBlbnN1cmVCdWRnZXQoKHBheWxvYWQubGVuZ3RoICsgVWludDY0KDMpKSAqIFVpbnQ2NCg3MDApKQogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgIHB1c2hpbnQgNzAwIC8vIDcwMAogICAgKgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwMQogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gcGF1c2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BhdXNlZCcgfSkKICAgIGJ5dGVjIDcgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzYWZlIHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKGdyb3VwSWQpCiAgICBkaWcgNwogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZS5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZS5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHB1c2hpbnQgOTggLy8gOTgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBjb25zdCBwaWQgPSB0aGlzLl9uZXdQcm9wb3NhbChncm91cElkLCBQVF9UUkFOU0FDVElPTl9HUk9VUCwgZXhwaXJ5Um91bmQpCiAgICBpbnRjXzMgLy8gMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9uZXdQcm9wb3NhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwNQogICAgLy8gdGhpcy5fc3RvcmVQYXlsb2FkR3JvdXAocGlkLCBVaW50NjQoMSksIHBheWxvYWQpCiAgICBkdXAKICAgIGludGNfMyAvLyAxCiAgICBkaWcgOAogICAgY2FsbHN1YiBfc3RvcmVQYXlsb2FkR3JvdXAKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgcCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHAubnVtUGF5bG9hZHMgPSBVaW50NjQoMSkKICAgIGludGNfMyAvLyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzA2LTMwOAogICAgLy8gY29uc3QgcCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUpCiAgICAvLyBwLm51bVBheWxvYWRzID0gVWludDY0KDEpCiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocCkKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoZ3JvdXBJZDogdWludDY0LCBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsIGV4cGlyeVJvdW5kOiB1aW50NjQpOiB1aW50NjQgewogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18zIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZDoKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisodWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDI0MCAvLyAyNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTIgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMjQyIC8vIDI0MgogICAgKwogICAgZGlnIDIKICAgIGludGMgNiAvLyAxOTQKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDEzIG9mICh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgZGlnIDIKICAgIGludGMgOCAvLyAxOTYKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDE0IG9mICh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgZGlnIDIKICAgIGludGMgOSAvLyAxOTgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDE1IG9mICh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgZGlnIDIKICAgIGludGMgMTEgLy8gMjA4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxNyBvZiAodWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pKQogICAgZGlnIDMKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDIKICAgICsKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDIxMCAvLyAyMTAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDE4IG9mICh1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjEyIC8vIDIxMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMTkgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAyCiAgICArCiAgICArCiAgICBkaWcgMgogICAgaW50YyA3IC8vIDIzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMjMgb2YgKHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ2NCx1aW50OFszMl0sdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSx1aW50NjQsdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLChsZW4rdWludDhbXSksdWludDY0LChsZW4rdWludDhbXSksKGxlbit1aW50OFtdKSwobGVuK3VpbnQ4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDIKICAgICsKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18zIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9mb3JfaGVhZGVyQDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMCAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTgKICAgIC8vIGFzc2VydChwYXlsb2FkSW5kZXggPj0gVWludDY0KDIpICYmIHBheWxvYWRJbmRleCA8PSBVaW50NjQoNiksICdpbnZhbGlkIHNsb3QnKQogICAgZGlnIDYKICAgIGludGNfMCAvLyAyCiAgICA+PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUA4CiAgICBkaWcgNgogICAgcHVzaGludCA2IC8vIDYKICAgIDw9CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDgKICAgIGludGNfMyAvLyAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBhc3NlcnQocGF5bG9hZEluZGV4ID49IFVpbnQ2NCgyKSAmJiBwYXlsb2FkSW5kZXggPD0gVWludDY0KDYpLCAnaW52YWxpZCBzbG90JykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHNsb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSBwYXlsb2FkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gZW1wdHkgcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyA4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEzCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCwgJ25vdCBhIHR4IGdyb3VwJykKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdCBhIHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMQogICAgaW50Y18zIC8vIDEKICAgID09CiAgICBibnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF90cnVlQDExCiAgICBkaWcgOQogICAgaW50Y18wIC8vIDIKICAgID09CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEyCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX3RydWVAMTE6CiAgICBpbnRjXzMgLy8gMQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjItMzI1CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwKICAgIC8vICAgJ3Byb3Bvc2FsIG5vdCBwZW5kaW5nJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBwcm9wb3NhbCBub3QgcGVuZGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKHByb3Bvc2FsLmdyb3VwSWQpCiAgICBkaWcgMTAKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIGVuc3VyZUJ1ZGdldCgocGF5bG9hZC5sZW5ndGggKyBVaW50NjQoMykpICogVWludDY0KDcwMCkpCiAgICBkaWcgNQogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgIHB1c2hpbnQgNzAwIC8vIDcwMAogICAgKgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOAogICAgLy8gdGhpcy5fc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZCwgcGF5bG9hZEluZGV4LCBwYXlsb2FkKQogICAgZGlnIDkKICAgIGRpZyA4CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyA5CiAgICBjYWxsc3ViIF9zdG9yZVBheWxvYWRHcm91cAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBpZiAocGF5bG9hZEluZGV4ID4gcHJvcG9zYWwubnVtUGF5bG9hZHMpIHsKICAgIHN3YXAKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMxLTMzMgogICAgLy8gdXBkYXRlZC5udW1QYXlsb2FkcyA9IHBheWxvYWRJbmRleAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgZGlnIDExCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBkaWcgOQogICAgYm94X3JlcGxhY2UKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogU2FmZVR4bkdyb3VwKTogdm9pZCB7CiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18xIC8vIDAKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMwoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUA4OgogICAgaW50Y18xIC8vIDAKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcm9wb3NlQWRtaW5DaGFuZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9wb3NlQWRtaW5DaGFuZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBwdWJsaWMgcHJvcG9zZUFkbWluQ2hhbmdlKGdyb3VwSWQ6IHVpbnQ2NCwgY2hhbmdlOiBBZG1pbkNoYW5nZSwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEyNCAvLyAxMjQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMiBvZiAodWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSksdWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTI2IC8vIDEyNgogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDUgb2YgKHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICBkaWcgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBZG1pbkNoYW5nZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKGdyb3VwSWQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQwLTM0MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHN3YXAKICAgIHB1c2hpbnQgOTggLy8gOTgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5MwogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ1JFQVRFX0dST1VQKSB7CiAgICBpbnRjXzMgLy8gMQogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NAogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPj0gVWludDY0KDEpLCAndGhyZXNob2xkID49IDEnKQogICAgZGlnIDIKICAgIGR1cAogICAgcHVzaGludCA2MCAvLyA2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgPj0gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NQogICAgLy8gYXNzZXJ0KGNoYW5nZS5tZW1iZXJBZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdmaXJzdCBtZW1iZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBleHRyYWN0IDE4IDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmlyc3QgbWVtYmVyIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFsbG93ZWRBY3Rpb25zIDw9IEFDVF9BTEwsICdpbnZhbGlkIGFjdGlvbnMnKQogICAgZHVwCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAxNSAvLyAxNQogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIGFjdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTcKICAgIC8vIGFzc2VydChjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzIDw9IFBSSVZfQUxMLCAnaW52YWxpZCBwcml2aWxlZ2VzJykKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKCnByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gY29uc3QgcGlkID0gdGhpcy5fbmV3UHJvcG9zYWwoZ3JvdXBJZCwgUFRfQURNSU4sIGV4cGlyeVJvdW5kKQogICAgZGlnIDMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMwogICAgY2FsbHN1YiBfbmV3UHJvcG9zYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2FkcyhwaWQpLnZhbHVlID0gY2xvbmUoY2hhbmdlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMTkgLy8gImRwIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gdGhpcy5hZG1pblBheWxvYWRzKHBpZCkudmFsdWUgPSBjbG9uZShjaGFuZ2UpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoZ3JvdXBJZDogdWludDY0LCBjaGFuZ2U6IEFkbWluQ2hhbmdlLCBleHBpcnlSb3VuZDogdWludDY0KTogdWludDY0IHsKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMyAvLyAxCiAgICByZXR1cm4KCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTgKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9BRERfTUVNQkVSKSB7CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwMAogICAgLy8gYXNzZXJ0KGNoYW5nZS5tZW1iZXJBZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdtZW1iZXIgcmVxdWlyZWQnKQogICAgZXh0cmFjdCAxOCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAxNAoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwMQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9NRU1CRVIpIHsKICAgIGR1cAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODAyCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAxNAoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwMwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NIQU5HRV9USFJFU0hPTEQpIHsKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDQKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDQKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0YXJnZXQgZ3JvdXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA1CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA+PSBVaW50NjQoMSksICd0aHJlc2hvbGQgPj0gMScpCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCA+PSAxCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDE0Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA2CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDcKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDcKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0YXJnZXQgZ3JvdXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA4CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFsbG93ZWRBY3Rpb25zIDw9IEFDVF9BTEwsICdpbnZhbGlkIGFjdGlvbnMnKQogICAgcHVzaGludCA3NiAvLyA3NgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBhY3Rpb25zCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDE0Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwOQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTEKICAgIC8vIGFzc2VydChjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzIDw9IFBSSVZfQUxMLCAnaW52YWxpZCBwcml2aWxlZ2VzJykKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMTQKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODEyCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX0FDVElWRSkgewogICAgZHVwCiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGFzc2VydCAvLyB1bmtub3duIGNoYW5nZSB0eXBlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODEzCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMTQKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcHJvdmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcHJvdmVQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGFwcHJvdmFibGUnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGludGNfMyAvLyAxCiAgICA9PQogICAgYm56IGFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVAMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMgogICAgPT0KICAgIGJ6IGFwcHJvdmVQcm9wb3NhbF9ib29sX2ZhbHNlQDQKCmFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVAMzoKICAgIGludGNfMyAvLyAxCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBhcHByb3ZhYmxlJykKICAgIGFzc2VydCAvLyBub3QgYXBwcm92YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBwcm9wb3NhbCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWNfMSAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdCBhIGdyb3VwIG1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2MAogICAgLy8gYXNzZXJ0KCF0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhcHByb3ZlZCcpCiAgICBkaWcgMwogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDExIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYXBwcm92ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIHRoaXMuX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQsIHByb3Bvc2FsKQogICAgZGlnIDQKICAgIHN3YXAKICAgIGNhbGxzdWIgX3JlY29yZEFwcHJvdmFsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgYXBwcm92ZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZXhlY3V0ZVByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZVByb3Bvc2FsOgogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gOAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIHB1YmxpYyBleGVjdXRlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA3IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2FmZSBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCByZWFkeSB0byBleGVjdXRlJykKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBub3QgcmVhZHkgdG8gZXhlY3V0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLmFwcHJvdmFsc0NvdW50ID49IHByb3Bvc2FsLnRocmVzaG9sZCwgJ3RocmVzaG9sZCBub3QgbWV0JykKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPj0KICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgbm90IG1ldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzczLTM3NAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHB1c2hpbnQgOTggLy8gOTgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc2CiAgICAvLyBpZiAocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQKSB7CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDEKICAgID09CiAgICBieiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIHRoaXMuX2V4ZWN1dGVUcmFuc2FjdGlvbkdyb3VwKHByb3Bvc2FsSWQsIHByb3Bvc2FsLmdyb3VwSWQsIGdyb3VwLCBwcm9wb3NhbC5udW1QYXlsb2FkcykKICAgIGRpZyAyCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gZW5zdXJlQnVkZ2V0KFVpbnQ2NCgxNDAwKSkKICAgIHB1c2hpbnQgMTQwMCAvLyAxNDAwCiAgICBpbnRjXzEgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTEzCiAgICAvLyBsZXQgdHhJbmRleCA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMyAvLyAxCiAgICBidXJ5IDExCiAgICBkdXBuIDIKICAgIGJ1cnkgMjEKICAgIGJ1cnkgMTkKCmV4ZWN1dGVQcm9wb3NhbF93aGlsZV90b3BAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDEwCiAgICBkaWcgMTIKICAgIDw9CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfd2hpbGVANzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTYKICAgIC8vIGNvbnN0IGtleTogdWludDY0ID0gcHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHAKICAgIGRpZyA1CiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZGlnIDExCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE3CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTIgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE3CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZXhlY3V0ZVByb3Bvc2FsX2lmX2JvZHlAMjUKICAgIGRpZyAxOQogICAgYnVyeSAxOAoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDEwCiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgYnVyeSAxMQogICAgZGlnIDE3CiAgICBidXJ5IDIwCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF93aGlsZV90b3BAMjMKCmV4ZWN1dGVQcm9wb3NhbF9pZl9ib2R5QDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxOAogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIGRpZyAyNAogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAxOAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDE0CiAgICBkaWcgMTkKICAgIGJ1cnkgMTgKCmV4ZWN1dGVQcm9wb3NhbF93aGlsZV90b3BAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUxOQogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGRpZyAyNAogICAgaW50Y18xIC8vIDAKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxOQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZGlnIDE0CiAgICA+CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMgogICAgLy8gaWYgKHR4LnR4VHlwZSA9PT0gVFhfUEFZTUVOVCkgewogICAgaW50Y18wIC8vIDIKICAgIGRpZyAxNAogICAgKgogICAgaW50Y18wIC8vIDIKICAgICsKICAgIGR1cAogICAgYnVyeSAxNgogICAgZGlnIDI1CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMgogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgOQogICAgaW50Y18zIC8vIDEKICAgID09CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDMKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfUEFZKSAhPT0gVWludDY0KDApLCAncGF5IG5vdCBhbGxvd2VkJykKICAgIGRpZyAxOAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gcGF5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzA0CiAgICAvLyBhc3NlcnQodHgucmVjZWl2ZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3JlY2VpdmVyIHJlcXVpcmVkJykKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCiAgICBkaWcgMgogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZWNlaXZlciByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNQogICAgLy8gaWYgKHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDYKICAgIC8vIGFzc2VydCh0eC5jbG9zZVJlbWFpbmRlclRvICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdjbG9zZSB0YXJnZXQgcmVxdWlyZWQnKQogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICArCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGNsb3NlIHRhcmdldCByZXF1aXJlZAoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTIyCiAgICAvLyBhc3NlcnQodHgudHhUeXBlICE9PSBUWF9LRVlSRUcsICdrZXlyZWcgbXVzdCBiZSBzaW5nbGUgdHgnKQogICAgZGlnIDcKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAhPQogICAgYXNzZXJ0IC8vIGtleXJlZyBtdXN0IGJlIHNpbmdsZSB0eAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0MwogICAgLy8gbGV0IGFtb3VudCA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDUKICAgIC8vIGlmIChncm91cC5saW1pdEFzc2V0SWQgPT09IFVpbnQ2NCgwKSkgewogICAgZHVwCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIGJueiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ2CiAgICAvLyBpZiAodHgudHhUeXBlID09PSBUWF9QQVlNRU5UKSB7CiAgICBkaWcgOQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDcKICAgIC8vIGFtb3VudCA9IHR4LmFtb3VudAogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGJ1cnkgMTYKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDQ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MwogICAgLy8gaWYgKGFtb3VudCA9PT0gVWludDY0KDApKSB7CiAgICBkaWcgMTUKICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2FjY291bnRTcGVuZEA1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1NwogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gaWYgKGdyb3VwLmRhaWx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZHVwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjAKICAgIC8vIGlmIChub3cgLSBncm91cC5kYWlseVBlcmlvZFN0YXJ0ID49IERBWV9TRUNPTkRTKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMTMKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gZ3JvdXAuZGFpbHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2MgogICAgLy8gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA9IG5vdwogICAgZGlnIDEzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1OAogICAgYnVyeSAxCgpleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjQKICAgIC8vIGFzc2VydChncm91cC5kYWlseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLmRhaWx5TGltaXQsICdkYWlseSBsaW1pdCBleGNlZWRlZCcpCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMTcKICAgICsKICAgIGRpZyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gZGFpbHkgbGltaXQgZXhjZWVkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjUKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBncm91cC5kYWlseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA1MAogICAgYnVyeSAxCgpleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjgKICAgIC8vIGlmIChncm91cC5tb250aGx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZHVwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYWNjb3VudFNwZW5kQDU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY5CiAgICAvLyBpZiAobm93IC0gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID49IE1PTlRIX1NFQ09ORFMpIHsKICAgIGR1cAogICAgcHVzaGludCA4MiAvLyA4MgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMwogICAgc3dhcAogICAgLQogICAgcHVzaGludCAyNTkyMDAwIC8vIDI1OTIwMDAKICAgID49CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA1MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3MAogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgaXRvYgogICAgZGlnIDEKICAgIHN3YXAKICAgIHJlcGxhY2UyIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcxCiAgICAvLyBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGRpZyAxMwogICAgaXRvYgogICAgcmVwbGFjZTIgODIKICAgIGJ1cnkgMQoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzczCiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDc0IC8vIDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDE3CiAgICArCiAgICBkaWcgMQogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIG1vbnRobHkgbGltaXQgZXhjZWVkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IGdyb3VwLm1vbnRobHlVc2FnZSArIGFtb3VudAogICAgaXRvYgogICAgcmVwbGFjZTIgNzQKICAgIGJ1cnkgMQoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYWNjb3VudFNwZW5kQDU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzNQogICAgLy8gaWYgKHR4LnR4VHlwZSA9PT0gVFhfUEFZTUVOVCkgewogICAgZGlnIDkKICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzYKICAgIC8vIGlmICh0eC5oYXNDbG9zZSAhPT0gVWludDY0KDApKSB7CiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzNwogICAgLy8gaWYgKGZpcnN0KSB7CiAgICBkaWcgOAogICAgYm56IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzgtNTQ1CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbih7CiAgICAvLyAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5QYXltZW50LAogICAgLy8gICByZWNlaXZlcjogdHgucmVjZWl2ZXIsCiAgICAvLyAgIGFtb3VudDogdHguYW1vdW50LAogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiB0eC5jbG9zZVJlbWFpbmRlclRvLAogICAgLy8gICBub3RlOiB0eC5ub3RlLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQwCiAgICAvLyByZWNlaXZlcjogdHgucmVjZWl2ZXIsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQxCiAgICAvLyBhbW91bnQ6IHR4LmFtb3VudCwKICAgIGRpZyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICArCiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQyCiAgICAvLyBjbG9zZVJlbWFpbmRlclRvOiB0eC5jbG9zZVJlbWFpbmRlclRvLAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICArCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQzCiAgICAvLyBub3RlOiB0eC5ub3RlLAogICAgZGlnIDE5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE4CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDcgLy8gMjM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzOQogICAgLy8gdHlwZTogVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsCiAgICBpbnRjXzMgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0NAogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyNQogICAgLy8gdHhJbmRleCA9IHR4SW5kZXggKyBVaW50NjQoMSkKICAgIGRpZyA4CiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBkaWcgMTMKICAgIGludGNfMyAvLyAxCiAgICArCiAgICBidXJ5IDE0CiAgICBkaWcgMTgKICAgIGJ1cnkgMTgKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX3doaWxlX3RvcEAyNgoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA1OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDctNTU0CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KHsKICAgIC8vICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsCiAgICAvLyAgIHJlY2VpdmVyOiB0eC5yZWNlaXZlciwKICAgIC8vICAgYW1vdW50OiB0eC5hbW91bnQsCiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IHR4LmNsb3NlUmVtYWluZGVyVG8sCiAgICAvLyAgIG5vdGU6IHR4Lm5vdGUsCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gcmVjZWl2ZXI6IHR4LnJlY2VpdmVyLAogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1MAogICAgLy8gYW1vdW50OiB0eC5hbW91bnQsCiAgICBkaWcgMQogICAgcHVzaGludCA0MiAvLyA0MgogICAgKwogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1MQogICAgLy8gY2xvc2VSZW1haW5kZXJUbzogdHguY2xvc2VSZW1haW5kZXJUbywKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1OCAvLyA1OAogICAgKwogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1MgogICAgLy8gbm90ZTogdHgubm90ZSwKICAgIGRpZyAxOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50YyA3IC8vIDIzOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDgKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5QYXltZW50LAogICAgaW50Y18zIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTMKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDYwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1NgogICAgLy8gfSBlbHNlIGlmIChmaXJzdCkgewogICAgZGlnIDgKICAgIGJueiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDYyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTU3LTU2MwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW4oewogICAgLy8gICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuUGF5bWVudCwKICAgIC8vICAgcmVjZWl2ZXI6IHR4LnJlY2VpdmVyLAogICAgLy8gICBhbW91bnQ6IHR4LmFtb3VudCwKICAgIC8vICAgbm90ZTogdHgubm90ZSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1OQogICAgLy8gcmVjZWl2ZXI6IHR4LnJlY2VpdmVyLAogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gYW1vdW50OiB0eC5hbW91bnQsCiAgICBzd2FwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2MQogICAgLy8gbm90ZTogdHgubm90ZSwKICAgIGRpZyAxOAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50YyA3IC8vIDIzOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTU4CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuUGF5bWVudCwKICAgIGludGNfMyAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYyCiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA3MgoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA2MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjUtNTcxCiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KHsKICAgIC8vICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQsCiAgICAvLyAgIHJlY2VpdmVyOiB0eC5yZWNlaXZlciwKICAgIC8vICAgYW1vdW50OiB0eC5hbW91bnQsCiAgICAvLyAgIG5vdGU6IHR4Lm5vdGUsCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2NwogICAgLy8gcmVjZWl2ZXI6IHR4LnJlY2VpdmVyLAogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2OAogICAgLy8gYW1vdW50OiB0eC5hbW91bnQsCiAgICBzd2FwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2OQogICAgLy8gbm90ZTogdHgubm90ZSwKICAgIGRpZyAxOAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50YyA3IC8vIDIzOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuUGF5bWVudCwKICAgIGludGNfMyAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTcwCiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA3MgoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA2MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzMKICAgIC8vIH0gZWxzZSBpZiAodHgudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZGlnIDcKICAgIGludGNfMCAvLyAyCiAgICA9PQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA3MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3NAogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgewogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDEzOCAvLyAxMzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA2OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3NQogICAgLy8gaWYgKGZpcnN0KSB7CiAgICBkaWcgOAogICAgYm56IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzYtNTg0CiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbih7CiAgICAvLyAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLAogICAgLy8gICB4ZmVyQXNzZXQ6IHR4LnhmZXJBc3NldCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdHguYXNzZXRSZWNlaXZlciwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHR4LmFzc2V0QW1vdW50LAogICAgLy8gICBhc3NldENsb3NlVG86IHR4LmFzc2V0Q2xvc2VUbywKICAgIC8vICAgbm90ZTogdHgubm90ZSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3OAogICAgLy8geGZlckFzc2V0OiB0eC54ZmVyQXNzZXQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCA5MCAvLyA5MAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3OQogICAgLy8gYXNzZXRSZWNlaXZlcjogdHguYXNzZXRSZWNlaXZlciwKICAgIGRpZyAxCiAgICBwdXNoaW50IDk4IC8vIDk4CiAgICArCiAgICBkaWcgMwogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODAKICAgIC8vIGFzc2V0QW1vdW50OiB0eC5hc3NldEFtb3VudCwKICAgIGRpZyAyCiAgICBpbnRjIDEwIC8vIDEzMAogICAgKwogICAgZGlnIDQKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4MQogICAgLy8gYXNzZXRDbG9zZVRvOiB0eC5hc3NldENsb3NlVG8sCiAgICB1bmNvdmVyIDMKICAgIGludGMgMTIgLy8gMTQ2CiAgICArCiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTgyCiAgICAvLyBub3RlOiB0eC5ub3RlLAogICAgZGlnIDIwCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE5CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDcgLy8gMjM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzcKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDY3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4Ni01OTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQoewogICAgLy8gICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlciwKICAgIC8vICAgeGZlckFzc2V0OiB0eC54ZmVyQXNzZXQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHR4LmFzc2V0UmVjZWl2ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0eC5hc3NldEFtb3VudCwKICAgIC8vICAgYXNzZXRDbG9zZVRvOiB0eC5hc3NldENsb3NlVG8sCiAgICAvLyAgIG5vdGU6IHR4Lm5vdGUsCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4OAogICAgLy8geGZlckFzc2V0OiB0eC54ZmVyQXNzZXQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCA5MCAvLyA5MAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4OQogICAgLy8gYXNzZXRSZWNlaXZlcjogdHguYXNzZXRSZWNlaXZlciwKICAgIGRpZyAxCiAgICBwdXNoaW50IDk4IC8vIDk4CiAgICArCiAgICBkaWcgMwogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTAKICAgIC8vIGFzc2V0QW1vdW50OiB0eC5hc3NldEFtb3VudCwKICAgIGRpZyAyCiAgICBpbnRjIDEwIC8vIDEzMAogICAgKwogICAgZGlnIDQKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gYXNzZXRDbG9zZVRvOiB0eC5hc3NldENsb3NlVG8sCiAgICB1bmNvdmVyIDMKICAgIGludGMgMTIgLy8gMTQ2CiAgICArCiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTkyCiAgICAvLyBub3RlOiB0eC5ub3RlLAogICAgZGlnIDIwCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE5CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDcgLy8gMjM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTMKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDY4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gfSBlbHNlIGlmIChmaXJzdCkgewogICAgZGlnIDgKICAgIGJueiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk3LTYwNAogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW4oewogICAgLy8gICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlciwKICAgIC8vICAgeGZlckFzc2V0OiB0eC54ZmVyQXNzZXQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHR4LmFzc2V0UmVjZWl2ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0eC5hc3NldEFtb3VudCwKICAgIC8vICAgbm90ZTogdHgubm90ZSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5OQogICAgLy8geGZlckFzc2V0OiB0eC54ZmVyQXNzZXQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCA5MCAvLyA5MAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwMAogICAgLy8gYXNzZXRSZWNlaXZlcjogdHguYXNzZXRSZWNlaXZlciwKICAgIGRpZyAxCiAgICBwdXNoaW50IDk4IC8vIDk4CiAgICArCiAgICBkaWcgMwogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDEKICAgIC8vIGFzc2V0QW1vdW50OiB0eC5hc3NldEFtb3VudCwKICAgIHVuY292ZXIgMgogICAgaW50YyAxMCAvLyAxMzAKICAgICsKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjAyCiAgICAvLyBub3RlOiB0eC5ub3RlLAogICAgZGlnIDE5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE4CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDcgLy8gMjM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5OAogICAgLy8gdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIsCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwMwogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANzIKCmV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA2LTYxMwogICAgLy8gaXR4bkNvbXBvc2UubmV4dCh7CiAgICAvLyAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLAogICAgLy8gICB4ZmVyQXNzZXQ6IHR4LnhmZXJBc3NldCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdHguYXNzZXRSZWNlaXZlciwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHR4LmFzc2V0QW1vdW50LAogICAgLy8gICBub3RlOiB0eC5ub3RlLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIHhmZXJBc3NldDogdHgueGZlckFzc2V0LAogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIHB1c2hpbnQgOTAgLy8gOTAKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDkKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IHR4LmFzc2V0UmVjZWl2ZXIsCiAgICBkaWcgMQogICAgcHVzaGludCA5OCAvLyA5OAogICAgKwogICAgZGlnIDMKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBhc3NldEFtb3VudDogdHguYXNzZXRBbW91bnQsCiAgICB1bmNvdmVyIDIKICAgIGludGMgMTAgLy8gMTMwCiAgICArCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxMQogICAgLy8gbm90ZTogdHgubm90ZSwKICAgIGRpZyAxOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50YyA3IC8vIDIzOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDcxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gfSBlbHNlIGlmICh0eC50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZGlnIDcKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGtleXJlZyBtdXN0IGJlIHNpbmdsZSB0eAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyMwogICAgLy8gaWYgKHR4Lm51bUFyZ3MgPT09IFVpbnQ2NCgwKSkgewogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDE4NiAvLyAxODYKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDkKICAgIGJueiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI0CiAgICAvLyBpZiAoZmlyc3QpIGl0eG5Db21wb3NlLmJlZ2luKHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwgYXBwSWQ6IHR4LmFwcElkLCBmZWU6IFVpbnQ2NCgwKSB9KQogICAgZGlnIDgKICAgIGJueiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDc5CiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDc5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNQogICAgLy8gZWxzZSBpdHhuQ29tcG9zZS5uZXh0KHsgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwgYXBwSWQ6IHR4LmFwcElkLCBmZWU6IFVpbnQ2NCgwKSB9KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDgwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gfSBlbHNlIGlmICh0eC5udW1BcmdzID09PSBVaW50NjQoMSkpIHsKICAgIGRpZyA3CiAgICBpbnRjXzMgLy8gMQogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAODQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjcKICAgIC8vIGlmIChmaXJzdCkKICAgIGRpZyA4CiAgICBibnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA4MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyOC02MzMKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luKHsKICAgIC8vICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwKICAgIC8vICAgYXBwSWQ6IHR4LmFwcElkLAogICAgLy8gICBhcHBBcmdzOiBbdHguYXJnMF0sCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzAKICAgIC8vIGFwcElkOiB0eC5hcHBJZCwKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA0IC8vIDE3OAogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBhcHBBcmdzOiBbdHguYXJnMF0sCiAgICBkaWcgMTcKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18zIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDE5NAogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI5CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzIKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDgzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNQogICAgLy8gaXR4bkNvbXBvc2UubmV4dCh7IHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsIGFwcElkOiB0eC5hcHBJZCwgYXBwQXJnczogW3R4LmFyZzBdLCBmZWU6IFVpbnQ2NCgwKSB9KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDE3CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNiAvLyAxOTQKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA3MgoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA4NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzYKICAgIC8vIH0gZWxzZSBpZiAodHgubnVtQXJncyA9PT0gVWludDY0KDIpKSB7CiAgICBkaWcgNwogICAgaW50Y18wIC8vIDIKICAgID09CiAgICBieiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDg4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM3CiAgICAvLyBpZiAoZmlyc3QpCiAgICBkaWcgOAogICAgYm56IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAODcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzgtNjQzCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbih7CiAgICAvLyAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsCiAgICAvLyAgIGFwcElkOiB0eC5hcHBJZCwKICAgIC8vICAgYXBwQXJnczogW3R4LmFyZzAsIHR4LmFyZzFdLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQwCiAgICAvLyBhcHBJZDogdHguYXBwSWQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0MQogICAgLy8gYXBwQXJnczogW3R4LmFyZzAsIHR4LmFyZzFdLAogICAgZGlnIDE3CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNiAvLyAxOTQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBpbnRjIDggLy8gMTk2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM5CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDIKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDg3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0NS02NTAKICAgIC8vIGl0eG5Db21wb3NlLm5leHQoewogICAgLy8gICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgLy8gICBhcHBJZDogdHguYXBwSWQsCiAgICAvLyAgIGFwcEFyZ3M6IFt0eC5hcmcwLCB0eC5hcmcxXSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyBhcHBJZDogdHguYXBwSWQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0OAogICAgLy8gYXBwQXJnczogW3R4LmFyZzAsIHR4LmFyZzFdLAogICAgZGlnIDE3CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNiAvLyAxOTQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBpbnRjIDggLy8gMTk2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ2CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDkKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDg4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1MQogICAgLy8gfSBlbHNlIGlmICh0eC5udW1BcmdzID09PSBVaW50NjQoMykpIHsKICAgIGRpZyA3CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAOTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTIKICAgIC8vIGlmIChmaXJzdCkKICAgIGRpZyA4CiAgICBibnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA5MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1My02NTgKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luKHsKICAgIC8vICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwKICAgIC8vICAgYXBwSWQ6IHR4LmFwcElkLAogICAgLy8gICBhcHBBcmdzOiBbdHguYXJnMCwgdHguYXJnMSwgdHguYXJnMl0sCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTUKICAgIC8vIGFwcElkOiB0eC5hcHBJZCwKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA0IC8vIDE3OAogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU2CiAgICAvLyBhcHBBcmdzOiBbdHguYXJnMCwgdHguYXJnMSwgdHguYXJnMl0sCiAgICBkaWcgMTcKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18zIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDE5NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGMgOCAvLyAxOTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpbnRjIDkgLy8gMTk4CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU0CiAgICAvLyB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTcKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDcyCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDkxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MC02NjUKICAgIC8vIGl0eG5Db21wb3NlLm5leHQoewogICAgLy8gICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsLAogICAgLy8gICBhcHBJZDogdHguYXBwSWQsCiAgICAvLyAgIGFwcEFyZ3M6IFt0eC5hcmcwLCB0eC5hcmcxLCB0eC5hcmcyXSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYyCiAgICAvLyBhcHBJZDogdHguYXBwSWQsCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gYXBwQXJnczogW3R4LmFyZzAsIHR4LmFyZzEsIHR4LmFyZzJdLAogICAgZGlnIDE3CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDE2CiAgICBkdXAKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNiAvLyAxOTQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBpbnRjIDggLy8gMTk2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaW50YyA5IC8vIDE5OAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MQogICAgLy8gdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjY0CiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA3MgoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA5MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIH0gZWxzZSBpZiAoZmlyc3QpIHsKICAgIGRpZyA4CiAgICBibnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA5NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2Ny02NzIKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luKHsKICAgIC8vICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCwKICAgIC8vICAgYXBwSWQ6IHR4LmFwcElkLAogICAgLy8gICBhcHBBcmdzOiBbdHguYXJnMCwgdHguYXJnMSwgdHguYXJnMiwgdHguYXJnM10sCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIGFwcElkOiB0eC5hcHBJZCwKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA0IC8vIDE3OAogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcwCiAgICAvLyBhcHBBcmdzOiBbdHguYXJnMCwgdHguYXJnMSwgdHguYXJnMiwgdHguYXJnM10sCiAgICBkaWcgMTcKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18zIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDE5NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGMgOCAvLyAxOTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpbnRjIDkgLy8gMTk4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNAogICAgaW50YyAxMSAvLyAyMDgKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjgKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3MQogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANzIKCmV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAOTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc0LTY3OQogICAgLy8gaXR4bkNvbXBvc2UubmV4dCh7CiAgICAvLyAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsCiAgICAvLyAgIGFwcElkOiB0eC5hcHBJZCwKICAgIC8vICAgYXBwQXJnczogW3R4LmFyZzAsIHR4LmFyZzEsIHR4LmFyZzIsIHR4LmFyZzNdLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzYKICAgIC8vIGFwcElkOiB0eC5hcHBJZCwKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA0IC8vIDE3OAogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBhcHBBcmdzOiBbdHguYXJnMCwgdHguYXJnMSwgdHguYXJnMiwgdHguYXJnM10sCiAgICBkaWcgMTcKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18zIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDE5NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGMgOCAvLyAxOTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpbnRjIDkgLy8gMTk4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNAogICAgaW50YyAxMSAvLyAyMDgKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzUKICAgIC8vIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwsCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3OAogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANzIKCmV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ5CiAgICAvLyB9IGVsc2UgaWYgKHR4LnR4VHlwZSA9PT0gVFhfQVNTRVQgJiYgdHgueGZlckFzc2V0ID09PSBncm91cC5saW1pdEFzc2V0SWQpIHsKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMgogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDQ0CiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgOTAgLy8gOTAKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDcKICAgID09CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MAogICAgLy8gYW1vdW50ID0gdHguYXNzZXRBbW91bnQKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyAxMCAvLyAxMzAKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAxNgogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0NAoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDgKICAgIC8vIH0gZWxzZSBpZiAodHgudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZGlnIDcKICAgIGludGNfMCAvLyAyCiAgICA9PQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUAzMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwOQogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BWEZFUikgIT09IFVpbnQ2NCgwKSwgJ2F4ZmVyIG5vdCBhbGxvd2VkJykKICAgIGRpZyAxOAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAyCiAgICAmCiAgICBhc3NlcnQgLy8gYXhmZXIgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIGFzc2VydCh0eC5hc3NldFJlY2VpdmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhc3NldCByZWNlaXZlciByZXF1aXJlZCcpCiAgICBkaWcgMjQKICAgIGR1cAogICAgZGlnIDE2CiAgICBpbnRjXzAgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCA5OCAvLyA5OAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXQgcmVjZWl2ZXIgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTEKICAgIC8vIGlmICh0eC5oYXNBc3NldENsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIHB1c2hpbnQgMTM4IC8vIDEzOAogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxMgogICAgLy8gYXNzZXJ0KHR4LmFzc2V0Q2xvc2VUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYXNzZXQgY2xvc2UgdGFyZ2V0IHJlcXVpcmVkJykKICAgIGRpZyAyNAogICAgZHVwCiAgICBkaWcgMTYKICAgIGludGNfMCAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyAxMiAvLyAxNDYKICAgICsKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXQgY2xvc2UgdGFyZ2V0IHJlcXVpcmVkCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM2CgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxNAogICAgLy8gfSBlbHNlIGlmICh0eC50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZGlnIDcKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxNQogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BUFBMKSAhPT0gVWludDY0KDApLCAnYXBwbCBub3QgYWxsb3dlZCcpCiAgICBkaWcgMTgKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgJgogICAgYXNzZXJ0IC8vIGFwcGwgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTYKICAgIC8vIGFzc2VydCh0eC5hcHBJZCAhPT0gVWludDY0KDApLCAnYXBwSWQgcmVxdWlyZWQnKQogICAgZGlnIDI0CiAgICBkdXAKICAgIGRpZyAxNgogICAgaW50Y18wIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGludGMgNCAvLyAxNzgKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGFzc2VydCAvLyBhcHBJZCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxNwogICAgLy8gYXNzZXJ0KHR4Lm51bUFyZ3MgPD0gVWludDY0KDQpLCAnbWF4IDQgYXBwIGFyZ3MnKQogICAgcHVzaGludCAxODYgLy8gMTg2CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA8PQogICAgYXNzZXJ0IC8vIG1heCA0IGFwcCBhcmdzCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM2CgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxOAogICAgLy8gfSBlbHNlIGlmICh0eC50eFR5cGUgPT09IFRYX0tFWVJFRykgewogICAgZGlnIDcKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIHVua25vd24gdHggdHlwZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxOQogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9LRVlSRUcpICE9PSBVaW50NjQoMCksICdrZXlyZWcgbm90IGFsbG93ZWQnKQogICAgZGlnIDE4CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGFzc2VydCAvLyBrZXlyZWcgbm90IGFsbG93ZWQKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzYKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl93aGlsZUA3NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBkaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTMxCiAgICAvLyBpdHhuQ29tcG9zZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfRVhFQ1VURUQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg1LTM4NgogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0VYRUNVVEVECiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDQKICAgIGludGNfMiAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg3CiAgICAvLyBlbWl0PFByb3Bvc2FsRXhlY3V0ZWQ+KHsgcHJvcG9zYWxJZCB9KQogICAgcHVzaGJ5dGVzIDB4MzVjNjdlZmQgLy8gbWV0aG9kICJQcm9wb3NhbEV4ZWN1dGVkKHVpbnQ2NCkiCiAgICBkaWcgNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIHB1YmxpYyBleGVjdXRlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAxOSAvLyAiZHAiCiAgICBkaWcgNQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODAKICAgIC8vIGNvbnN0IGNoYW5nZSA9IGNsb25lKHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyNAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODAtMzgxCiAgICAvLyBjb25zdCBjaGFuZ2UgPSBjbG9uZSh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgYnRvaQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIwCiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9DUkVBVEVfR1JPVVApIHsKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSA5CiAgICBpbnRjXzMgLy8gMQogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2NAogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2NQogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDQgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY1CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY2CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBVaW50NjQoMSksICduZXcgZ3JvdXAgc3RhcnRzIHdpdGggb25lIG1lbWJlcicpCiAgICBkaWcgMjUKICAgIGR1cAogICAgcHVzaGludCA2MCAvLyA2MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGludGNfMyAvLyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIG5ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgZGlnIDI1CiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MgogICAgLy8gYWRtaW5Qcml2aWxlZ2VzOiBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzLAogICAgZGlnIDQKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MwogICAgLy8gYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIGRpZyA1CiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzQKICAgIC8vIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIGRpZyA2CiAgICBwdXNoaW50IDg0IC8vIDg0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzUKICAgIC8vIGRhaWx5TGltaXQ6IGNoYW5nZS5kYWlseUxpbWl0LAogICAgZGlnIDcKICAgIHB1c2hpbnQgOTIgLy8gOTIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3OAogICAgLy8gbW9udGhseUxpbWl0OiBjaGFuZ2UubW9udGhseUxpbWl0LAogICAgZGlnIDgKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODgxCiAgICAvLyBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgZGlnIDkKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY4LTg4MwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBkaWcgNgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDA2YQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MQogICAgLy8gbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIGludGNfMyAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY4LTg4MwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3NgogICAgLy8gZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjgtODgzCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg0CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZGlnIDYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4NAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODYKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICBkaWcgNQogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdW5jb3ZlciA1CiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJ5dGVjIDIwIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODcKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWNfMSAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODcKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4OQogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgdW5jb3ZlciA1CiAgICBpbnRjXzMgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDQgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg5CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNSAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTAKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMyAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA4CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MgogICAgLy8gZW1pdDxHcm91cENyZWF0ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLCB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQgfSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJHcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTMKICAgIC8vIGVtaXQ8TWVtYmVyQWRkZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyLCBhY2NvdW50VHlwZTogY2hhbmdlLm1lbWJlclR5cGUgfSkKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJNZW1iZXJBZGRlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANAoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMgogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9NRU1CRVIpIHsKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMgogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5NwogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGRpZyAyMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5OAogICAgLy8gYXNzZXJ0KCF0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ2FscmVhZHkgYSBtZW1iZXInKQogICAgZGlnIDEKICAgIHB1c2hpbnRzIDE4IDMyIC8vIDE4LCAzMgogICAgYm94X2V4dHJhY3QKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjXzEgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk4CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDAKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICB1bmNvdmVyIDQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDI2CiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgYnl0ZWMgMjAgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDEKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAzLTkwNAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDQKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIGJ0b2kKICAgIGludGNfMyAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAzLTkwNQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgcHVzaGludCAxMCAvLyAxMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDcKICAgIC8vIGVtaXQ8TWVtYmVyQWRkZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyLCBhY2NvdW50VHlwZTogY2hhbmdlLm1lbWJlclR5cGUgfSkKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJNZW1iZXJBZGRlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANAoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9NRU1CRVIpIHsKICAgIGRpZyA3CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTEKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBkaWcgMjMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ25vdCBhIG1lbWJlcicpCiAgICBzd2FwCiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWNfMSAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ25vdCBhIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdCBhIG1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNC05MTUKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGJ0b2kKICAgIGludGNfMyAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE0LTkxNQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE1CiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgYnRvaQogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTcKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZGVsZXRlKCkKICAgIHVuY292ZXIgMgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE4CiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE4LTkxOQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgcHVzaGludCAxMCAvLyAxMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjEKICAgIC8vIGVtaXQ8TWVtYmVyUmVtb3ZlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIgfSkKICAgIHB1c2hieXRlcyAweDJiMTRjMmMxIC8vIG1ldGhvZCAiTWVtYmVyUmVtb3ZlZCh1aW50NjQsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0CgpleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNgogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NIQU5HRV9USFJFU0hPTEQpIHsKICAgIGRpZyA3CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjcKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZGlnIDIzCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjgKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IGdyb3VwLm1lbWJlckNvdW50LCAndGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycycpCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI3LTgyOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyOAogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIGJ0b2kKICAgIDw9CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyOS04MzAKICAgIC8vIGdyb3VwLnRocmVzaG9sZCA9IGNoYW5nZS50aHJlc2hvbGQKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgaW50Y18wIC8vIDIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODMxCiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgOCAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANAoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUE9MSUNZKSB7CiAgICBkaWcgNwogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBieiBleGVjdXRlUHJvcG9zYWxfZWxzZV9ib2R5QDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODMzCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGRpZyAyMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODMzCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzMtODM0CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM0CiAgICAvLyBjb25zdCBhc3NldENoYW5nZWQgPSBncm91cC5saW1pdEFzc2V0SWQgIT09IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIGJ0b2kKICAgIGRpZyAyCiAgICBwdXNoaW50IDg0IC8vIDg0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNQogICAgLy8gZ3JvdXAuYWxsb3dlZEFjdGlvbnMgPSBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMKICAgIGRpZyAzCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzYKICAgIC8vIGdyb3VwLmxpbWl0QXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTIgMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzcKICAgIC8vIGdyb3VwLmRhaWx5TGltaXQgPSBjaGFuZ2UuZGFpbHlMaW1pdAogICAgZGlnIDIKICAgIHB1c2hpbnQgOTIgLy8gOTIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgNDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGdyb3VwLm1vbnRobHlMaW1pdCA9IGNoYW5nZS5tb250aGx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzkKICAgIC8vIGdyb3VwLmNvb2xkb3duUm91bmRzID0gY2hhbmdlLmNvb2xkb3duUm91bmRzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA5MAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0MAogICAgLy8gaWYgKGFzc2V0Q2hhbmdlZCkgewogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDEKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDIKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0MwogICAgLy8gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA9IG5vdwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDQKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMiA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0NQogICAgLy8gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID0gbm93CiAgICBzd2FwCiAgICByZXBsYWNlMiA4MgoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ3CiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGRpZyAyMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDgKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyA4IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBkaWcgMjEKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDQKCmV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ5CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BSSVZJTEVHRVMpIHsKICAgIGRpZyA3CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9lbHNlX2JvZHlAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZGlnIDIzCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTEKICAgIC8vIGdyb3VwLmFkbWluUHJpdmlsZWdlcyA9IGNoYW5nZS5hZG1pblByaXZpbGVnZXMKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2OCAvLyA2OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUwLTg1MgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICAvLyBncm91cC5hZG1pblByaXZpbGVnZXMgPSBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUzCiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgOCAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANAoKZXhlY3V0ZVByb3Bvc2FsX2Vsc2VfYm9keUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZGlnIDIzCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIGdyb3VwLmFjdGl2ZSA9IGNoYW5nZS5hY3RpdmVGbGFnID09PSBVaW50NjQoMCkgPyBVaW50NjQoMCkgOiBVaW50NjQoMSkKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMTYgLy8gMTE2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgICEKICAgICEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTYtODU4CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGdyb3VwLmFjdGl2ZSA9IGNoYW5nZS5hY3RpdmVGbGFnID09PSBVaW50NjQoMCkgPyBVaW50NjQoMCkgOiBVaW50NjQoMSkKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgcHVzaGludCA5OCAvLyA5OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTkKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyA4IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jYW5jZWxQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbFByb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gcHVibGljIGNhbmNlbFByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5MgogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5MgogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5MwogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBjYW5jZWxsYWJsZScpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaW50Y18zIC8vIDEKICAgID09CiAgICBibnogY2FuY2VsUHJvcG9zYWxfYm9vbF90cnVlQDMKICAgIGR1cAogICAgaW50Y18wIC8vIDIKICAgID09CiAgICBieiBjYW5jZWxQcm9wb3NhbF9ib29sX2ZhbHNlQDQKCmNhbmNlbFByb3Bvc2FsX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18zIC8vIDEKCmNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgY2FuY2VsbGFibGUnKQogICAgYXNzZXJ0IC8vIG5vdCBjYW5jZWxsYWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gY29uc3QgaXNQcm9wb3NlciA9IFR4bi5zZW5kZXIgPT09IHByb3Bvc2FsLnByb3Bvc2VyCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0IDQ4IDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NQogICAgLy8gY29uc3QgaXNNZW1iZXIgPSB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cwogICAgc3dhcAogICAgZXh0cmFjdCAwIDgKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjXzEgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIGNvbnN0IGlzTWVtYmVyID0gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NgogICAgLy8gYXNzZXJ0KGlzUHJvcG9zZXIgfHwgaXNNZW1iZXIsICdub3QgYXV0aG9yaXNlZCB0byBjYW5jZWwnKQogICAgfHwKICAgIGFzc2VydCAvLyBub3QgYXV0aG9yaXNlZCB0byBjYW5jZWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19DQU5DRUxMRUQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzk4LTM5OQogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0NBTkNFTExFRAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZShwcm9wb3NhbCkKICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZW1pdDxQcm9wb3NhbENhbmNlbGxlZD4oeyBwcm9wb3NhbElkIH0pCiAgICBwdXNoYnl0ZXMgMHhhZTJhYmMwNiAvLyBtZXRob2QgIlByb3Bvc2FsQ2FuY2VsbGVkKHVpbnQ2NCkiCiAgICBkaWcgNAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTEKICAgIC8vIHB1YmxpYyBjYW5jZWxQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMyAvLyAxCiAgICByZXR1cm4KCmNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIGNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0Q29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0Q29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gdGhpcy5uYW1lLnZhbHVlLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIG5hbWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAnbmFtZScgfSkKICAgIGJ5dGVjIDE0IC8vICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gdGhpcy5uYW1lLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA4CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDQgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIwNwogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDYgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA3IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAxNiAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDktNDE2CiAgICAvLyByZXR1cm4gWwogICAgLy8gICB0aGlzLm5hbWUudmFsdWUsCiAgICAvLyAgIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXVzZWQudmFsdWUsCiAgICAvLyAgIHRoaXMudmVyc2lvbi52YWx1ZSwKICAgIC8vIF0KICAgIGRpZyA1CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICsKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAyNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMyAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFNpZ25lckdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U2lnbmVyR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjEKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIxCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFByb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI2CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE1CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18zIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0VHJhbnNhY3Rpb25Hcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFRyYW5zYWN0aW9uR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgc3dhcAogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEyIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18zIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0TWVtYmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0TWVtYmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS52YWx1ZSkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjXzEgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzYKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18zIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaXNNZW1iZXJbcm91dGluZ10oKSAtPiB2b2lkOgppc01lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gcmV0dXJuIHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkuZXhpc3RzCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlY18xIC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyByZXR1cm4gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzMgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5oYXNBcHByb3ZlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cmhhc0FwcHJvdmVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ2CiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDExIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ2CiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMyAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9hc3NlcnRNZW1iZXIoZ3JvdXBJZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0TWVtYmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1MwogICAgLy8gcHJpdmF0ZSBfYXNzZXJ0TWVtYmVyKGdyb3VwSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkuZXhpc3RzLCAnZ3JvdXAgbm90IGZvdW5kJykKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkuZXhpc3RzLCAnZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NQogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjXzEgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTUKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBncm91cCBtZW1iZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX25ld1Byb3Bvc2FsKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZFR5cGU6IHVpbnQ2NCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfbmV3UHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyBwcml2YXRlIF9uZXdQcm9wb3NhbChncm91cElkOiB1aW50NjQsIHBheWxvYWRUeXBlOiB1aW50NjQsIGV4cGlyeVJvdW5kOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyBhc3NlcnQoZXhwaXJ5Um91bmQgPiBHbG9iYWwucm91bmQsICdleHBpcnkgbXVzdCBiZSBpbiB0aGUgZnV0dXJlJykKICAgIGZyYW1lX2RpZyAtMQogICAgZ2xvYmFsIFJvdW5kCiAgICA+CiAgICBhc3NlcnQgLy8gZXhwaXJ5IG11c3QgYmUgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYyCiAgICAvLyBjb25zdCBwaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgNiAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIGNvbnN0IHBpZDogdWludDY0ID0gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgc3dhcAogICAgaW50Y18wIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3MQogICAgLy8gcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY2CiAgICAvLyBzdGF0dXM6IFNUQVRVU19BQ1RJVkUsCiAgICBpbnRjXzMgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NC00NzMKICAgIC8vIGNvbnN0IHByb3Bvc2FsOiBQcm9wb3NhbCA9IHsKICAgIC8vICAgZ3JvdXBJZCwKICAgIC8vICAgc3RhdHVzOiBTVEFUVVNfQUNUSVZFLAogICAgLy8gICBwYXlsb2FkVHlwZSwKICAgIC8vICAgYXBwcm92YWxzQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgdGhyZXNob2xkOiBncm91cC50aHJlc2hvbGQsCiAgICAvLyAgIGV4cGlyeVJvdW5kLAogICAgLy8gICBwcm9wb3NlcjogVHhuLnNlbmRlciwKICAgIC8vICAgbnVtUGF5bG9hZHM6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2OAogICAgLy8gYXBwcm92YWxzQ291bnQ6IFVpbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY0LTQ3MwogICAgLy8gY29uc3QgcHJvcG9zYWw6IFByb3Bvc2FsID0gewogICAgLy8gICBncm91cElkLAogICAgLy8gICBzdGF0dXM6IFNUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHBheWxvYWRUeXBlLAogICAgLy8gICBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgLy8gICB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIC8vICAgZXhwaXJ5Um91bmQsCiAgICAvLyAgIHByb3Bvc2VyOiBUeG4uc2VuZGVyLAogICAgLy8gICBudW1QYXlsb2FkczogVWludDY0KDApLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc0CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc0CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NQogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IHBpZCArIFVpbnQ2NCgxKQogICAgZGlnIDMKICAgIGludGNfMyAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgNiAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBwaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBlbWl0PFByb3Bvc2FsQ3JlYXRlZD4oeyBwcm9wb3NhbElkOiBwaWQsIGdyb3VwSWQsIHBheWxvYWRUeXBlLCBwcm9wb3NlcjogVHhuLnNlbmRlciB9KQogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGIzNTFkODU3IC8vIG1ldGhvZCAiUHJvcG9zYWxDcmVhdGVkKHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIHRoaXMuX3JlY29yZEFwcHJvdmFsKHBpZCwgc3RvcmVkKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGNhbGxzdWIgX3JlY29yZEFwcHJvdmFsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIHJldHVybiBwaWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IGJ5dGVzKSAtPiBieXRlczoKX3JlY29yZEFwcHJvdmFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4NgogICAgLy8gcHJpdmF0ZSBfcmVjb3JkQXBwcm92YWwocHJvcG9zYWxJZDogdWludDY0LCBwcm9wb3NhbDogUHJvcG9zYWwpOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4NwogICAgLy8gY29uc3QgcmVjb3JkOiBBcHByb3ZhbCA9IHsgc2lnbmVyOiBUeG4uc2VuZGVyLCByb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyB0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShyZWNvcmQpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDExIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyB0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShyZWNvcmQpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyB1cGRhdGVkLmFwcHJvdmFsc0NvdW50ID0gdXBkYXRlZC5hcHByb3ZhbHNDb3VudCArIFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcmVwbGFjZTIgMjQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5MgogICAgLy8gaWYgKHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgPj0gdXBkYXRlZC50aHJlc2hvbGQpIHsKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPj0KICAgIGJ6IF9yZWNvcmRBcHByb3ZhbF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0OTMKICAgIC8vIHVwZGF0ZWQuc3RhdHVzID0gU1RBVFVTX1JFQURZCiAgICBpbnRjXzAgLy8gMgogICAgaXRvYgogICAgcmVwbGFjZTIgOAoKX3JlY29yZEFwcHJvdmFsX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk1CiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHVwZGF0ZWQpCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5OQogICAgLy8gc2lnbmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwMAogICAgLy8gYXBwcm92YWxzQ291bnQ6IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQsCiAgICBzd2FwCiAgICBleHRyYWN0IDI0IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0OTctNTAxCiAgICAvLyBlbWl0PFByb3Bvc2FsQXBwcm92ZWQ+KHsKICAgIC8vICAgcHJvcG9zYWxJZCwKICAgIC8vICAgc2lnbmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBhcHByb3ZhbHNDb3VudDogdXBkYXRlZC5hcHByb3ZhbHNDb3VudCwKICAgIC8vIH0pCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4OThiM2FjOTQgLy8gbWV0aG9kICJQcm9wb3NhbEFwcHJvdmVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9zdG9yZVBheWxvYWRHcm91cChwcm9wb3NhbElkOiB1aW50NjQsIHBheWxvYWRJbmRleDogdWludDY0LCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXM6Cl9zdG9yZVBheWxvYWRHcm91cDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjgKICAgIC8vIHByaXZhdGUgX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBpZiAocGF5bG9hZC5sZW5ndGggPiBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ6IF9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzAKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMocHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHBheWxvYWRJbmRleCkudmFsdWUgPSBjbG9uZShwYXlsb2FkKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyAxMiAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMwCiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKCl9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2VUeXBlOiB1aW50NjQsIGdyb3VwOiBieXRlcykgLT4gYnl0ZXM6Cl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyBwcml2YXRlIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogU2lnbmVyR3JvdXApOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NQogICAgLy8gaWYgKGNoYW5nZVR5cGUgPT09IEFETV9TRVRfUE9MSUNZKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NgogICAgLy8gYXNzZXJ0KChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX1BPTElDWSkgIT09IFVpbnQ2NCgwKSwgJ3BvbGljeSBhZG1pbiByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMgogICAgJgogICAgYXNzZXJ0IC8vIHBvbGljeSBhZG1pbiByZXF1aXJlZAoKX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gZ3JvdXAgYWRtaW4gcmVxdWlyZWQKICAgIGIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9hZnRlcl9pZl9lbHNlQDMK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyANAgAIAbIBwAHCAe4BxAHGAYIB0AGSASYVAWcBbQQVH3x1AXAEbmdpZARnY250BG5waWQGcGF1c2VkBHxgWeYEYm9vdATQcFB6AWEDdHhnAwaBAQRuYW1lB2NyZWF0b3IDdmVyAgASBAzXNXwCZHACACoxGRREMRhBAGqCDgSRS6YzBJzGGPwE8wMgkwTLqQF2BJITm2AE8f8oqgS/tSSPBJ7DDTEEj8SFNwTdjWHFBBUoLE0EHPGQaQQLFr5aBItk7XI2GgCODgC1AaMC8QRzBbkGExN6E9IUMxRIFF0UgRSiFMsAgAQRV1bbNhoAjgEAPACKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJw2yHicNsh+L/40CAAsABLNC/9syALIBQv/1I7IBQv/viTYaAUkjWSIISwEVEkRXAgAnDksBZycPMQBnJwkjZycEJWcnBiVnJwUjZycHI2cnEIAYQklBVEVDSC1BTEdPLVNBRkUtdjEuMC4wZzEASwEVFlcGAk8CUIACACJPAlBMUIAE4pyLR0xQsCVDNhoBSSNZIghLARUSRFcCADEAIycPZUQSRCMnCWVEFEQyByMnBGVESwIVFlcGAk8DUCUWIxZPBBaAOgBqAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAVBLAlBLAlBMUExQSwFQSwJQSwMWKEsBUEm8SE8Cv4AKAAAAAAAAAAEAKjEAUIAJAAdjcmVhdG9yUEsBMQBQKUxQSbxITL9PAyUIJwRMZyMnBWVEJQgnBUxnJwklZ0knEVBLAlBPA1AnEkxQsDEAUExQJwpMULAlQzYaAUkVJBJEFzYaAkcCI1lJTgIiC0xJFUxXAgAjSUsFDEEAzkcCIgtLA0lPAllJSwdJTgQSREsBFVJJFUsBIQVZSYHwARJESwJMSwJSI1mB8gEISwIhBllJSwISREsDTEsDUiNZIggISwIhCFlJSwISREsDTEsDUiNZIggISwIhCVlJSwISREsDTEsDUiNZIggISwIhC1lJSwISREsDTEsDUiNZIggISwKB0gFZSUsCEkRLA0xLA1IjWSIICEsCgdQBWUlLAhJESwNMSwNSI1kiCAhLAiEHWUlLAhJETwNMTwNSI1kiCAgIRQUlCEUBQv8rSwMiCEsDEkQ2GgNJFSQSRBdLBUlESYEQDkSBAwiBvAULI4j9VSMnB2VEFERLB0mIEi5JFihMUIFiJLoXRCVPAogSNkklSwiIEvVIFitLAVAlFoFQTLsqTFCwJUMjSYAANhoBSRUkEkQXNhoCRwIVJBJEFzYaA0cCI1lJTgIiC0xJFUxXAgAjSUsFDEEAzkcCIgtLA0lPAllJSwdJTgQSREsBFVJJFUsBIQVZSYHwARJESwJMSwJSI1mB8gEISwIhBllJSwISREsDTEsDUiNZIggISwIhCFlJSwISREsDTEsDUiNZIggISwIhCVlJSwISREsDTEsDUiNZIggISwIhC1lJSwISREsDTEsDUiNZIggISwKB0gFZSUsCEkRLA0xLA1IjWSIICEsCgdQBWUlLAhJESwNMSwNSI1kiCAhLAiEHWUlLAhJETwNMTwNSI1kiCAgIRQUlCEUBQv8rSwMiCEsDEkRLBiIPQQBvSwaBBg5BAGclREsEREsIFitMUElFDb5MSU4CRQ1ESYEQWyUSRCRbSUULJRJAAAdLCSISQQA1JURLCkkjW4gQtUsFgQMIgbwFCyOI+8JLCUsISU4CSwmIEXtITIFQWw1BAAdLC4FQSwm7JUMjQv/II0L/ljYaAUkVJBJEF0k2GgJJTgJJFUsBgRBZSYF8EkRLAkxLAlIjWYF+CEsCgTpZSUsCEkRLA0xLA1IjWSIICBJENhoDSRUkEkQXTgJLAYgQNEwWKExQSb5ETIFiJLoXREwjW0lOAklPAogRGEglEkEAOUsCSYE8W0RJVxIgMgMTREmBTFuBDw5EgURbgQcOREsDgQVLA4gQBRYnE0sBUEm8SEsEvypMULAlQ0kiEkEAF0sCSVcICChMUL1FAURXEiAyAxNEQv/ISYEDEkEAD0sCVwgIKExQvUUBREL/skmBBBJBABRLAklXCAgoTFC9RQFEgTxbREL/l0mBBRJBABdLAklXCAgoTFC9RQFEgUxbgQ8OREL/eUmBBhJBABdLAklXCAgoTFC9RQFEgURbgQcOREL/W0mBBxJESwJXCAgoTFC9RQFEQv9HNhoBSRUkEkQXSRZJK0xQvkxJTwJEJFtJJRJAAAZJIhJBADMlRDIGSwJJTgKBKFsORElXAAgxAFApTFC9RQFESwMxAFAnC0xQvUUBFERLBEyID2xIJUMjQv/KI0cIgABHCTYaAUkVJBJEF0kjJwdlRBREFkkrTFBJvkxJTwJESSRbIhJESYEYW0sBgSBbD0QyBksBgShbDkRJVwAIKExQSU4CSb5MTgNEgWIkuhdEgRBbJRJBChdLAoFQW0UMgfgKI4j5kiNFCSVFC0cCRRVFE0sKSwwOQQnXSwWBBwtLCwgWJwxMUElFGr1FAUAAEUsTRRJLCiUIRQtLEUUUQv/RSxi+TEUSRCNFDksTRRJLGCMiuhdLDg1B/9kiSw4LIghJRRBLGUlPAiK6FyIIJLoXSUUJJRJJRQtBCO5LEoEaWyUaREsYSUsQIroXSYEKCEsCTIEgujIDE0SBMggkuhdBABJLGElLECK6F4E6CIEgujIDE0RLB4EEE0QjRRBJgSJbSUUIQAh0SwlBABBLGElLECK6F4EqCCS6F0UQSw9BAHsyB0UNSYEqW0EANEmBOltLDUwJgYCjBQ9BAA4jFksBTFwySw0WXDpFAUcCgTJbSxEISwGBKltLAQ9EFlwyRQFJgUJbQQA1SYFSW0sNTAmBgJqeAQ9BAA4jFksBTFxKSw0WXFJFAUcCgUpbSxEISwGBQltLAQ9EFlxKRQFLCUEBx0sYSUsQIroXgTIIJLoXQQDxSwhAAH6xSxhJSxAiuhdJgQoISwJMgSC6SwGBKghLA0wkuhdPAoE6CE8DTIEguksTSVcCAEwjWUsSSSILSwNMWUwlCE8CSwEJSwMVTwIiC0sETFlPAk1SSSEHWUsBFVJXAgCyBbIJsgiyByWyECOyAUsIJQhFCUsNJQhFDksSRRJC/lm2SxhJSxAiuhdJgQoISwJMgSC6SwGBKghLA0wkuhdPAoE6CE8DTIEguksTSVcCAEwjWUsSSSILSwNMWUwlCE8CSwEJSwMVTwIiC0sETFlPAk1SSSEHWUsBFVJXAgCyBbIJsgiyByWyECOyAUL/f0sIQABgsUsYSUsQIroXSYEKCEsCTIEgukyBKghPAkwkuhdLEklXAgBMI1lLEUkiC0sDTFlMJQhPAksBCUsDFU8CIgtLBExZTwJNUkkhB1lLARVSVwIAsgWyCLIHJbIQI7IBQv8atksYSUsQIroXSYEKCEsCTIEgukyBKghPAkwkuhdLEklXAgBMI1lLEUkiC0sDTFlMJQhPAksBCUsDFU8CIgtLBExZTwJNUkkhB1lLARVSVwIAsgWyCLIHJbIQI7IBQv66SwciEkEB8ksYSUsQIroXgYoBCCS6F0EA/UsIQAB8sUsYSUsQIroXSYFaCEsCTCS6F0sBgWIISwNMgSC6SwIhCghLBEwkuhdPAyEMCE8ETIEguksUSVcCAEwjWUsTSSILSwNMWUwlCE8CSwEJSwMVTwIiC0sETFlPAk1SSSEHWUsBFVJXAgCyBbIVshKyFLIRgQSyECOyAUL+ILZLGElLECK6F0mBWghLAkwkuhdLAYFiCEsDTIEguksCIQoISwRMJLoXTwMhDAhPBEyBILpLFElXAgBMI1lLE0kiC0sDTFlMJQhPAksBCUsDFU8CIgtLBExZTwJNUkkhB1lLARVSVwIAsgWyFbISshSyEYEEshAjsgFC/aRLCEAAb7FLGElLECK6F0mBWghLAkwkuhdLAYFiCEsDTIEguk8CIQoITwNMJLoXSxNJVwIATCNZSxJJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQdZSwEVUlcCALIFshKyFLIRgQSyECOyAUL9MLZLGElLECK6F0mBWghLAkwkuhdLAYFiCEsDTIEguk8CIQoITwNMJLoXSxNJVwIATCNZSxJJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQdZSwEVUlcCALIFshKyFLIRgQSyECOyAUL8wUsHgQMSREsYSUsQIroXgboBCCS6F0lFCUAAO0sIQAAbsUsYSUsQIroXIQQIJLoXshiBBrIQI7IBQvyGtksYSUsQIroXIQQIJLoXshiBBrIQI7IBQvxrSwclEkEAq0sIQABTsUsYSUsQIroXIQQIJLoXSxFJVwIATCNZSxBJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQVZSwEhBllSVwIAshqyGIEGshAjsgFC/Ay2SxhJSxAiuhchBAgkuhdLEUlXAgBMI1lLEEkiC0sDTFlMJQhPAksBCUsDFU8CIgtLBExZTwJNUkkhBVlLASEGWVJXAgCyGrIYgQayECOyAUL7uUsHIhJBANtLCEAAa7FLGElLECK6FyEECCS6F0sRSVcCAEwjWUsQSSILSwNMWUwlCE8CSwEJSwMVTwIiC0sETFlPAk1SSSEFWUsBIQZZSwJPAksCUlcCAEsCIQhZTwNPA08CUlcCAEyyGrIashiBBrIQI7IBQvtCtksYSUsQIroXIQQIJLoXSxFJVwIATCNZSxBJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQVZSwEhBllLAk8CSwJSVwIASwIhCFlPA08DTwJSVwIATLIashqyGIEGshAjsgFC+tdLB4EDEkEBAUsIQAB+sUsYSUsQIroXIQQIJLoXSxFJVwIATCNZSxBJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQVZSwEhBllLAk8CSwJSVwIASwIhCFlLA08DSwJSVwIASwMhCVlPBE8DTwJSVwIATwKyGkyyGrIashiBBrIQI7IBQvpMtksYSUsQIroXIQQIJLoXSxFJVwIATCNZSxBJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQVZSwEhBllLAk8CSwJSVwIASwIhCFlLA08DSwJSVwIASwMhCVlPBE8DTwJSVwIATwKyGkyyGrIashiBBrIQI7IBQvnOSwhAAJGxSxhJSxAiuhchBAgkuhdLEUlXAgBMI1lLEEkiC0sDTFlMJQhPAksBCUsDFU8CIgtLBExZTwJNUkkhBVlLASEGWUsCTwJLAlJXAgBLAiEIWUsDTwNLAlJXAgBLAyEJWUsETwNLAlJXAgBLBCELWU8FTwNPAlJXAgBPA7IaTwKyGkyyGrIashiBBrIQI7IBQvk4tksYSUsQIroXIQQIJLoXSxFJVwIATCNZSxBJIgtLA0xZTCUITwJLAQlLAxVPAiILSwRMWU8CTVJJIQVZSwEhBllLAk8CSwJSVwIASwIhCFlLA08DSwJSVwIASwMhCVlLBE8DSwJSVwIASwQhC1lPBU8DTwJSVwIATwOyGk8CshpMshqyGrIYgQayECOyAUL4p0sHIhJB95pLGElLECK6F4FaCCS6F0sHEkH3hksYSUsQIroXIQoIJLoXRRBC93NLByISQQA9SxKBGlsiGkRLGElLECK6F0mBYghLAkyBILoyAxNEgYoBCCS6F0H3HEsYSUsQIroXIQwIgSC6MgMTREL3B0sHgQMSQQAqSxKBGluBBBpESxhJSxAiuhdJIQQISwJMJLoXRIG6AQgkuheBBA5EQvbVSweBBBJESxKBGlskGkRC9sRLAUm8SEsBv7OBAxZLBCRPAruABDXGfv1LBVCwJUMnE0sFUElFGUm+TEUYREkjJLoXSwKIBVZIIyS6F0lFCSUSQQEWMgcjJwRlREsZSYE8JLoXSSUOREsZSYEQWUsBgTpZSwJPAksCUlcCAEsEgUQkuhdLBYFMJLoXSwaBVCS6F0sHgVwkuhdLCIFkJLoXSwmBbCS6F0sGFRZXBgJPB1BPCRaAAgBqSwFQJRZMSwFQTwkWUE8IFlBPBxZQTwYWUCMWTEsBUE8LFkxLAVBPBxZQTwJQTFBPBBZQTFBLAlBLBhYoSwFQSbxITwK/SwWBMiS6F0sFFU8GTwZPAlJXAgBPBYMCEiC6TwIWSwIVFlcGAk8DUEsBJxRQSwNQTFBLA08DUClLAVBJvEhPAr9PBSUIJwRMZyMnBWVEJQgnBUxnTwInEVBPA1BPA1AnEkxQsExQJwpMULBC/rBLByISQQBqSxdJJEm6F0sBgwISILpMFklLAlApSwFQSb1FARRETwSBMiS6F0saSYE6WUsBFVJXAgBMFksBFRZXBgJPAlBLAScUUE8GUExQSwK8SE8CTL8oTwNQSYEKJLoXJQgWgQpMu1AnCkxQsEL+P0sHgQMSQQBHSxdJJEm6F0yDAhIgukwWSU8CUClLAVBJvUUBRChPA1BJgQokuhclCUsBIiS6F0sBDkRPArxIFoEKTLuABCsUwsFMULBC/fBLB4EEEkEAKEsXSSRJuhcWKEsBUE8CgTwkukkXSwKBCiS6Fw5EIky7JwhMULBC/cBLB4EFEkEAeUsXSSRJuhcWSUUXKExQSUUZSb5ETIEiJLoXSwKBVCS6SRdPAhNLA4FMJLpPA0xcGk8CXCJLAoFcJLpcKksCgWQkulxCTwKBbCS6XFpMQQAZMgcjFk8CSwFcMk8CFkxLAVw6TwJcSkxcUksXSbxITL8nCEsVULBC/T9LB4EGEkEAHksXSSRJuhcWKEsBUE8CgUQkuoESTLsnCExQsEL9GUsXSSRJuhcWKEsBUE8CgXQkuhcUFBaBYky7JwhMULBC/Pc2GgFJFSQSRBcWSStMUEm+TElPAkQkW0klEkAABkkiEkEAMSVEMQBLAklOAlcwIBJMVwAIMQBQKUxQvUUBEUSBBBZLAyRPAruABK4qvAZLBFCwJUMjQv/MIycOZUQjJwVlRCMnBGVEIycGZUQjJwdlRCMnEGVESwUVFlcGAk8GUEkVgSQITwYWgAIAJExQTwYWUE8FFlBPBBZQSwMVFlcGAk8EUE8CFlcGAk8CTFBPAlBMUCpMULAlQzYaAUkVJBJEFxYoTFC+RCpMULAlQzYaAUkVJBJEFxYrTFC+RCpMULAlQzYaAUkVJBJEFzYaAkkVJBJEF0yBBwsIFicMTFC+RCpMULAlQzYaAUkVJBJEFzYaAkkVgSASREwWTFApTFC+RCpMULAlQzYaAUkVJBJEFzYaAkkVgSASREwWTFApTFC9RQGAAQAjTwJUKkxQsCVDNhoBSRUkEkQXNhoCSRWBIBJETBZMUCcLTFC9RQGAAQAjTwJUKkxQsCVDigEAi/8WKEsBUL1FAUQxAFApTFC9RQFEiYoDAYv/MgYNRIv9FihLAVAjJwZlREwiJLoXMQAlFksETFCL/hZMSwFQIxZMSwFQTwQWUIv/FlBPA1BMUEsCFitLAVBLAr9LAyUIJwZMZzEATE8FUE8DUExQgASzUdhXTFCwSwFMiAACSImKAgExADIGFlAxAIv+FklOA0xQJwtMUEy/i/+BGFslCBaL/0xcGEcCgRhbTIEgWw9BAAQiFlwIK4sASU4CUE8CSU4CvzEATFcYCE4CUExQgASYs6yUTFCwi/9MiYoDAYv/I1lBABOL/YEHC4v+CBYnDExQSbxIi/+/i/+JigIBi/6BBRJBAAuL/4ESWyIaRIv/iYv/gRJbJRpEQv/y", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }