{ "name": "StakingPool", "structs": { "StakedInfo": [ { "name": "account", "type": "address" }, { "name": "balance", "type": "uint64" }, { "name": "totalRewarded", "type": "uint64" }, { "name": "rewardTokenBalance", "type": "uint64" }, { "name": "entryRound", "type": "uint64" } ], "PoolTokenPayoutRatio": [ { "name": "poolPctOfWhole", "type": "uint64[24]" }, { "name": "updatedForPayout", "type": "uint64" } ], "ValidatorPoolKey": [ { "name": "id", "type": "uint64" }, { "name": "poolId", "type": "uint64" }, { "name": "poolAppId", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "uint64", "name": "creatingContractId", "desc": "- id of contract that constructed us - the validator application (single global instance)" }, { "type": "uint64", "name": "validatorId", "desc": "- id of validator we're a staking pool of" }, { "type": "uint64", "name": "poolId", "desc": "- which pool id are we" }, { "type": "uint64", "name": "minEntryStake", "desc": "- minimum amount to be in pool, but also minimum amount balance can't go below (without removing all!)" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialize the staking pool w/ owner and manager, but can only be created by the validator contract.", "events": [], "recommendations": {} }, { "name": "gas", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "gas is a dummy no-op call that can be used to pool-up resource references and opcode cost", "events": [], "recommendations": {} }, { "name": "initStorage", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "payment from caller which covers mbr increase of new staking pools' storage" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Called after we're created and then funded, so we can create our large stakers ledger storage\nCaller has to get MBR amounts from ValidatorRegistry to know how much to fund us to cover the box storage cost\nIf this is pool 1 AND the validator has specified a reward token, opt-in to that token\nso that the validator can seed the pool with future rewards of that token.", "events": [], "recommendations": {} }, { "name": "addStake", "args": [ { "type": "pay", "name": "stakedAmountPayment", "desc": "prior payment coming from validator contract to us on behalf of staker." }, { "type": "address", "name": "staker", "desc": "- The account adding new stake" } ], "returns": { "type": "uint64", "desc": "new 'entry round' round number of stake add" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds stake to the given account.\nCan ONLY be called by the validator contract that created us\nMust receive payment from the validator contract for amount being staked.", "events": [], "recommendations": {} }, { "name": "removeStake", "args": [ { "type": "address", "name": "staker", "desc": "- account to remove. normally same as sender, but the validator owner or manager can also call\nthis to remove the specified staker explicitly. The removed stake MUST only go to the staker of course. This is\nso a validator can shut down a poool and refund the stakers. It can also be used to kick out stakers who no longer\nmeet the gating requirements (determined by the node daemon)." }, { "type": "uint64", "name": "amountToUnstake", "desc": "- The amount of stake to be removed. Specify 0 to remove all stake." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Removes stake on behalf of caller (removing own stake). If any token rewards exist, those are always sent in\nfull. Also notifies the validator contract for this pools validator of the staker / balance changes.", "events": [], "recommendations": {} }, { "name": "claimTokens", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Claims all the available reward tokens a staker has available, sending their entire balance to the staker from\npool 1 (either directly, or via validator->pool1 to pay it out)\nAlso notifies the validator contract for this pools validator of the staker / balance changes.", "events": [], "recommendations": {} }, { "name": "getStakerInfo", "args": [ { "type": "address", "name": "staker", "desc": "- The address of the staker." } ], "returns": { "type": "(address,uint64,uint64,uint64,uint64)", "struct": "StakedInfo", "desc": "- The staked information for the given staker." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Retrieves the staked information for a given staker.", "events": [], "recommendations": {} }, { "name": "payTokenReward", "args": [ { "type": "address", "name": "staker", "desc": "- the staker account to send rewards to" }, { "type": "uint64", "name": "rewardToken", "desc": "- id of reward token (to avoid re-entrancy in calling validator back to get id)" }, { "type": "uint64", "name": "amountToSend", "desc": "- amount to send the staker (there is significant trust here(!) - also why only validator can call us" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "[Internal protocol method] Remove a specified amount of 'community token' rewards for a staker.\nThis can ONLY be called by our validator and only if we're pool 1 - with the token.\nNote: this can also be called by validator as part of OWNER wanting to send the reward tokens\nsomewhere else (ie if they're sunsetting their validator and need the reward tokens back).\nIt's up to the validator to ensure that the balance in rewardTokenHeldBack is honored.", "events": [], "recommendations": {} }, { "name": "updateAlgodVer", "args": [ { "type": "string", "name": "algodVer", "desc": "- string representing the algorand node daemon version (reti node daemon composes its own meta version)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the (honor system) algod version for the node associated to this pool. The node management daemon\nshould compare its current nodes version to the version stored in global state, updating when different.\nThe reti node daemon composes its own version string using format:\n{major}.{minor}.{build} {branch} [{commit hash}],\nie: 3.22.0 rel/stable [6b508975]\n[ ONLY OWNER OR MANAGER CAN CALL ]", "events": [], "recommendations": {} }, { "name": "epochBalanceUpdate", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Updates the balance of stakers in the pool based on the received 'rewards' (current balance vs known staked balance)\nstakers outstanding balance is adjusted based on their % of stake and time in the current epoch - so that balance\ncompounds over time and staker can remove that amount at will.\nThe validator is paid their percentage each epoch payout.\n\nNote: ANYONE can call this.", "events": [], "recommendations": {} }, { "name": "goOnline", "args": [ { "type": "pay", "name": "feePayment", "desc": "- payment to cover extra fee of going online if offline - or 0 if not renewal" }, { "type": "byte[32]", "name": "votePK", "desc": "- The vote public key." }, { "type": "byte[32]", "name": "selectionPK", "desc": "- The selection public key." }, { "type": "byte[64]", "name": "stateProofPK", "desc": "- The state proof public key." }, { "type": "uint64", "name": "voteFirst", "desc": "- The first vote index." }, { "type": "uint64", "name": "voteLast", "desc": "- The last vote index." }, { "type": "uint64", "name": "voteKeyDilution", "desc": "- The vote key dilution value." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Registers a staking pool key online against a participation key.\n[ ONLY OWNER OR MANAGER CAN CALL ]", "events": [], "recommendations": {} }, { "name": "goOffline", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Marks a staking pool key OFFLINE.\n[ ONLY OWNER OR MANAGER CAN CALL ]", "events": [], "recommendations": {} }, { "name": "linkToNFD", "args": [ { "type": "uint64", "name": "nfdAppId" }, { "type": "string", "name": "nfdName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "proxiedSetTokenPayoutRatio", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey", "desc": "- ValidatorPoolKey tuple" } ], "returns": { "type": "(uint64[24],uint64)", "struct": "PoolTokenPayoutRatio" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "proxiedSetTokenPayoutRatio is meant to be called by pools != 1 - calling US, pool #1\nWe need to verify that we are in fact being called by another of OUR pools (not us)\nand then we'll call the validator on their behalf to update the token payouts", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "StakingPool contract has a new instance deployed per staking pool added by any validator. A single instance\nis initially immutably deployed, and the id of that instance is used as a construction parameter in the immutable\ninstance of the master ValidatorRegistry contract. It then uses that StakingPool instance as a 'factory template'\nfor subsequent pool creations - using the on-chain bytecode of that deployed instance to create a new identical\ninstance.\n\nEach instance is explicitly 'linked' to the validator master via its creation parameters. The validator master\ncontract only allows calls from staking pool contract instances that match data that only the validator master\nauthoritatively has (validator id X, pool Y - has to come from contract address of that pool). Calls the pools\nvalidate coming from the validator are only allowed if it matches the validator id it was created with.", "networks": {}, "state": { "schema": { "global": { "ints": 11, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "creatingValidatorContractAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3JlYXRvckFwcA==" }, "validatorId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmFsaWRhdG9ySWQ=" }, "poolId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cG9vbElk" }, "numStakers": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtU3Rha2Vycw==" }, "totalAlgoStaked": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3Rha2Vk" }, "minEntryStake": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWluRW50cnlTdGFrZQ==" }, "lastPayout": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdFBheW91dA==" }, "epochNumber": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXBvY2hOdW1iZXI=" }, "algodVer": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "YWxnb2RWZXI=" }, "roundsPerDay": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cm91bmRzUGVyRGF5" }, "binRoundStart": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YmluUm91bmRTdGFydA==" }, "stakeAccumulator": { "keyType": "AVMString", "valueType": "uint128", "key": "c3Rha2VBY2N1bXVsYXRvcg==" }, "rewardAccumulator": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmV3YXJkQWNjdW11bGF0b3I=" }, "weightedMovingAverage": { "keyType": "AVMString", "valueType": "uint128", "key": "ZXdtYQ==" } }, "local": {}, "box": { "stakers": { "keyType": "AVMString", "valueType": "(address,uint64,uint64,uint64,uint64)[200]", "key": "c3Rha2Vycw==" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 961, 1180, 1634, 1864, 2643, 3067 ], "errorMessage": "Box must have value" }, { "pc": [ 738, 1339, 1734, 2027, 2152, 2212, 2259, 3786, 4025, 4075, 4119 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 1169 ], "errorMessage": "If staker is not sender in removeStake call, then sender MUST be owner or manager of validator" }, { "pc": [ 1254 ], "errorMessage": "Insufficient balance" }, { "pc": [ 112, 131, 153, 165, 208, 220, 238, 261, 280, 292, 311, 341, 363, 372 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 1083 ], "errorMessage": "Staking pool full" }, { "pc": [ 2270, 2281, 3574, 3578 ], "errorMessage": "account funded" }, { "pc": [ 1187, 1641, 1871 ], "errorMessage": "account not found" }, { "pc": [ 851, 873, 1924, 2162, 3868, 4041 ], "errorMessage": "application exists" }, { "pc": [ 783, 892, 3822 ], "errorMessage": "assert target is match for conditions" }, { "pc": [ 3972 ], "errorMessage": "callee must be pool 1" }, { "pc": [ 3985 ], "errorMessage": "caller must NOT be pool 1" }, { "pc": [ 3964 ], "errorMessage": "caller must be part of same validator set!" }, { "pc": [ 1966, 3796, 3876, 3893 ], "errorMessage": "can only be called by owner or manager of validator" }, { "pc": [ 376 ], "errorMessage": "can only call when creating" }, { "pc": [ 115, 134, 156, 168, 211, 223, 241, 264, 283, 295, 314, 344, 366 ], "errorMessage": "can only call when not creating" }, { "pc": [ 1937 ], "errorMessage": "can only claim token rewards from validator that has them" }, { "pc": [ 2064 ], "errorMessage": "can't call epochBalanceUpdate in same epoch as prior call" }, { "pc": [ 1405 ], "errorMessage": "cannot reduce balance below minimum allowed stake unless all is removed" }, { "pc": [ 664, 708, 712, 750, 799, 848, 870, 906, 918, 923, 932, 1088, 1139, 1271, 1299, 1309, 1313, 1397, 1450, 1490, 1495, 1508, 1527, 1531, 1536, 1694, 1704, 1708, 1776, 1780, 1785, 1921, 1931, 1996, 2000, 2055, 2076, 2103, 2113, 2117, 2167, 2177, 2181, 2225, 2229, 2275, 2387, 2877, 2952, 3042, 3360, 3365, 3374, 3386, 3415, 3427, 3431, 3436, 3737, 3742, 3865, 3951, 3969, 3990, 4084, 4088, 4161, 4168, 4196, 4216, 4266, 4294, 4300, 4326, 4338 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1934 ], "errorMessage": "must be pool 1 in order to be called to pay out token rewards" }, { "pc": [ 1092 ], "errorMessage": "must stake at least the minimum for this pool" }, { "pc": [ 501, 557, 580, 948, 1515, 3403, 4279, 4307, 4364 ], "errorMessage": "overflow" }, { "pc": [ 853 ], "errorMessage": "stake can only be added via the validator contract" }, { "pc": [ 703 ], "errorMessage": "staking pool already initialized" }, { "pc": [ 842 ], "errorMessage": "staking pool must be initialized first" }, { "pc": [ 618 ], "errorMessage": "staking pool must have minimum entry of 1 algo" }, { "pc": [ 1926 ], "errorMessage": "this can only be called via the validator contract" }, { "pc": [ 178, 324, 354 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDY0IDE2IDIwMCAxNTcgMzAwIDIxMDAwMDAgMTAwMDAwMCAzMDg1NyBUTVBMX05GRF9SRUdJU1RSWV9BUFBfSUQKICAgIGJ5dGVjYmxvY2sgInN0YWtlcnMiICJjcmVhdG9yQXBwIiAweDE1MWY3Yzc1ICJ2YWxpZGF0b3JJZCIgInBvb2xJZCIgInN0YWtlZCIgInJvdW5kc1BlckRheSIgInN0YWtlQWNjdW11bGF0b3IiIDB4MDAwMiAiYmluUm91bmRTdGFydCIgIm51bVN0YWtlcnMiICJyZXdhcmRBY2N1bXVsYXRvciIgImV3bWEiIDB4NzVhZmY2MWQgMHg2NCAibWluRW50cnlTdGFrZSIgImxhc3RQYXlvdXQiICJlcG9jaE51bWJlciIgMHgwMDAxMDAwMDAwMDAwMDBmNDI0MCAweDAwMDEgMHgwYzIyNDVlMSAweDA2ODEwMSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMHhhMmRjNTFiNSAweDU3Mjc2N2QxIDB4NGRmOGQ4NmUgMHgwMDAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjgtNjkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDIwCiAgICBwdXNoYnl0ZXNzIDB4NTllOTBhYTYgMHgzMTcyY2E5ZCAweDQ3Y2ZjYzA0IDB4ZjljNzBjYmQgMHg0MjFiNWFiZSAweGY1ODkyZDU2IDB4NWNmYmIwNTcgMHg2M2YzZjI4YiAweDg2YTM3MjVjIDB4ZWZjMjYwOGQgMHg5Y2VlMmU0MCAweDUxZWYzYjIxIDB4YTI0ZTI3MTcgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2FzKCl2b2lkIiwgbWV0aG9kICJpbml0U3RvcmFnZShwYXkpdm9pZCIsIG1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyZW1vdmVTdGFrZShhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjbGFpbVRva2Vucygpdm9pZCIsIG1ldGhvZCAiZ2V0U3Rha2VySW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBbGdvZFZlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZXBvY2hCYWxhbmNlVXBkYXRlKCl2b2lkIiwgbWV0aG9kICJnb09ubGluZShwYXksYnl0ZVszMl0sYnl0ZVszMl0sYnl0ZVs2NF0sdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ29PZmZsaW5lKCl2b2lkIiwgbWV0aG9kICJsaW5rVG9ORkQodWludDY0LHN0cmluZyl2b2lkIgogICAgYnl0ZWMgMjAgLy8gbWV0aG9kICJwcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbygodWludDY0LHVpbnQ2NCx1aW50NjQpKSh1aW50NjRbMjRdLHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDMgbWFpbl9nYXNfcm91dGVANCBtYWluX2luaXRTdG9yYWdlX3JvdXRlQDUgbWFpbl9hZGRTdGFrZV9yb3V0ZUA2IG1haW5fcmVtb3ZlU3Rha2Vfcm91dGVANyBtYWluX2NsYWltVG9rZW5zX3JvdXRlQDggbWFpbl9nZXRTdGFrZXJJbmZvX3JvdXRlQDkgbWFpbl9wYXlUb2tlblJld2FyZF9yb3V0ZUAxMCBtYWluX3VwZGF0ZUFsZ29kVmVyX3JvdXRlQDExIG1haW5fZXBvY2hCYWxhbmNlVXBkYXRlX3JvdXRlQDEyIG1haW5fZ29PbmxpbmVfcm91dGVAMTMgbWFpbl9nb09mZmxpbmVfcm91dGVAMTQgbWFpbl9saW5rVG9ORkRfcm91dGVAMTUgbWFpbl9wcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAxNgoKbWFpbl9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4LTY5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9wcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NzkKICAgIC8vIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NzkKICAgIC8vIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICBjYWxsc3ViIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2xpbmtUb05GRF9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NTYKICAgIC8vIGxpbmtUb05GRChuZmRBcHBJZDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4LTY5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NTYKICAgIC8vIGxpbmtUb05GRChuZmRBcHBJZDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGNhbGxzdWIgbGlua1RvTkZECiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dvT2ZmbGluZV9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NDMKICAgIC8vIGdvT2ZmbGluZSgpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnb09mZmxpbmUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ29PbmxpbmVfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTEzLTkyMQogICAgLy8gZ29PbmxpbmUoCiAgICAvLyAgIGZlZVBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdm90ZVBLOiBieXRlczwzMj4sCiAgICAvLyAgIHNlbGVjdGlvblBLOiBieXRlczwzMj4sCiAgICAvLyAgIHN0YXRlUHJvb2ZQSzogYnl0ZXM8NjQ+LAogICAgLy8gICB2b3RlRmlyc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUxhc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUtleURpbHV0aW9uOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4LTY5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTEzLTkyMQogICAgLy8gZ29PbmxpbmUoCiAgICAvLyAgIGZlZVBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdm90ZVBLOiBieXRlczwzMj4sCiAgICAvLyAgIHNlbGVjdGlvblBLOiBieXRlczwzMj4sCiAgICAvLyAgIHN0YXRlUHJvb2ZQSzogYnl0ZXM8NjQ+LAogICAgLy8gICB2b3RlRmlyc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUxhc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUtleURpbHV0aW9uOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGNhbGxzdWIgZ29PbmxpbmUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZXBvY2hCYWxhbmNlVXBkYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU0NAogICAgLy8gZXBvY2hCYWxhbmNlVXBkYXRlKCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGVwb2NoQmFsYW5jZVVwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl91cGRhdGVBbGdvZFZlcl9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MzEKICAgIC8vIHVwZGF0ZUFsZ29kVmVyKGFsZ29kVmVyOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4LTY5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MzEKICAgIC8vIHVwZGF0ZUFsZ29kVmVyKGFsZ29kVmVyOiBzdHJpbmcpOiB2b2lkIHsKICAgIGNhbGxzdWIgdXBkYXRlQWxnb2RWZXIKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5VG9rZW5SZXdhcmRfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTAzCiAgICAvLyBwYXlUb2tlblJld2FyZChzdGFrZXI6IEFkZHJlc3MsIHJld2FyZFRva2VuOiB1aW50NjQsIGFtb3VudFRvU2VuZDogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MDMKICAgIC8vIHBheVRva2VuUmV3YXJkKHN0YWtlcjogQWRkcmVzcywgcmV3YXJkVG9rZW46IHVpbnQ2NCwgYW1vdW50VG9TZW5kOiB1aW50NjQpOiB2b2lkIHsKICAgIGNhbGxzdWIgcGF5VG9rZW5SZXdhcmQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0U3Rha2VySW5mb19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ4MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0ODIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXRTdGFrZXJJbmZvCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NsYWltVG9rZW5zX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDEzCiAgICAvLyBjbGFpbVRva2VucygpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbGFpbVRva2VucwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVTdGFrZV9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMwMQogICAgLy8gcmVtb3ZlU3Rha2Uoc3Rha2VyOiBBZGRyZXNzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjgtNjkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzAxCiAgICAvLyByZW1vdmVTdGFrZShzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFRvVW5zdGFrZTogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHJlbW92ZVN0YWtlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZFN0YWtlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjE2CiAgICAvLyBhZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIHN0YWtlcjogQWRkcmVzcyk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjIxNgogICAgLy8gYWRkU3Rha2Uoc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBzdGFrZXI6IEFkZHJlc3MpOiB1aW50NjQgewogICAgY2FsbHN1YiBhZGRTdGFrZQogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9pbml0U3RvcmFnZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE3NAogICAgLy8gaW5pdFN0b3JhZ2UobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE3NAogICAgLy8gaW5pdFN0b3JhZ2UobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdm9pZCB7CiAgICBjYWxsc3ViIGluaXRTdG9yYWdlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dhc19yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE1OAogICAgLy8gZ2FzKCk6IHZvaWQge30KICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEyOQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24oY3JlYXRpbmdDb250cmFjdElkOiBBcHBsaWNhdGlvbiwgdmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQsIG1pbkVudHJ5U3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OC02OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMjkKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogQXBwbGljYXRpb24sIHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xJZDogdWludDY0LCBtaW5FbnRyeVN0YWtlOiB1aW50NjQpOiB2b2lkIHsKICAgIGNhbGxzdWIgY3JlYXRlQXBwbGljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDcKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDIxIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjp3aWRlUmF0aW8obnVtZXJhdG9yRmFjdG9yczogYnl0ZXMsIGRlbm9taW5hdG9yRmFjdG9yczogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzOgp3aWRlUmF0aW86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHdpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiB1aW50NjRbXSwgZGVub21pbmF0b3JGYWN0b3JzOiB1aW50NjRbXSk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDMKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjUKICAgIC8vIGxldCBudW1lcmF0b3IgPSBuZXcgVWludDEyOCgxbikKICAgIGJ5dGVjIDIyIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdXRpbHMuYWxnby50czo2CiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBudW1lcmF0b3JGYWN0b3JzKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCndpZGVSYXRpb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6NgogICAgLy8gZm9yIChjb25zdCBmYWN0b3Igb2YgbnVtZXJhdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiB3aWRlUmF0aW9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjcKICAgIC8vIG51bWVyYXRvciA9IG5ldyBVaW50MTI4KEJpZ1VpbnQoZmFjdG9yKSAqIG51bWVyYXRvci5uYXRpdmUpCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMwogICAgYioKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMyAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgd2lkZVJhdGlvX2Zvcl9oZWFkZXJAMQoKd2lkZVJhdGlvX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjEwCiAgICAvLyBsZXQgZGVub21pbmF0b3IgPSBuZXcgVWludDEyOCgxbikKICAgIGJ5dGVjIDIyIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjExCiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBkZW5vbWluYXRvckZhY3RvcnMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCndpZGVSYXRpb19mb3JfaGVhZGVyQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6MTEKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIGRlbm9taW5hdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB3aWRlUmF0aW9fYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjEyCiAgICAvLyBkZW5vbWluYXRvciA9IG5ldyBVaW50MTI4KEJpZ1VpbnQoZmFjdG9yKSAqIGRlbm9taW5hdG9yLm5hdGl2ZSkKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18zIC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB3aWRlUmF0aW9fZm9yX2hlYWRlckA1Cgp3aWRlUmF0aW9fYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6MTUKICAgIC8vIGNvbnN0IHJhdGlvOiBiaWd1aW50ID0gbnVtZXJhdG9yLm5hdGl2ZSAvIGRlbm9taW5hdG9yLm5hdGl2ZQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gbmV3IFVpbnQ2NChyYXRpbykubmF0aXZlCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBiemVybwogICAgYnwKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogdWludDY0LCB2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCwgbWluRW50cnlTdGFrZTogdWludDY0KSAtPiB2b2lkOgpjcmVhdGVBcHBsaWNhdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMjkKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogQXBwbGljYXRpb24sIHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xJZDogdWludDY0LCBtaW5FbnRyeVN0YWtlOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEzMAogICAgLy8gaWYgKGNyZWF0aW5nQ29udHJhY3RJZCA9PT0gQXBwbGljYXRpb24oMCkpIHsKICAgIGZyYW1lX2RpZyAtNAogICAgYm56IGNyZWF0ZUFwcGxpY2F0aW9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTMyCiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgPT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEzMwogICAgLy8gYXNzZXJ0KHBvb2xJZCA9PT0gMCkKICAgIGZyYW1lX2RpZyAtMgogICAgIQogICAgYXNzZXJ0CgpjcmVhdGVBcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTM4CiAgICAvLyBhc3NlcnQobWluRW50cnlTdGFrZSA+PSBNSU5fQUxHT19TVEFLRV9QRVJfUE9PTCwgJ3N0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28nKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDggLy8gMTAwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBzdGFraW5nIHBvb2wgbXVzdCBoYXZlIG1pbmltdW0gZW50cnkgb2YgMSBhbGdvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMzkKICAgIC8vIHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlID0gY3JlYXRpbmdDb250cmFjdElkLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzcKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnZhbGlkYXRvcklkLnZhbHVlID0gdmFsaWRhdG9ySWQKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNDEKICAgIC8vIHRoaXMucG9vbElkLnZhbHVlID0gcG9vbElkCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODMKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDEwIC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE0MgogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTQzCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4CiAgICAvLyBtaW5FbnRyeVN0YWtlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21pbkVudHJ5U3Rha2UnIH0pCiAgICBieXRlYyAxNSAvLyAibWluRW50cnlTdGFrZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNDQKICAgIC8vIHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSA9IG1pbkVudHJ5U3Rha2UKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5MQogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTYgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTQ1CiAgICAvLyB0aGlzLmxhc3RQYXlvdXQudmFsdWUgPSBHbG9iYWwucm91bmQgLy8gc2V0IHRvIGluaXQgYmxvY2sgdG8gZXN0YWJsaXNoIGJhc2VsaW5lCiAgICBnbG9iYWwgUm91bmQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTQKICAgIC8vIGVwb2NoTnVtYmVyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Vwb2NoTnVtYmVyJyB9KQogICAgYnl0ZWMgMTcgLy8gImVwb2NoTnVtYmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE0NgogICAgLy8gdGhpcy5lcG9jaE51bWJlci52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE0OAogICAgLy8gdGhpcy5zZXRSb3VuZHNQZXJEYXkoKQogICAgY2FsbHN1YiBzZXRSb3VuZHNQZXJEYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNDkKICAgIC8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IEdsb2JhbC5yb3VuZCAtIChHbG9iYWwucm91bmQgJSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkgLy8gcGxhY2UgYXQgc3RhcnQgb2YgYmluCiAgICBnbG9iYWwgUm91bmQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQKICAgIC8vIHJvdW5kc1BlckRheSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyb3VuZHNQZXJEYXknIH0pCiAgICBieXRlYyA2IC8vICJyb3VuZHNQZXJEYXkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTQ5CiAgICAvLyB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgPSBHbG9iYWwucm91bmQgLSAoR2xvYmFsLnJvdW5kICUgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpIC8vIHBsYWNlIGF0IHN0YXJ0IG9mIGJpbgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICUKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDYKICAgIC8vIGJpblJvdW5kU3RhcnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYmluUm91bmRTdGFydCcgfSkKICAgIGJ5dGVjIDkgLy8gImJpblJvdW5kU3RhcnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTQ5CiAgICAvLyB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgPSBHbG9iYWwucm91bmQgLSAoR2xvYmFsLnJvdW5kICUgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpIC8vIHBsYWNlIGF0IHN0YXJ0IG9mIGJpbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTEKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA3IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgoMCkKICAgIGJ5dGVjIDIzIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTE1CiAgICAvLyByZXdhcmRBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXdhcmRBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNTEKICAgIC8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTgKICAgIC8vIHdlaWdodGVkTW92aW5nQXZlcmFnZSA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnZXdtYScgfSkKICAgIGJ5dGVjIDEyIC8vICJld21hIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE1MgogICAgLy8gdGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUgPSBuZXcgVWludDEyOCgwKQogICAgYnl0ZWMgMjMgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKY3JlYXRlQXBwbGljYXRpb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTM1CiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgIT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEzNgogICAgLy8gYXNzZXJ0KHBvb2xJZCAhPT0gMCkKICAgIGZyYW1lX2RpZyAtMgogICAgYXNzZXJ0CiAgICBiIGNyZWF0ZUFwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuaW5pdFN0b3JhZ2UobWJyUGF5bWVudDogdWludDY0KSAtPiB2b2lkOgppbml0U3RvcmFnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNzQKICAgIC8vIGluaXRTdG9yYWdlKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNzUKICAgIC8vIGFzc2VydCghdGhpcy5zdGFrZXJzLmV4aXN0cywgJ3N0YWtpbmcgcG9vbCBhbHJlYWR5IGluaXRpYWxpemVkJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIHN0YWtpbmcgcG9vbCBhbHJlYWR5IGluaXRpYWxpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTc4LTE4MQogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNzkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNzkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTgwCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc3CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxNzgtMTgxCiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgaW50YyA1IC8vIDE1NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE4MwogICAgLy8gY29uc3QgaXNUb2tlbkVsaWdpYmxlID0gdmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQgIT09IDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxODQKICAgIC8vIGNvbnN0IGV4dHJhTUJSOiB1aW50NjQgPSBpc1Rva2VuRWxpZ2libGUgJiYgdGhpcy5wb29sSWQudmFsdWUgPT09IDEgPyBBU1NFVF9IT0xESU5HX0ZFRSA6IDAKICAgIGJ6IGluaXRTdG9yYWdlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxODQKICAgIC8vIGNvbnN0IGV4dHJhTUJSOiB1aW50NjQgPSBpc1Rva2VuRWxpZ2libGUgJiYgdGhpcy5wb29sSWQudmFsdWUgPT09IDEgPyBBU1NFVF9IT0xESU5HX0ZFRSA6IDAKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGluaXRTdG9yYWdlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmluaXRTdG9yYWdlX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxODQKICAgIC8vIGNvbnN0IGV4dHJhTUJSOiB1aW50NjQgPSBpc1Rva2VuRWxpZ2libGUgJiYgdGhpcy5wb29sSWQudmFsdWUgPT09IDEgPyBBU1NFVF9IT0xESU5HX0ZFRSA6IDAKICAgIHB1c2hpbnQgMTAwMDAwIC8vIDEwMDAwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE4Ni0xODgKICAgIC8vIEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UgKwogICAgLy8gZXh0cmFNQlIgKwogICAgLy8gdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgYXJjNEVuY29kZWRMZW5ndGg8U3Rha2VkSW5mbz4oKSAqIE1BWF9TVEFLRVJTX1BFUl9QT09MKQogICAgcHVzaGludCA1MjI1MzAwIC8vIDUyMjUzMDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxOTEKICAgIC8vIGFzc2VydE1hdGNoKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBhbW91bnQ6IFBvb2xJbml0TWJyIH0pCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjE5MgogICAgLy8gdGhpcy5zdGFrZXJzLmNyZWF0ZSgpCiAgICBwdXNoaW50IDEyODAwIC8vIDEyODAwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxOTQKICAgIC8vIGlmIChpc1Rva2VuRWxpZ2libGUgJiYgdGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBieiBpbml0U3RvcmFnZV9hZnRlcl9pZl9lbHNlQDkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTk0CiAgICAvLyBpZiAoaXNUb2tlbkVsaWdpYmxlICYmIHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBpbml0U3RvcmFnZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxOTYtMjAyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxOTkKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyMDAKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTk2LTIwMQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxOTYtMjAyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0Cgppbml0U3RvcmFnZV9hZnRlcl9pZl9lbHNlQDk6CiAgICByZXRzdWIKCmluaXRTdG9yYWdlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGluaXRTdG9yYWdlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuYWRkU3Rha2Uoc3Rha2VkQW1vdW50UGF5bWVudDogdWludDY0LCBzdGFrZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CmFkZFN0YWtlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjIxNgogICAgLy8gYWRkU3Rha2Uoc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBzdGFrZXI6IEFkZHJlc3MpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjE3CiAgICAvLyBhc3NlcnQodGhpcy5zdGFrZXJzLmV4aXN0cywgJ3N0YWtpbmcgcG9vbCBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0JykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHN0YWtpbmcgcG9vbCBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjIxCiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyMjEKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjIwLTIyMwogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIC8vICAgJ3N0YWtlIGNhbiBvbmx5IGJlIGFkZGVkIHZpYSB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0JywKICAgIC8vICkKICAgIGFzc2VydCAvLyBzdGFrZSBjYW4gb25seSBiZSBhZGRlZCB2aWEgdGhlIHZhbGlkYXRvciBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjIyNAogICAgLy8gYXNzZXJ0KHN0YWtlci5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjI3CiAgICAvLyB0aGlzLmNoZWNrSWZCaW5DbG9zZWQoKQogICAgY2FsbHN1YiBjaGVja0lmQmluQ2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjMxLTIzNQogICAgLy8gYXNzZXJ0TWF0Y2goc3Rha2VkQW1vdW50UGF5bWVudCwgewogICAgLy8gICBzZW5kZXI6IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQsCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyMzIKICAgIC8vIHNlbmRlcjogQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc0CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjMyCiAgICAvLyBzZW5kZXI6IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyMzEtMjM1CiAgICAvLyBhc3NlcnRNYXRjaChzdGFrZWRBbW91bnRQYXltZW50LCB7CiAgICAvLyAgIHNlbmRlcjogQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKICAgIC8vIH0pCiAgICA9PQogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjIzMwogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyMzEtMjM1CiAgICAvLyBhc3NlcnRNYXRjaChzdGFrZWRBbW91bnRQYXltZW50LCB7CiAgICAvLyAgIHNlbmRlcjogQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKICAgIC8vIH0pCiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0MAogICAgLy8gY29uc3QgZW50cnlSb3VuZDogdWludDY0ID0gR2xvYmFsLnJvdW5kICsgQUxHT1JBTkRfU1RBS0lOR19CTE9DS19ERUxBWQogICAgZ2xvYmFsIFJvdW5kCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgICsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNDEKICAgIC8vIGxldCBmaXJzdEVtcHR5OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0MwogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjQzCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjQzCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNDUKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0NQogICAgLy8gY29uc3Qgcm91bmRzTGVmdEluQmluOiB1aW50NjQgPSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSAtIEdsb2JhbC5yb3VuZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNiAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0NQogICAgLy8gY29uc3Qgcm91bmRzTGVmdEluQmluOiB1aW50NjQgPSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSAtIEdsb2JhbC5yb3VuZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIGdsb2JhbCBSb3VuZAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSArIEJpZ1VpbnQoc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQpICogQmlnVWludChyb3VuZHNMZWZ0SW5CaW4pLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTEKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA3IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSArIEJpZ1VpbnQoc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQpICogQmlnVWludChyb3VuZHNMZWZ0SW5CaW4pLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGIqCiAgICBiKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI0Ni0yNDgKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzMgLy8gMTYKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjExMQogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDcgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjQ2LTI0OAogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgoCiAgICAvLyAgIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgKyBCaWdVaW50KHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50KSAqIEJpZ1VpbnQocm91bmRzTGVmdEluQmluKSwKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjUxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYWRkU3Rha2Vfd2hpbGVfdG9wQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyA4CiAgICBpbnRjIDQgLy8gMjAwCiAgICA8CiAgICBieiBhZGRTdGFrZV9hZnRlcl93aGlsZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjUyCiAgICAvLyBlbnN1cmVCdWRnZXQoMzAwKQogICAgaW50YyA2IC8vIDMwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI1MwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDgKICAgIGludGNfMiAvLyA2NAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI1MwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgc3dhcAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNTMtMjU0CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQgPT09IHN0YWtlcikgewogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI1NAogICAgLy8gaWYgKGNtcFN0YWtlci5hY2NvdW50ID09PSBzdGFrZXIpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjUzCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjU2CiAgICAvLyBjbXBTdGFrZXIuYmFsYW5jZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA0CiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNTcKICAgIC8vIGNtcFN0YWtlci5lbnRyeVJvdW5kID0gZW50cnlSb3VuZAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgcmVwbGFjZTIgNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MjYyCiAgICAvLyByZXR1cm4gZW50cnlSb3VuZAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI2NAogICAgLy8gaWYgKGZpcnN0RW1wdHkgPT09IDAgJiYgY21wU3Rha2VyLmFjY291bnQubmF0aXZlID09PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGJueiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAzCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNjUKICAgIC8vIGZpcnN0RW1wdHkgPSBpICsgMQogICAgZnJhbWVfZGlnIDgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA4CiAgICBiIGFkZFN0YWtlX3doaWxlX3RvcEAxCgphZGRTdGFrZV9hZnRlcl93aGlsZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI2OQogICAgLy8gaWYgKGZpcnN0RW1wdHkgPT09IDApIHsKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgICEKICAgICEKICAgIGFzc2VydCAvLyBTdGFraW5nIHBvb2wgZnVsbAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI3NgogICAgLy8gYXNzZXJ0KHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50ID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwgJ211c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4CiAgICAvLyBtaW5FbnRyeVN0YWtlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21pbkVudHJ5U3Rha2UnIH0pCiAgICBieXRlYyAxNSAvLyAibWluRW50cnlTdGFrZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyNzYKICAgIC8vIGFzc2VydChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCA+PSB0aGlzLm1pbkVudHJ5U3Rha2UudmFsdWUsICdtdXN0IHN0YWtlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGZvciB0aGlzIHBvb2wnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA0CiAgICA8PQogICAgYXNzZXJ0IC8vIG11c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI3OAogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0uYWNjb3VudC5uYXRpdmUgPT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gNjQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI3OAogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0uYWNjb3VudC5uYXRpdmUgPT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDAgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI3OS0yODUKICAgIC8vIHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0gPSB7CiAgICAvLyAgIGFjY291bnQ6IHN0YWtlciwKICAgIC8vICAgYmFsYW5jZTogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQsCiAgICAvLyAgIHRvdGFsUmV3YXJkZWQ6IDAsCiAgICAvLyAgIHJld2FyZFRva2VuQmFsYW5jZTogMCwKICAgIC8vICAgZW50cnlSb3VuZDogZW50cnlSb3VuZCwKICAgIC8vIH0KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI4MgogICAgLy8gdG90YWxSZXdhcmRlZDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Mjc5LTI4NQogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHsKICAgIC8vICAgYWNjb3VudDogc3Rha2VyLAogICAgLy8gICBiYWxhbmNlOiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKICAgIC8vICAgdG90YWxSZXdhcmRlZDogMCwKICAgIC8vICAgcmV3YXJkVG9rZW5CYWxhbmNlOiAwLAogICAgLy8gICBlbnRyeVJvdW5kOiBlbnRyeVJvdW5kLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI3OS0yODUKICAgIC8vIHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0gPSB7CiAgICAvLyAgIGFjY291bnQ6IHN0YWtlciwKICAgIC8vICAgYmFsYW5jZTogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQsCiAgICAvLyAgIHRvdGFsUmV3YXJkZWQ6IDAsCiAgICAvLyAgIHJld2FyZFRva2VuQmFsYW5jZTogMCwKICAgIC8vICAgZW50cnlSb3VuZDogZW50cnlSb3VuZCwKICAgIC8vIH0KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI4NgogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODMKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDEwIC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI4NgogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgzCiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyAxMCAvLyAibnVtU3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoyODYKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjI4NwogICAgLy8gcmV0dXJuIGVudHJ5Um91bmQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yZW1vdmVTdGFrZShzdGFrZXI6IGJ5dGVzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlU3Rha2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzAxCiAgICAvLyByZW1vdmVTdGFrZShzdGFrZXI6IEFkZHJlc3MsIGFtb3VudFRvVW5zdGFrZTogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzA0CiAgICAvLyBpZiAoc3Rha2VyLm5hdGl2ZSAhPT0gVHhuLnNlbmRlcikgewogICAgZnJhbWVfZGlnIC0yCiAgICB0eG4gU2VuZGVyCiAgICAhPQogICAgYnogcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzA2CiAgICAvLyB0aGlzLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSwKICAgIGNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMwNS0zMDgKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksCiAgICAvLyAgICdJZiBzdGFrZXIgaXMgbm90IHNlbmRlciBpbiByZW1vdmVTdGFrZSBjYWxsLCB0aGVuIHNlbmRlciBNVVNUIGJlIG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBJZiBzdGFrZXIgaXMgbm90IHNlbmRlciBpbiByZW1vdmVTdGFrZSBjYWxsLCB0aGVuIHNlbmRlciBNVVNUIGJlIG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzExCiAgICAvLyB0aGlzLmNoZWNrSWZCaW5DbG9zZWQoKQogICAgY2FsbHN1YiBjaGVja0lmQmluQ2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzEzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVTdGFrZV93aGlsZV90b3BAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgaW50YyA0IC8vIDIwMAogICAgPAogICAgYXNzZXJ0IC8vIGFjY291bnQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzE0CiAgICAvLyBlbnN1cmVCdWRnZXQoMzAwKQogICAgaW50YyA2IC8vIDMwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzE1CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMxNS0zMTYKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudCA9PT0gc3Rha2VyKSB7CiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMTYKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudCA9PT0gc3Rha2VyKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDI1CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMxNwogICAgLy8gaWYgKGFtb3VudFRvVW5zdGFrZSA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMTUKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzE5CiAgICAvLyBhbW91bnRUb1Vuc3Rha2UgPSBjbXBTdGFrZXIuYmFsYW5jZQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSA0CgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDc6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzE1CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCAzMiAvLyAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMyMQogICAgLy8gaWYgKGNtcFN0YWtlci5iYWxhbmNlIDwgYW1vdW50VG9VbnN0YWtlKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgICEKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMyNAogICAgLy8gY21wU3Rha2VyLmJhbGFuY2UgLT0gYW1vdW50VG9VbnN0YWtlCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMjUKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFRvVW5zdGFrZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NgogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMjUKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFRvVW5zdGFrZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg2CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMyNQogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50VG9VbnN0YWtlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMyNwogICAgLy8gbGV0IGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMyOAogICAgLy8gaWYgKGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPiAwKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBieiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzMwCiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzMwCiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZVN0YWtlX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMzMS0zMzQKICAgIC8vIGNvbnN0IHZhbGlkYXRvckNvbmZpZyA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFZhbGlkYXRvckNvbmZpZywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzMyCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc0CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzMyCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMzMwogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NwogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMzMKICAgIC8vIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzMxLTMzNAogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozMzktMzQ1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaW50YyA1IC8vIDE1NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM0MQogICAgLy8geGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzM5LTM0NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlLAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMzOS0zNDUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM0NwogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMAoKcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZVN0YWtlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozNTkKICAgIC8vIGNtcFN0YWtlci5iYWxhbmNlID09PSAwIHx8IGNtcFN0YWtlci5iYWxhbmNlID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogcmVtb3ZlU3Rha2VfYm9vbF90cnVlQDE4CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4CiAgICAvLyBtaW5FbnRyeVN0YWtlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21pbkVudHJ5U3Rha2UnIH0pCiAgICBieXRlYyAxNSAvLyAibWluRW50cnlTdGFrZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozNTkKICAgIC8vIGNtcFN0YWtlci5iYWxhbmNlID09PSAwIHx8IGNtcFN0YWtlci5iYWxhbmNlID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgOAogICAgPD0KICAgIGJ6IHJlbW92ZVN0YWtlX2Jvb2xfZmFsc2VAMTkKCnJlbW92ZVN0YWtlX2Jvb2xfdHJ1ZUAxODoKICAgIGludGNfMSAvLyAxCgpyZW1vdmVTdGFrZV9ib29sX21lcmdlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM1OC0zNjEKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY21wU3Rha2VyLmJhbGFuY2UgPT09IDAgfHwgY21wU3Rha2VyLmJhbGFuY2UgPj0gdGhpcy5taW5FbnRyeVN0YWtlLnZhbHVlLAogICAgLy8gICAnY2Fubm90IHJlZHVjZSBiYWxhbmNlIGJlbG93IG1pbmltdW0gYWxsb3dlZCBzdGFrZSB1bmxlc3MgYWxsIGlzIHJlbW92ZWQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbm5vdCByZWR1Y2UgYmFsYW5jZSBiZWxvdyBtaW5pbXVtIGFsbG93ZWQgc3Rha2UgdW5sZXNzIGFsbCBpcyByZW1vdmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzY2LTM3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRUb1Vuc3Rha2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Vuc3Rha2VkJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzcwCiAgICAvLyBub3RlOiAndW5zdGFrZWQnLAogICAgcHVzaGJ5dGVzICJ1bnN0YWtlZCIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzY2LTM3MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRUb1Vuc3Rha2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Vuc3Rha2VkJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozNjYtMzcyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudFRvVW5zdGFrZSwKICAgIC8vICAgICByZWNlaXZlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAndW5zdGFrZWQnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MzczCiAgICAvLyBsZXQgc3Rha2VyUmVtb3ZlZCA9IGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Mzc0CiAgICAvLyBpZiAoY21wU3Rha2VyLmJhbGFuY2UgPT09IDApIHsKICAgIGZyYW1lX2RpZyA4CiAgICBibnogcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NgogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODMKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDEwIC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NgogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgzCiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyAxMCAvLyAibnVtU3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozNzYKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSAtPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NwogICAgLy8gY21wU3Rha2VyLmFjY291bnQgPSBuZXcgQWRkcmVzcyhHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXBsYWNlMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Mzc4CiAgICAvLyBjbXBTdGFrZXIudG90YWxSZXdhcmRlZCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozNzkKICAgIC8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPSAwCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM4MAogICAgLy8gc3Rha2VyUmVtb3ZlZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODMKICAgIC8vIHRoaXMuc3Rha2Vycy52YWx1ZVtpXSA9IGNsb25lKGNtcFN0YWtlcikKICAgIGZyYW1lX2RpZyA1CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Mzg1CiAgICAvLyBjb25zdCByb3VuZHNMZWZ0SW5CaW46IHVpbnQ2NCA9IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIC0gR2xvYmFsLnJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNgogICAgLy8gYmluUm91bmRTdGFydCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdiaW5Sb3VuZFN0YXJ0JyB9KQogICAgYnl0ZWMgOSAvLyAiYmluUm91bmRTdGFydCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODUKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNAogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDYgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODUKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICBnbG9iYWwgUm91bmQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODYKICAgIC8vIGNvbnN0IHN1YnRyYWN0QW1vdW50ID0gQmlnVWludChhbW91bnRUb1Vuc3Rha2UgKiByb3VuZHNMZWZ0SW5CaW4pCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODcKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgLSBzdWJ0cmFjdEFtb3VudCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTExCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozODcKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgLSBzdWJ0cmFjdEFtb3VudCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18zIC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTEKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA3IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM4NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgodGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSAtIHN1YnRyYWN0QW1vdW50KQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTItNDAxCiAgICAvLyBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5zdGFrZVJlbW92ZWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBzdGFrZXIsCiAgICAvLyAgICAgYW1vdW50VG9VbnN0YWtlLAogICAgLy8gICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKICAgIC8vICAgICBzdGFrZXJSZW1vdmVkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTMKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTMKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Mzk1CiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NwogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTUKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTUKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTcKICAgIC8vIGFtb3VudFRvVW5zdGFrZSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM5OAogICAgLy8gYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkLAogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTkKICAgIC8vIHN0YWtlclJlbW92ZWQsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyA3CiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czozOTItNDAxCiAgICAvLyBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5zdGFrZVJlbW92ZWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBzdGFrZXIsCiAgICAvLyAgICAgYW1vdW50VG9VbnN0YWtlLAogICAgLy8gICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKICAgIC8vICAgICBzdGFrZXJSZW1vdmVkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDI0IC8vIG1ldGhvZCAic3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MDIKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpyZW1vdmVTdGFrZV9ib29sX2ZhbHNlQDE5OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmVtb3ZlU3Rha2VfYm9vbF9tZXJnZUAyMAoKcmVtb3ZlU3Rha2VfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjM1MwogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMAogICAgYiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDE1CgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlU3Rha2Vfd2hpbGVfdG9wQDMKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmNsYWltVG9rZW5zKCkgLT4gdm9pZDoKY2xhaW1Ub2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDEzCiAgICAvLyBjbGFpbVRva2VucygpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MTcKICAgIC8vIGNvbnN0IHN0YWtlciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpjbGFpbVRva2Vuc193aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQxOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50YyA0IC8vIDIwMAogICAgPAogICAgYXNzZXJ0IC8vIGFjY291bnQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDIwCiAgICAvLyBlbnN1cmVCdWRnZXQoMzAwKQogICAgaW50YyA2IC8vIDMwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQyMQogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQyMS00MjIKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgPT09IHN0YWtlcikgewogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDIyCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQubmF0aXZlID09PSBzdGFrZXIpIHsKICAgIGZyYW1lX2RpZyA0CiAgICA9PQogICAgYnogY2xhaW1Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBleHRyYWN0IDQ4IDgKICAgIGZyYW1lX2J1cnkgMAogICAgcHVzaGludCA0OCAvLyA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQyMwogICAgLy8gaWYgKGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgPT09IDApIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgYm56IGNsYWltVG9rZW5zX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQyNAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmNsYWltVG9rZW5zX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MjgKICAgIC8vIGlmICh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MjgKICAgIC8vIGlmICh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogY2xhaW1Ub2tlbnNfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MjktNDMyCiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQzMAogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NAogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQzMAogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MzEKICAgIC8vIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzcKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDMxCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQyOS00MzIKICAgIC8vIGNvbnN0IHZhbGlkYXRvckNvbmZpZyA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFZhbGlkYXRvckNvbmZpZywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDM2LTQ0MgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaW50YyA1IC8vIDE1NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQzOAogICAgLy8geGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIDQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MzYtNDQxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0MzYtNDQyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ0NAogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1NAogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1OS00NjgKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLnN0YWtlUmVtb3ZlZCwgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgLy8gICAgIG5ldyBBZGRyZXNzKHN0YWtlciksCiAgICAvLyAgICAgMCwgLy8gbm8gYWxnbyByZW1vdmVkCiAgICAvLyAgICAgYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkLAogICAgLy8gICAgIGZhbHNlLCAvLyBzdGFrZXIgaXNuJ3QgYmVpbmcgcmVtb3ZlZC4KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDYwCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc0CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDYwCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ2MgogICAgLy8geyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzcKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDYyCiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDYyCiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDY0CiAgICAvLyAwLCAvLyBubyBhbGdvIHJlbW92ZWQKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDU5LTQ2OAogICAgLy8gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuc3Rha2VSZW1vdmVkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICAvLyAgICAgbmV3IEFkZHJlc3Moc3Rha2VyKSwKICAgIC8vICAgICAwLCAvLyBubyBhbGdvIHJlbW92ZWQKICAgIC8vICAgICBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQsCiAgICAvLyAgICAgZmFsc2UsIC8vIHN0YWtlciBpc24ndCBiZWluZyByZW1vdmVkLgogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGJ5dGVjIDI0IC8vIG1ldGhvZCAic3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDY2CiAgICAvLyBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1OS00NjgKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLnN0YWtlUmVtb3ZlZCwgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgLy8gICAgIG5ldyBBZGRyZXNzKHN0YWtlciksCiAgICAvLyAgICAgMCwgLy8gbm8gYWxnbyByZW1vdmVkCiAgICAvLyAgICAgYW1vdW50UmV3YXJkVG9rZW5SZW1vdmVkLAogICAgLy8gICAgIGZhbHNlLCAvLyBzdGFrZXIgaXNuJ3QgYmVpbmcgcmVtb3ZlZC4KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ2OQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmNsYWltVG9rZW5zX2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1MAogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMQogICAgYiBjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEwCgpjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQxOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgY2xhaW1Ub2tlbnNfd2hpbGVfdG9wQDEKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmdldFN0YWtlckluZm8oc3Rha2VyOiBieXRlcykgLT4gYnl0ZXM6CmdldFN0YWtlckluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDgyLTQ4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRTdGFrZXJJbmZvKHN0YWtlcjogQWRkcmVzcyk6IFN0YWtlZEluZm8gewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0ODQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpnZXRTdGFrZXJJbmZvX3doaWxlX3RvcEAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDg0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjIDQgLy8gMjAwCiAgICA8CiAgICBhc3NlcnQgLy8gYWNjb3VudCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo0ODUKICAgIC8vIGVuc3VyZUJ1ZGdldCgyMDApCiAgICBpbnRjIDQgLy8gMjAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDg2CiAgICAvLyBpZiAodGhpcy5zdGFrZXJzLnZhbHVlW2ldLmFjY291bnQgPT09IHN0YWtlcikgewogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDg2CiAgICAvLyBpZiAodGhpcy5zdGFrZXJzLnZhbHVlW2ldLmFjY291bnQgPT09IHN0YWtlcikgewogICAgc3dhcAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAwIDMyCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRTdGFrZXJJbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NDg3CiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXJzLnZhbHVlW2ldCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFN0YWtlckluZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjQ4NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0U3Rha2VySW5mb193aGlsZV90b3BAMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wucGF5VG9rZW5SZXdhcmQoc3Rha2VyOiBieXRlcywgcmV3YXJkVG9rZW46IHVpbnQ2NCwgYW1vdW50VG9TZW5kOiB1aW50NjQpIC0+IHZvaWQ6CnBheVRva2VuUmV3YXJkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUwMwogICAgLy8gcGF5VG9rZW5SZXdhcmQoc3Rha2VyOiBBZGRyZXNzLCByZXdhcmRUb2tlbjogdWludDY0LCBhbW91bnRUb1NlbmQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTA2CiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MDYKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTA1LTUwOAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIC8vICAgJ3RoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIHZpYSB0aGUgdmFsaWRhdG9yIGNvbnRyYWN0JywKICAgIC8vICkKICAgIGFzc2VydCAvLyB0aGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB2aWEgdGhlIHZhbGlkYXRvciBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUwOQogICAgLy8gYXNzZXJ0KHRoaXMucG9vbElkLnZhbHVlID09PSAxLCAnbXVzdCBiZSBwb29sIDEgaW4gb3JkZXIgdG8gYmUgY2FsbGVkIHRvIHBheSBvdXQgdG9rZW4gcmV3YXJkcycpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgwCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUwOQogICAgLy8gYXNzZXJ0KHRoaXMucG9vbElkLnZhbHVlID09PSAxLCAnbXVzdCBiZSBwb29sIDEgaW4gb3JkZXIgdG8gYmUgY2FsbGVkIHRvIHBheSBvdXQgdG9rZW4gcmV3YXJkcycpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbXVzdCBiZSBwb29sIDEgaW4gb3JkZXIgdG8gYmUgY2FsbGVkIHRvIHBheSBvdXQgdG9rZW4gcmV3YXJkcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUxMAogICAgLy8gYXNzZXJ0KHJld2FyZFRva2VuICE9PSAwLCAnY2FuIG9ubHkgY2xhaW0gdG9rZW4gcmV3YXJkcyBmcm9tIHZhbGlkYXRvciB0aGF0IGhhcyB0aGVtJykKICAgIGZyYW1lX2RpZyAtMgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNsYWltIHRva2VuIHJld2FyZHMgZnJvbSB2YWxpZGF0b3IgdGhhdCBoYXMgdGhlbQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUxMy01MTkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogcmV3YXJkVG9rZW4sCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50VG9TZW5kLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MTMtNTE4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHJld2FyZFRva2VuLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudFRvU2VuZCwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1MTMtNTE5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHJld2FyZFRva2VuLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudFRvU2VuZCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC51cGRhdGVBbGdvZFZlcihhbGdvZFZlcjogYnl0ZXMpIC0+IHZvaWQ6CnVwZGF0ZUFsZ29kVmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUzMQogICAgLy8gdXBkYXRlQWxnb2RWZXIoYWxnb2RWZXI6IHN0cmluZyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTMyCiAgICAvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQogICAgY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTcKICAgIC8vIGFsZ29kVmVyID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsga2V5OiAnYWxnb2RWZXInIH0pCiAgICBwdXNoYnl0ZXMgImFsZ29kVmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjUzMwogICAgLy8gdGhpcy5hbGdvZFZlci52YWx1ZSA9IEJ5dGVzKGFsZ29kVmVyKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5lcG9jaEJhbGFuY2VVcGRhdGUoKSAtPiB2b2lkOgplcG9jaEJhbGFuY2VVcGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTQ0CiAgICAvLyBlcG9jaEJhbGFuY2VVcGRhdGUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDYKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzNAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NDYtNTQ5CiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU0NwogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NAogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU0NwogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NDgKICAgIC8vIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzcKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTQ4CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU0Ni01NDkKICAgIC8vIGNvbnN0IHZhbGlkYXRvckNvbmZpZyA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFZhbGlkYXRvckNvbmZpZywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTU1CiAgICAvLyBjb25zdCBlcG9jaFJvdW5kTGVuZ3RoID0gdmFsaWRhdG9yQ29uZmlnLmVwb2NoUm91bmRMZW5ndGgubmF0aXZlCiAgICBkdXAKICAgIHB1c2hpbnQgMTczIC8vIDE3MwogICAgZXh0cmFjdF91aW50MzIKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU1NgogICAgLy8gY29uc3QgY3VyUm91bmQgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU1NwogICAgLy8gY29uc3QgdGhpc0Vwb2NoQmVnaW46IHVpbnQ2NCA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKICAgIGR1cAogICAgZGlnIDIKICAgICUKICAgIGRpZyAxCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjAKICAgIC8vIGNvbnN0IGxhc3RQYXlvdXRFcG9jaDogdWludDY0ID0gdGhpcy5sYXN0UGF5b3V0LnZhbHVlIC0gKHRoaXMubGFzdFBheW91dC52YWx1ZSAlIGVwb2NoUm91bmRMZW5ndGgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjkxCiAgICAvLyBsYXN0UGF5b3V0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xhc3RQYXlvdXQnIH0pCiAgICBieXRlYyAxNiAvLyAibGFzdFBheW91dCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjAKICAgIC8vIGNvbnN0IGxhc3RQYXlvdXRFcG9jaDogdWludDY0ID0gdGhpcy5sYXN0UGF5b3V0LnZhbHVlIC0gKHRoaXMubGFzdFBheW91dC52YWx1ZSAlIGVwb2NoUm91bmRMZW5ndGgpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICUKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjIKICAgIC8vIGFzc2VydChsYXN0UGF5b3V0RXBvY2ggIT09IHRoaXNFcG9jaEJlZ2luLCAiY2FuJ3QgY2FsbCBlcG9jaEJhbGFuY2VVcGRhdGUgaW4gc2FtZSBlcG9jaCBhcyBwcmlvciBjYWxsIikKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBjYW4ndCBjYWxsIGVwb2NoQmFsYW5jZVVwZGF0ZSBpbiBzYW1lIGVwb2NoIGFzIHByaW9yIGNhbGwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjQKICAgIC8vIHRoaXMuY2hlY2tJZkJpbkNsb3NlZCgpCiAgICBjYWxsc3ViIGNoZWNrSWZCaW5DbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5MQogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTYgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTY3CiAgICAvLyB0aGlzLmxhc3RQYXlvdXQudmFsdWUgPSBjdXJSb3VuZAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjgKICAgIC8vIHRoaXMuZXBvY2hOdW1iZXIudmFsdWUgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NAogICAgLy8gZXBvY2hOdW1iZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZXBvY2hOdW1iZXInIH0pCiAgICBieXRlYyAxNyAvLyAiZXBvY2hOdW1iZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTY4CiAgICAvLyB0aGlzLmVwb2NoTnVtYmVyLnZhbHVlICs9IDEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk0CiAgICAvLyBlcG9jaE51bWJlciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdlcG9jaE51bWJlcicgfSkKICAgIGJ5dGVjIDE3IC8vICJlcG9jaE51bWJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NjgKICAgIC8vIHRoaXMuZXBvY2hOdW1iZXIudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGludGMgNSAvLyAxNTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NzMKICAgIC8vIGNvbnN0IGlzVG9rZW5FbGlnaWJsZSA9IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkICE9PSAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTc0CiAgICAvLyBsZXQgcG9vbE9uZUFwcElEID0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1NzUKICAgIC8vIGxldCBwb29sT25lQWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTgwCiAgICAvLyBpZiAoaXNUb2tlbkVsaWdpYmxlKSB7CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU4MQogICAgLy8gaWYgKHRoaXMucG9vbElkLnZhbHVlICE9PSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgwCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU4MQogICAgLy8gaWYgKHRoaXMucG9vbElkLnZhbHVlICE9PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTgzLTU4NgogICAgLy8gcG9vbE9uZUFwcElEID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWUsIDFdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1ODQKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1ODQKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTg1CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgMV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc3CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU4NQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWUsIDFdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTgzLTU4NgogICAgLy8gcG9vbE9uZUFwcElEID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWUsIDFdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU4OAogICAgLy8gcG9vbE9uZUFkZHJlc3MgPSBBcHBsaWNhdGlvbihwb29sT25lQXBwSUQpLmFkZHJlc3MKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNDgKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTkzCiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTkzCiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU5NC01OTcKICAgIC8vIHRva2VuUGF5b3V0UmF0aW8gPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5zZXRUb2tlblBheW91dFJhdGlvLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1OTUKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1OTUKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NTk2CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc3CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjU5NgogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo1OTQtNTk3CiAgICAvLyB0b2tlblBheW91dFJhdGlvID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuc2V0VG9rZW5QYXlvdXRSYXRpbywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAyNiAvLyBtZXRob2QgInNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZnJhbWVfYnVyeSA0MgogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA0OAogICAgZnJhbWVfYnVyeSA0OQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICBmcmFtZV9kaWcgNDkKICAgIGZyYW1lX2J1cnkgNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MDktNjEyCiAgICAvLyBjb25zdCB2YWxpZGF0b3JTdGF0ZSA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFZhbGlkYXRvclN0YXRlLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MTAKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MTAKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjExCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc3CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjYxMQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MDktNjEyCiAgICAvLyBjb25zdCB2YWxpZGF0b3JTdGF0ZSA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFZhbGlkYXRvclN0YXRlLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDFmMmYwMTA5IC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjEzCiAgICAvLyBjb25zdCByZXdhcmRUb2tlbkhlbGRCYWNrID0gdmFsaWRhdG9yU3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjawogICAgZHVwCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjYyMAogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MuYmFsYW5jZSAtCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MjEKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjIxCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjYyMC02MjEKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UgLQogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjYyMgogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MubWluQmFsYW5jZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjIwLTYyMgogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MuYmFsYW5jZSAtCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtCiAgICAvLyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcy5taW5CYWxhbmNlCiAgICAtCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MjMKICAgIC8vIGxldCBpc1Bvb2xTYXR1cmF0ZWQgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDI1CiAgICAvLyByZXR1cm4gb3Aub25saW5lU3Rha2UoKQogICAgb25saW5lX3N0YWtlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAxMgogICAgLy8gcmV0dXJuIHdpZGVSYXRpbyhbb25saW5lLCBNQVhfVkFMSURBVE9SX1NPRlRfUENUX09GX09OTElORV8xREVDSU1BTF0sIFsxMDAwXSkKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAyCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDNlOAogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjMyCiAgICAvLyBpZiAodmFsaWRhdG9yU3RhdGUudG90YWxBbGdvU3Rha2VkID4gYWxnb1NhdHVyYXRpb25BbXQpIHsKICAgIHN3YXAKICAgIHB1c2hpbnQgMTQgLy8gMTQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzkKICAgIDwKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjMzCiAgICAvLyBpc1Bvb2xTYXR1cmF0ZWQgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxOQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjM5CiAgICAvLyBsZXQgdG9rZW5SZXdhcmRBdmFpbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY0MAogICAgLy8gbGV0IHRva2VuUmV3YXJkUGFpZE91dDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2NDEKICAgIC8vIGxldCB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2NDIKICAgIC8vIGxldCBleGNlc3NUb0ZlZVNpbms6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDE1CiAgICBmcmFtZV9idXJ5IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjQzCiAgICAvLyBpZiAoaXNUb2tlbkVsaWdpYmxlKSB7CiAgICBmcmFtZV9kaWcgNDYKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjQ1CiAgICAvLyBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHBvb2xPbmVBZGRyZXNzLCB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZClbMF0gLQogICAgZnJhbWVfZGlnIDQ4CiAgICBmcmFtZV9kaWcgNDYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjQ2CiAgICAvLyBvcC5idG9pKEJ5dGVzKHJld2FyZFRva2VuSGVsZEJhY2spKQogICAgZnJhbWVfZGlnIDI2CiAgICBpdG9iCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjQ1LTY0NgogICAgLy8gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShwb29sT25lQWRkcmVzcywgdmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQpWzBdIC0KICAgIC8vIG9wLmJ0b2koQnl0ZXMocmV3YXJkVG9rZW5IZWxkQmFjaykpCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjUwCiAgICAvLyBpZiAodG9rZW5SZXdhcmRCYWwgPj0gdmFsaWRhdG9yQ29uZmlnLnJld2FyZFBlclBheW91dCkgewogICAgZnJhbWVfZGlnIDQzCiAgICBwdXNoaW50IDE2NSAvLyAxNjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDAKICAgID49CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY1NgogICAgLy8gY29uc3Qgb3VyUG9vbFBjdE9mV2hvbGUgPSB0b2tlblBheW91dFJhdGlvLnBvb2xQY3RPZldob2xlW3RoaXMucG9vbElkLnZhbHVlIC0gMV0KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjU2CiAgICAvLyBjb25zdCBvdXJQb29sUGN0T2ZXaG9sZSA9IHRva2VuUGF5b3V0UmF0aW8ucG9vbFBjdE9mV2hvbGVbdGhpcy5wb29sSWQudmFsdWUgLSAxXQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9kaWcgNDIKICAgIGV4dHJhY3QgMCAxOTIKICAgIHN3YXAKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY1OQogICAgLy8gdG9rZW5SZXdhcmRBdmFpbCA9IHdpZGVSYXRpbyhbdmFsaWRhdG9yQ29uZmlnLnJld2FyZFBlclBheW91dCwgb3VyUG9vbFBjdE9mV2hvbGVdLCBbMV8wMDBfMDAwXSkKICAgIGZyYW1lX2RpZyA0MAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyAweDAwMDEwMDAwMDAwMDAwMGY0MjQwCiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICBmcmFtZV9idXJ5IDMxCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIGZyYW1lX2RpZyAzMQogICAgZnJhbWVfYnVyeSAzMgoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICBmcmFtZV9kaWcgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY2MgogICAgLy8gaWYgKHRva2VuUmV3YXJkQXZhaWwgPT09IDApIHsKICAgIGJueiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY2NwogICAgLy8gaWYgKGFsZ29SZXdhcmRBdmFpbCA8IDFfMDAwXzAwMCkgewogICAgZnJhbWVfZGlnIDcKICAgIGludGMgOCAvLyAxMDAwMDAwCiAgICA8CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY2OAogICAgLy8gbG9nKCchdG9rZW4mJiFub2FsZ28gdG8gcGF5JykKICAgIHB1c2hieXRlcyAiIXRva2VuJiYhbm9hbGdvIHRvIHBheSIKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY2OQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY3MwogICAgLy8gaWYgKGlzUG9vbFNhdHVyYXRlZCkgewogICAgZnJhbWVfZGlnIDE5CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfZWxzZV9ib2R5QDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjgwCiAgICAvLyBbYWxnb1Jld2FyZEF2YWlsLCB2YWxpZGF0b3JDb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZV0sCiAgICBmcmFtZV9kaWcgNDMKICAgIHB1c2hpbnQgMTc3IC8vIDE3NwogICAgZXh0cmFjdF91aW50MzIKICAgIGZyYW1lX2RpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2ODEKICAgIC8vIFsxXzAwMF8wMDBdLAogICAgYnl0ZWMgMTggLy8gMHgwMDAxMDAwMDAwMDAwMDBmNDI0MAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY3OS02ODIKICAgIC8vIGNvbnN0IG5vcm1hbFZhbGlkYXRvckNvbW1pc3Npb24gPSB3aWRlUmF0aW8oCiAgICAvLyAgIFthbGdvUmV3YXJkQXZhaWwsIHZhbGlkYXRvckNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IubmF0aXZlXSwKICAgIC8vICAgWzFfMDAwXzAwMF0sCiAgICAvLyApCiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Njg1CiAgICAvLyBbYWxnb1Jld2FyZEF2YWlsLCBhbGdvU2F0dXJhdGlvbkFtdF0sCiAgICBmcmFtZV9kaWcgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4NgogICAgLy8gW29wLmJ0b2koQnl0ZXModmFsaWRhdG9yU3RhdGUudG90YWxBbGdvU3Rha2VkKSldLAogICAgZnJhbWVfZGlnIDM5CiAgICBpdG9iCiAgICBidG9pCiAgICBpdG9iCiAgICBieXRlYyAxOSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4NC02ODcKICAgIC8vIGxldCBkaW1pbmlzaGVkUmV3YXJkID0gd2lkZVJhdGlvKAogICAgLy8gICBbYWxnb1Jld2FyZEF2YWlsLCBhbGdvU2F0dXJhdGlvbkFtdF0sCiAgICAvLyAgIFtvcC5idG9pKEJ5dGVzKHZhbGlkYXRvclN0YXRlLnRvdGFsQWxnb1N0YWtlZCkpXSwKICAgIC8vICkKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY4OQogICAgLy8gaWYgKGRpbWluaXNoZWRSZXdhcmQgPiBhbGdvUmV3YXJkQXZhaWwgLSBub3JtYWxWYWxpZGF0b3JDb21taXNzaW9uKSB7CiAgICBjb3ZlciAyCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgID4KICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDI1CiAgICBmcmFtZV9kaWcgMTQKICAgIGZyYW1lX2J1cnkgMTMKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjY5MwogICAgLy8gZXhjZXNzVG9GZWVTaW5rID0gYWxnb1Jld2FyZEF2YWlsIC0gZGltaW5pc2hlZFJld2FyZAogICAgZnJhbWVfZGlnIDcKICAgIGZyYW1lX2RpZyAxMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2OTQtNzAwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGV4Y2Vzc1RvRmVlU2luaywKICAgIC8vICAgICByZWNlaXZlcjogb3AuQmxvY2suYmxrRmVlU2luayhUeG4uZmlyc3RWYWxpZCAtIDEpLAogICAgLy8gICAgIG5vdGU6ICdwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Njk3CiAgICAvLyByZWNlaXZlcjogb3AuQmxvY2suYmxrRmVlU2luayhUeG4uZmlyc3RWYWxpZCAtIDEpLAogICAgdHhuIEZpcnN0VmFsaWQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Njk4CiAgICAvLyBub3RlOiAncG9vbCBzYXR1cmF0ZWQsIGV4Y2VzcyB0byBmZWUgc2luaycsCiAgICBwdXNoYnl0ZXMgInBvb2wgc2F0dXJhdGVkLCBleGNlc3MgdG8gZmVlIHNpbmsiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Njk0LTY5OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBleGNlc3NUb0ZlZVNpbmssCiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLkJsb2NrLmJsa0ZlZVNpbmsoVHhuLmZpcnN0VmFsaWQgLSAxKSwKICAgIC8vICAgICBub3RlOiAncG9vbCBzYXR1cmF0ZWQsIGV4Y2VzcyB0byBmZWUgc2luaycsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Njk0LTcwMAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBleGNlc3NUb0ZlZVNpbmssCiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLkJsb2NrLmJsa0ZlZVNpbmsoVHhuLmZpcnN0VmFsaWQgLSAxKSwKICAgIC8vICAgICBub3RlOiAncG9vbCBzYXR1cmF0ZWQsIGV4Y2VzcyB0byBmZWUgc2luaycsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGZyYW1lX2J1cnkgNwoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzUxCiAgICAvLyBsZXQgaW5jcmVhc2VkU3Rha2U6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Nzc1CiAgICAvLyBpZiAoYWxnb1Jld2FyZEF2YWlsICE9PSAwIHx8IHRva2VuUmV3YXJkQXZhaWwgIT09IDApIHsKICAgIGZyYW1lX2RpZyA3CiAgICBibnogZXBvY2hCYWxhbmNlVXBkYXRlX2lmX2JvZHlANDEKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgMzEKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY4CgplcG9jaEJhbGFuY2VVcGRhdGVfaWZfYm9keUA0MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NzYKICAgIC8vIGxldCBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2U6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzgwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxNgogICAgZnJhbWVfZGlnIDcKICAgIGZyYW1lX2J1cnkgOAogICAgZnJhbWVfZGlnIDMxCiAgICBmcmFtZV9idXJ5IDMyCgplcG9jaEJhbGFuY2VVcGRhdGVfd2hpbGVfdG9wQDQyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzgwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMTYKICAgIGludGMgNCAvLyAyMDAKICAgIDwKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl93aGlsZUA1MwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MQogICAgLy8gZW5zdXJlQnVkZ2V0KDQwMCkKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjXzIgLy8gNjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzgyCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4Mi03ODMKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzgzCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQubmF0aXZlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMzIKICAgIGZyYW1lX2J1cnkgMzMKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDU2IC8vIDU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Nzg0CiAgICAvLyBpZiAoY21wU3Rha2VyLmVudHJ5Um91bmQgPj0gdGhpc0Vwb2NoQmVnaW4pIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIGZyYW1lX2RpZyA0NQogICAgPj0KICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlANDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Nzg3CiAgICAvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UgKz0gY21wU3Rha2VyLmJhbGFuY2UKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMjQKICAgICsKICAgIGZyYW1lX2J1cnkgMjQKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDUxOgogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgOAogICAgZnJhbWVfYnVyeSA5CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyAzMgogICAgZnJhbWVfYnVyeSAzMwogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MjoKICAgIGZyYW1lX2RpZyAxOAogICAgZnJhbWVfYnVyeSAxNwogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2J1cnkgOAogICAgZnJhbWVfZGlnIDM1CiAgICBmcmFtZV9idXJ5IDM0CiAgICBmcmFtZV9kaWcgMzMKICAgIGZyYW1lX2J1cnkgMzIKICAgIGZyYW1lX2RpZyAyNQogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxNgogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfd2hpbGVfdG9wQDQyCgplcG9jaEJhbGFuY2VVcGRhdGVfZWxzZV9ib2R5QDQ2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc5MQogICAgLy8gY29uc3QgdGltZUluUG9vbDogdWludDY0ID0gdGhpc0Vwb2NoQmVnaW4gLSBjbXBTdGFrZXIuZW50cnlSb3VuZAogICAgZnJhbWVfZGlnIDQ1CiAgICBmcmFtZV9kaWcgNDEKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc5NQogICAgLy8gaWYgKHRpbWVJblBvb2wgPCBlcG9jaFJvdW5kTGVuZ3RoKSB7CiAgICBmcmFtZV9kaWcgNDQKICAgIDwKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMzIKICAgIGZyYW1lX2J1cnkgMzMKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc4MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Nzk2CiAgICAvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UgKz0gY21wU3Rha2VyLmJhbGFuY2UKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzcKICAgIGZyYW1lX2RpZyAyNAogICAgKwogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc5NwogICAgLy8gdGltZVBlcmNlbnRhZ2UgPSAodGltZUluUG9vbCAqIDEwMDApIC8gZXBvY2hSb3VuZExlbmd0aAogICAgZnJhbWVfZGlnIDI3CiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgKgogICAgZnJhbWVfZGlnIDQ0CiAgICAvCiAgICBmcmFtZV9idXJ5IDI4CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMzCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6Nzk5CiAgICAvLyBpZiAodG9rZW5SZXdhcmRBdmFpbCA+IDApIHsKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAyCiAgICAvLyBbY21wU3Rha2VyLmJhbGFuY2UsIG9yaWdUb2tlblJld2FyZCwgdGltZVBlcmNlbnRhZ2VdLAogICAgZnJhbWVfZGlnIDM3CiAgICBpdG9iCiAgICBieXRlYyAyNyAvLyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyOAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAzCiAgICAvLyBbdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUsIDEwMDBdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NgogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MDMKICAgIC8vIFt0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSwgMTAwMF0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgwMS04MDQKICAgIC8vIGNvbnN0IHN0YWtlclRva2VuUmV3YXJkID0gd2lkZVJhdGlvKAogICAgLy8gICBbY21wU3Rha2VyLmJhbGFuY2UsIG9yaWdUb2tlblJld2FyZCwgdGltZVBlcmNlbnRhZ2VdLAogICAgLy8gICBbdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUsIDEwMDBdLAogICAgLy8gKQogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgwOAogICAgLy8gdG9rZW5SZXdhcmRBdmFpbCAtPSBzdGFrZXJUb2tlblJld2FyZAogICAgZnJhbWVfZGlnIDMyCiAgICBkaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzgyCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMTEKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MDkKICAgIC8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgKz0gc3Rha2VyVG9rZW5SZXdhcmQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODEwCiAgICAvLyB0b2tlblJld2FyZFBhaWRPdXQgKz0gc3Rha2VyVG9rZW5SZXdhcmQKICAgIGZyYW1lX2RpZyAzNAogICAgdW5jb3ZlciAzCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMzMKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDQ5OgogICAgZnJhbWVfZGlnIDMzCiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODE0CiAgICAvLyBbY21wU3Rha2VyLmJhbGFuY2UsIG9yaWdBbGdvUmV3YXJkLCB0aW1lUGVyY2VudGFnZV0sCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMjgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgxNQogICAgLy8gW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODE1CiAgICAvLyBbdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUsIDEwMDBdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MTMtODE2CiAgICAvLyBjb25zdCBzdGFrZXJSZXdhcmQgPSB3aWRlUmF0aW8oCiAgICAvLyAgIFtjbXBTdGFrZXIuYmFsYW5jZSwgb3JpZ0FsZ29SZXdhcmQsIHRpbWVQZXJjZW50YWdlXSwKICAgIC8vICAgW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKICAgIC8vICkKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MTkKICAgIC8vIGFsZ29SZXdhcmRBdmFpbCAtPSBzdGFrZXJSZXdhcmQKICAgIGZyYW1lX2RpZyA4CiAgICBkaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgyMgogICAgLy8gY21wU3Rha2VyLmJhbGFuY2UgKz0gc3Rha2VyUmV3YXJkCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODIzCiAgICAvLyBjbXBTdGFrZXIudG90YWxSZXdhcmRlZCArPSBzdGFrZXJSZXdhcmQKICAgIGR1cAogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgyNAogICAgLy8gaW5jcmVhc2VkU3Rha2UgKz0gc3Rha2VyUmV3YXJkCiAgICBmcmFtZV9kaWcgMTcKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODI2CiAgICAvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbG9uZShjbXBTdGFrZXIpCiAgICBmcmFtZV9kaWcgMTEKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIGZyYW1lX2J1cnkgMTgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSAzMwogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIGZyYW1lX2RpZyAxOAogICAgZnJhbWVfYnVyeSAxNwogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2J1cnkgOAogICAgZnJhbWVfZGlnIDM1CiAgICBmcmFtZV9idXJ5IDM0CiAgICBmcmFtZV9kaWcgMzMKICAgIGZyYW1lX2J1cnkgMzIKICAgIGZyYW1lX2RpZyAyNQogICAgZnJhbWVfYnVyeSAyNAogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX3doaWxlQDUzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgzNAogICAgLy8gY29uc3QgbmV3UG9vbFRvdGFsU3Rha2U6IHVpbnQ2NCA9IHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg2CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjgzNAogICAgLy8gY29uc3QgbmV3UG9vbFRvdGFsU3Rha2U6IHVpbnQ2NCA9IHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDI0CiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODM4CiAgICAvLyBpZiAobmV3UG9vbFRvdGFsU3Rha2UgPiAwKSB7CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMjAKCmVwb2NoQmFsYW5jZVVwZGF0ZV93aGlsZV90b3BANTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAyMAogICAgaW50YyA0IC8vIDIwMAogICAgPAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX3doaWxlQDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODQxCiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwKQogICAgaW50YyA0IC8vIDIwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDIwCiAgICBpbnRjXzIgLy8gNjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODQyCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0Mi04NDMKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NDMKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2J1cnkgMTgKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0Mi04NDMKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBmcmFtZV9kaWcgMTIKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgNTYgLy8gNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NDMKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBmcmFtZV9kaWcgNDUKICAgIDwKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0NAogICAgLy8gY29uc3QgdGltZUluUG9vbDogdWludDY0ID0gdGhpc0Vwb2NoQmVnaW4gLSBjbXBTdGFrZXIuZW50cnlSb3VuZAogICAgZnJhbWVfZGlnIDQ1CiAgICBmcmFtZV9kaWcgMzgKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NDYKICAgIC8vIGlmICh0aW1lSW5Qb29sID49IGVwb2NoUm91bmRMZW5ndGgpIHsKICAgIGZyYW1lX2RpZyA0NAogICAgPj0KICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NAogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODUxCiAgICAvLyBpZiAodG9rZW5SZXdhcmRBdmFpbCA+IDApIHsKICAgIGZyYW1lX2RpZyAzMgogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NTIKICAgIC8vIGNvbnN0IHN0YWtlclRva2VuUmV3YXJkID0gd2lkZVJhdGlvKFtjbXBTdGFrZXIuYmFsYW5jZSwgdG9rZW5SZXdhcmRBdmFpbF0sIFtuZXdQb29sVG90YWxTdGFrZV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyMwogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg0MgogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODU0CiAgICAvLyBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlICs9IHN0YWtlclRva2VuUmV3YXJkCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg1NQogICAgLy8gdG9rZW5SZXdhcmRQYWlkT3V0ICs9IHN0YWtlclRva2VuUmV3YXJkCiAgICBmcmFtZV9kaWcgMzQKICAgIHVuY292ZXIgMgogICAgKwogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSA2CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2MToKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfYnVyeSAzNAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2J1cnkgMTgKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg1NwogICAgLy8gaWYgKGFsZ29SZXdhcmRBdmFpbCA+IDApIHsKICAgIGZyYW1lX2RpZyA4CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2MwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg1OAogICAgLy8gY29uc3Qgc3Rha2VyUmV3YXJkID0gd2lkZVJhdGlvKFtjbXBTdGFrZXIuYmFsYW5jZSwgYWxnb1Jld2FyZEF2YWlsXSwgW25ld1Bvb2xUb3RhbFN0YWtlXSkKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyMwogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NjEKICAgIC8vIGNtcFN0YWtlci5iYWxhbmNlICs9IHN0YWtlclJld2FyZAogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NjIKICAgIC8vIGNtcFN0YWtlci50b3RhbFJld2FyZGVkICs9IHN0YWtlclJld2FyZAogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYzCiAgICAvLyBpbmNyZWFzZWRTdGFrZSArPSBzdGFrZXJSZXdhcmQKICAgIGZyYW1lX2RpZyAxNwogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9idXJ5IDYKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDYzOgogICAgZnJhbWVfZGlnIDE4CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODY3CiAgICAvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbG9uZShjbXBTdGFrZXIpCiAgICBmcmFtZV9kaWcgMTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIGZyYW1lX2J1cnkgMTgKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjQ6CiAgICBiIGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY1CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NToKICAgIGZyYW1lX2RpZyAxOAogICAgZnJhbWVfYnVyeSAxNwogICAgZnJhbWVfZGlnIDM1CiAgICBmcmFtZV9idXJ5IDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMjAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIwCiAgICBiIGVwb2NoQmFsYW5jZVVwZGF0ZV93aGlsZV90b3BANTUKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl93aGlsZUA2NjoKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NzoKICAgIGIgZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjgKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY4OgogICAgZnJhbWVfZGlnIDM1CiAgICBmcmFtZV9kaWcgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NzcKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg3NwogICAgLy8gY29uc3Qgcm91bmRzTGVmdEluQmluOiB1aW50NjQgPSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSAtIEdsb2JhbC5yb3VuZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNiAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg3NwogICAgLy8gY29uc3Qgcm91bmRzTGVmdEluQmluOiB1aW50NjQgPSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSAtIEdsb2JhbC5yb3VuZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIGdsb2JhbCBSb3VuZAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg3OAogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gaW5jcmVhc2VkU3Rha2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODc4CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBpbmNyZWFzZWRTdGFrZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODc4CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBpbmNyZWFzZWRTdGFrZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4ODAKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgKyBCaWdVaW50KGluY3JlYXNlZFN0YWtlKSAqIEJpZ1VpbnQocm91bmRzTGVmdEluQmluKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTExCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4ODAKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgKyBCaWdVaW50KGluY3JlYXNlZFN0YWtlKSAqIEJpZ1VpbnQocm91bmRzTGVmdEluQmluKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMQogICAgYioKICAgIHVuY292ZXIgMgogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4NzktODgxCiAgICAvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgPSBuZXcgVWludDEyOCgKICAgIC8vICAgdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSArIEJpZ1VpbnQoaW5jcmVhc2VkU3Rha2UpICogQmlnVWludChyb3VuZHNMZWZ0SW5CaW4pLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18zIC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTEKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA3IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg3OS04ODEKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChpbmNyZWFzZWRTdGFrZSkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4MgogICAgLy8gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSA9IHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgKyBpbmNyZWFzZWRTdGFrZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTUKICAgIC8vIHJld2FyZEFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jld2FyZEFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgMTEgLy8gInJld2FyZEFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4MgogICAgLy8gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSA9IHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgKyBpbmNyZWFzZWRTdGFrZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjExNQogICAgLy8gcmV3YXJkQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmV3YXJkQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyAxMSAvLyAicmV3YXJkQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODgyCiAgICAvLyB0aGlzLnJld2FyZEFjY3VtdWxhdG9yLnZhbHVlID0gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSArIGluY3JlYXNlZFN0YWtlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4OC04OTcKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLnN0YWtlVXBkYXRlZFZpYVJld2FyZHMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBpbmNyZWFzZWRTdGFrZSwKICAgIC8vICAgICB0b2tlblJld2FyZFBhaWRPdXQsCiAgICAvLyAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCiAgICAvLyAgICAgZXhjZXNzVG9GZWVTaW5rLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4ODkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4ODkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODkxCiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NwogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4OTEKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4OTEKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4OTMKICAgIC8vIHRva2VuUmV3YXJkUGFpZE91dCwKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg5NAogICAgLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCiAgICBmcmFtZV9kaWcgMzYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4OTUKICAgIC8vIGV4Y2Vzc1RvRmVlU2luaywKICAgIGZyYW1lX2RpZyAxNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjg4OC04OTcKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLnN0YWtlVXBkYXRlZFZpYVJld2FyZHMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBpbmNyZWFzZWRTdGFrZSwKICAgIC8vICAgICB0b2tlblJld2FyZFBhaWRPdXQsCiAgICAvLyAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCiAgICAvLyAgICAgZXhjZXNzVG9GZWVTaW5rLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDQxOGZjZWZjIC8vIG1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgplcG9jaEJhbGFuY2VVcGRhdGVfZWxzZV9ib2R5QDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcwMwogICAgLy8gfSBlbHNlIGlmICh2YWxpZGF0b3JDb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZSAhPT0gMCkgewogICAgZnJhbWVfZGlnIDQzCiAgICBwdXNoaW50IDE3NyAvLyAxNzcKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjkKICAgIGZyYW1lX2RpZyA3CiAgICBmcmFtZV9idXJ5IDgKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzA2CiAgICAvLyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCA9IHdpZGVSYXRpbyhbYWxnb1Jld2FyZEF2YWlsLCB2YWxpZGF0b3JDb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZV0sIFsxXzAwMF8wMDBdKQogICAgZnJhbWVfZGlnIDcKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDI5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIDB4MDAwMTAwMDAwMDAwMDAwZjQyNDAKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcwOQogICAgLy8gYWxnb1Jld2FyZEF2YWlsIC09IHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0CiAgICBzd2FwCiAgICBkaWcgMQogICAgLQogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzE2CiAgICAvLyBpZiAodmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgPiAwKSB7CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcxOQogICAgLy8gbGV0IG1hbmFnZXJUb3BPZmY6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3MjEKICAgIC8vIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyICE9PSB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgJiYKICAgIGZyYW1lX2RpZyA0MwogICAgZHVwCiAgICBleHRyYWN0IDQ0IDMyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAxODEgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAhPQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcyMS03MjIKICAgIC8vIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyICE9PSB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgJiYKICAgIC8vIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZS5iYWxhbmNlIC0gdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIubmF0aXZlLm1pbkJhbGFuY2UgPCAyXzEwMF8wMDAKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzIyCiAgICAvLyB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUuYmFsYW5jZSAtIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZS5taW5CYWxhbmNlIDwgMl8xMDBfMDAwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgc3dhcAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC0KICAgIGludGMgNyAvLyAyMTAwMDAwCiAgICA8CiAgICBmcmFtZV9kaWcgMjEKICAgIGZyYW1lX2J1cnkgMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3MjEtNzIyCiAgICAvLyB2YWxpZGF0b3JDb25maWcubWFuYWdlciAhPT0gdmFsaWRhdG9yQ29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICYmCiAgICAvLyB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUuYmFsYW5jZSAtIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZS5taW5CYWxhbmNlIDwgMl8xMDBfMDAwCiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcyNAogICAgLy8gbWFuYWdlclRvcE9mZiA9IHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0IDwgMl8xMDBfMDAwID8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgOiAyXzEwMF8wMDAKICAgIGZyYW1lX2RpZyAzNgogICAgZHVwCiAgICBpbnRjIDcgLy8gMjEwMDAwMAogICAgPAogICAgaW50YyA3IC8vIDIxMDAwMDAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcyNS03MzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogbWFuYWdlclRvcE9mZiwKICAgIC8vICAgICByZWNlaXZlcjogdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkIHRvIG1hbmFnZXIgZm9yIGZ1bmRpbmcgZXBvY2ggdXBkYXRlcycsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjcyOQogICAgLy8gbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQgdG8gbWFuYWdlciBmb3IgZnVuZGluZyBlcG9jaCB1cGRhdGVzJywKICAgIHB1c2hieXRlcyAidmFsaWRhdG9yIHJld2FyZCB0byBtYW5hZ2VyIGZvciBmdW5kaW5nIGVwb2NoIHVwZGF0ZXMiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzI1LTczMAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBtYW5hZ2VyVG9wT2ZmLAogICAgLy8gICAgIHJlY2VpdmVyOiB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQgdG8gbWFuYWdlciBmb3IgZnVuZGluZyBlcG9jaCB1cGRhdGVzJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3MjUtNzMxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAndmFsaWRhdG9yIHJld2FyZCB0byBtYW5hZ2VyIGZvciBmdW5kaW5nIGVwb2NoIHVwZGF0ZXMnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBmcmFtZV9idXJ5IDIyCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3MzMKICAgIC8vIGlmICh2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYgPiAwKSB7CiAgICBmcmFtZV9kaWcgMzYKICAgIGZyYW1lX2RpZyAyMgogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMwCiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjczNC03NDAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgLSBtYW5hZ2VyVG9wT2ZmLAogICAgLy8gICAgIHJlY2VpdmVyOiB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzM4CiAgICAvLyBub3RlOiAndmFsaWRhdG9yIHJld2FyZCcsCiAgICBwdXNoYnl0ZXMgInZhbGlkYXRvciByZXdhcmQiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMzAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzM0LTczOQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQnLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjczNC03NDAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgLSBtYW5hZ2VyVG9wT2ZmLAogICAgLy8gICAgIHJlY2VpdmVyOiB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzc6CiAgICBmcmFtZV9kaWcgNwogICAgZnJhbWVfYnVyeSA4CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIGZyYW1lX2RpZyA4CiAgICBmcmFtZV9idXJ5IDcKICAgIGIgZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzkKCmVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MDAtNjAzCiAgICAvLyB0b2tlblBheW91dFJhdGlvID0gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUucHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8sIHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHBvb2xPbmVBcHBJRCksCiAgICAvLyAgIGFyZ3M6IFt7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjAyCiAgICAvLyBhcmdzOiBbeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc3CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjYwMgogICAgLy8gYXJnczogW3sgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODAKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NjAyCiAgICAvLyBhcmdzOiBbeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo2MDAtNjAzCiAgICAvLyB0b2tlblBheW91dFJhdGlvID0gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUucHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8sIHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHBvb2xPbmVBcHBJRCksCiAgICAvLyAgIGFyZ3M6IFt7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAyMCAvLyBtZXRob2QgInByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NFsyNF0sdWludDY0KSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDQ3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGZyYW1lX2J1cnkgNDIKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxMAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuZ29PbmxpbmUoZmVlUGF5bWVudDogdWludDY0LCB2b3RlUEs6IGJ5dGVzLCBzZWxlY3Rpb25QSzogYnl0ZXMsIHN0YXRlUHJvb2ZQSzogYnl0ZXMsIHZvdGVGaXJzdDogdWludDY0LCB2b3RlTGFzdDogdWludDY0LCB2b3RlS2V5RGlsdXRpb246IHVpbnQ2NCkgLT4gdm9pZDoKZ29PbmxpbmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTEzLTkyMQogICAgLy8gZ29PbmxpbmUoCiAgICAvLyAgIGZlZVBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdm90ZVBLOiBieXRlczwzMj4sCiAgICAvLyAgIHNlbGVjdGlvblBLOiBieXRlczwzMj4sCiAgICAvLyAgIHN0YXRlUHJvb2ZQSzogYnl0ZXM8NjQ+LAogICAgLy8gICB2b3RlRmlyc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUxhc3Q6IHVpbnQ2NCwKICAgIC8vICAgdm90ZUtleURpbHV0aW9uOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjkyMgogICAgLy8gYXNzZXJ0KHRoaXMuaXNPd25lck9yTWFuYWdlckNhbGxlcigpLCAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJykKICAgIGNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMTgKICAgIC8vIGlmICghb3AuQWNjdFBhcmFtcy5hY2N0SW5jZW50aXZlRWxpZ2libGUoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpWzBdKSB7CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RJbmNlbnRpdmVFbGlnaWJsZQogICAgcG9wCiAgICBibnogZ29PbmxpbmVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAxOQogICAgLy8gcmV0dXJuIEdsb2JhbC5wYXlvdXRzR29PbmxpbmVGZWUKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKCmdvT25saW5lX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nZXRHb09ubGluZUZlZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjkyNAogICAgLy8gYXNzZXJ0TWF0Y2goZmVlUGF5bWVudCwgeyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGFtb3VudDogZXh0cmFGZWUgfSkKICAgIGZyYW1lX2RpZyAtNwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgZnJhbWVfZGlnIC03CiAgICBndHhucyBBbW91bnQKICAgIGRpZyAyCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBhc3NlcnQgdGFyZ2V0IGlzIG1hdGNoIGZvciBjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTI1LTkzNQogICAgLy8gaXR4bgogICAgLy8gICAua2V5UmVnaXN0cmF0aW9uKHsKICAgIC8vICAgICB2b3RlS2V5OiB2b3RlUEssCiAgICAvLyAgICAgc2VsZWN0aW9uS2V5OiBzZWxlY3Rpb25QSywKICAgIC8vICAgICBzdGF0ZVByb29mS2V5OiBzdGF0ZVByb29mUEssCiAgICAvLyAgICAgdm90ZUZpcnN0OiB2b3RlRmlyc3QsCiAgICAvLyAgICAgdm90ZUxhc3Q6IHZvdGVMYXN0LAogICAgLy8gICAgIHZvdGVLZXlEaWx1dGlvbjogdm90ZUtleURpbHV0aW9uLAogICAgLy8gICAgIGZlZTogZXh0cmFGZWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFZvdGVLZXlEaWx1dGlvbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFZvdGVMYXN0CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgVm90ZUZpcnN0CiAgICBmcmFtZV9kaWcgLTQKICAgIGl0eG5fZmllbGQgU3RhdGVQcm9vZlBLCiAgICBmcmFtZV9kaWcgLTUKICAgIGl0eG5fZmllbGQgU2VsZWN0aW9uUEsKICAgIGZyYW1lX2RpZyAtNgogICAgaXR4bl9maWVsZCBWb3RlUEsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5MjUtOTM0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5rZXlSZWdpc3RyYXRpb24oewogICAgLy8gICAgIHZvdGVLZXk6IHZvdGVQSywKICAgIC8vICAgICBzZWxlY3Rpb25LZXk6IHNlbGVjdGlvblBLLAogICAgLy8gICAgIHN0YXRlUHJvb2ZLZXk6IHN0YXRlUHJvb2ZQSywKICAgIC8vICAgICB2b3RlRmlyc3Q6IHZvdGVGaXJzdCwKICAgIC8vICAgICB2b3RlTGFzdDogdm90ZUxhc3QsCiAgICAvLyAgICAgdm90ZUtleURpbHV0aW9uOiB2b3RlS2V5RGlsdXRpb24sCiAgICAvLyAgICAgZmVlOiBleHRyYUZlZSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjkyNS05MzUKICAgIC8vIGl0eG4KICAgIC8vICAgLmtleVJlZ2lzdHJhdGlvbih7CiAgICAvLyAgICAgdm90ZUtleTogdm90ZVBLLAogICAgLy8gICAgIHNlbGVjdGlvbktleTogc2VsZWN0aW9uUEssCiAgICAvLyAgICAgc3RhdGVQcm9vZktleTogc3RhdGVQcm9vZlBLLAogICAgLy8gICAgIHZvdGVGaXJzdDogdm90ZUZpcnN0LAogICAgLy8gICAgIHZvdGVMYXN0OiB2b3RlTGFzdCwKICAgIC8vICAgICB2b3RlS2V5RGlsdXRpb246IHZvdGVLZXlEaWx1dGlvbiwKICAgIC8vICAgICBmZWU6IGV4dHJhRmVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCmdvT25saW5lX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDIxCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5MjMKICAgIC8vIGNvbnN0IGV4dHJhRmVlID0gdGhpcy5nZXRHb09ubGluZUZlZSgpCiAgICBiIGdvT25saW5lX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nZXRHb09ubGluZUZlZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nb09mZmxpbmUoKSAtPiB2b2lkOgpnb09mZmxpbmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ2CiAgICAvLyBpZiAoVHhuLnNlbmRlciAhPT0gQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MpIHsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NDYKICAgIC8vIGlmIChUeG4uc2VuZGVyICE9PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgICE9CiAgICBieiBnb09mZmxpbmVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ3CiAgICAvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQogICAgY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCgpnb09mZmxpbmVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk1MAogICAgLy8gaXR4bi5rZXlSZWdpc3RyYXRpb24oe30pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5saW5rVG9ORkQobmZkQXBwSWQ6IHVpbnQ2NCwgbmZkTmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmxpbmtUb05GRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NTYKICAgIC8vIGxpbmtUb05GRChuZmRBcHBJZDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk1NwogICAgLy8gYXNzZXJ0KHRoaXMuaXNPd25lck9yTWFuYWdlckNhbGxlcigpLCAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJykKICAgIGNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk1OS05NzAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKG5mZFJlZ2lzdHJ5QXBwSWQpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIEJ5dGVzKCd2ZXJpZnlfbmZkX2FkZHInKSwKICAgIC8vICAgICAgIEJ5dGVzKG5mZE5hbWUpLAogICAgLy8gICAgICAgb3AuaXRvYihuZmRBcHBJZCksCiAgICAvLyAgICAgICBlbmNvZGVBcmM0KEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHM6IFtBcHBsaWNhdGlvbihuZmRBcHBJZCldLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NjEKICAgIC8vIGFwcElkOiBBcHBsaWNhdGlvbihuZmRSZWdpc3RyeUFwcElkKSwKICAgIGludGMgMTAgLy8gVE1QTF9ORkRfUkVHSVNUUllfQVBQX0lECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTY1CiAgICAvLyBvcC5pdG9iKG5mZEFwcElkKSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk2NgogICAgLy8gZW5jb2RlQXJjNChHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk2MwogICAgLy8gQnl0ZXMoJ3ZlcmlmeV9uZmRfYWRkcicpLAogICAgcHVzaGJ5dGVzICJ2ZXJpZnlfbmZkX2FkZHIiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NTktOTY5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbihuZmRSZWdpc3RyeUFwcElkKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBCeXRlcygndmVyaWZ5X25mZF9hZGRyJyksCiAgICAvLyAgICAgICBCeXRlcyhuZmROYW1lKSwKICAgIC8vICAgICAgIG9wLml0b2IobmZkQXBwSWQpLAogICAgLy8gICAgICAgZW5jb2RlQXJjNChHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHBzOiBbQXBwbGljYXRpb24obmZkQXBwSWQpXSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5NTktOTcwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbihuZmRSZWdpc3RyeUFwcElkKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBCeXRlcygndmVyaWZ5X25mZF9hZGRyJyksCiAgICAvLyAgICAgICBCeXRlcyhuZmROYW1lKSwKICAgIC8vICAgICAgIG9wLml0b2IobmZkQXBwSWQpLAogICAgLy8gICAgICAgZW5jb2RlQXJjNChHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHBzOiBbQXBwbGljYXRpb24obmZkQXBwSWQpXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5wcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbyhwb29sS2V5OiBieXRlcykgLT4gYnl0ZXM6CnByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk3OQogICAgLy8gcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8ocG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSk6IFBvb2xUb2tlblBheW91dFJhdGlvIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk4MAogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9ySWQudmFsdWUgPT09IHBvb2xLZXkuaWQsICdjYWxsZXIgbXVzdCBiZSBwYXJ0IG9mIHNhbWUgdmFsaWRhdG9yIHNldCEnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NwogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5ODAKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvcklkLnZhbHVlID09PSBwb29sS2V5LmlkLCAnY2FsbGVyIG11c3QgYmUgcGFydCBvZiBzYW1lIHZhbGlkYXRvciBzZXQhJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gY2FsbGVyIG11c3QgYmUgcGFydCBvZiBzYW1lIHZhbGlkYXRvciBzZXQhCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTgxCiAgICAvLyBhc3NlcnQodGhpcy5wb29sSWQudmFsdWUgPT09IDEsICdjYWxsZWUgbXVzdCBiZSBwb29sIDEnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5ODEKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSwgJ2NhbGxlZSBtdXN0IGJlIHBvb2wgMScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gY2FsbGVlIG11c3QgYmUgcG9vbCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTgyCiAgICAvLyBhc3NlcnQocG9vbEtleS5wb29sSWQgIT09IDEsICdjYWxsZXIgbXVzdCBOT1QgYmUgcG9vbCAxJykKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA4IDgKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGFzc2VydCAvLyBjYWxsZXIgbXVzdCBOT1QgYmUgcG9vbCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTg0LTk4NwogICAgLy8gY29uc3QgY2FsbGVyUG9vbEFwcElEID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3Bvb2xLZXkuaWQsIHBvb2xLZXkucG9vbElkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTg1CiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjc0CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTg1CiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk4NC05ODcKICAgIC8vIGNvbnN0IGNhbGxlclBvb2xBcHBJRCA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlJbnRlcmZhY2UucHJvdG90eXBlLmdldFBvb2xBcHBJZCwgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtwb29sS2V5LmlkLCBwb29sS2V5LnBvb2xJZF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgMjUgLy8gbWV0aG9kICJnZXRQb29sQXBwSWQodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5ODgKICAgIC8vIGFzc2VydChjYWxsZXJQb29sQXBwSUQgPT09IHBvb2xLZXkucG9vbEFwcElkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk4OQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBvb2xLZXkucG9vbEFwcElkKS5hZGRyZXNzKQogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk5MS05OTQKICAgIC8vIHJldHVybiBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5zZXRUb2tlblBheW91dFJhdGlvLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5OTMKICAgIC8vIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5OTEtOTk0CiAgICAvLyByZXR1cm4gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuc2V0VG9rZW5QYXlvdXRSYXRpbywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAyNiAvLyBtZXRob2QgInNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSAtPiB1aW50NjQ6CmlzT3duZXJPck1hbmFnZXJDYWxsZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OTk3CiAgICAvLyBwcml2YXRlIGlzT3duZXJPck1hbmFnZXJDYWxsZXIoKTogYm9vbGVhbiB7CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5OTgtMTAwMQogICAgLy8gY29uc3QgT3duZXJBbmRNYW5hZ2VyID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUludGVyZmFjZS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5OTkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6NzQKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo5OTkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwMAogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czo3NwogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAwCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjk5OC0xMDAxCiAgICAvLyBjb25zdCBPd25lckFuZE1hbmFnZXIgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5SW50ZXJmYWNlLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MmZhMjJjNGIgLy8gbWV0aG9kICJnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodWludDY0KShhZGRyZXNzLGFkZHJlc3MpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwMgogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclswXS5uYXRpdmUgfHwgVHhuLnNlbmRlciA9PT0gT3duZXJBbmRNYW5hZ2VyWzFdLm5hdGl2ZQogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgZXh0cmFjdCA0IDMyCiAgICA9PQogICAgYm56IGlzT3duZXJPck1hbmFnZXJDYWxsZXJfYm9vbF90cnVlQDMKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDM2IDMyCiAgICA9PQogICAgYnogaXNPd25lck9yTWFuYWdlckNhbGxlcl9ib29sX2ZhbHNlQDQKCmlzT3duZXJPck1hbmFnZXJDYWxsZXJfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQoKaXNPd25lck9yTWFuYWdlckNhbGxlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwMgogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclswXS5uYXRpdmUgfHwgVHhuLnNlbmRlciA9PT0gT3duZXJBbmRNYW5hZ2VyWzFdLm5hdGl2ZQogICAgc3dhcAogICAgcmV0c3ViCgppc093bmVyT3JNYW5hZ2VyQ2FsbGVyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGlzT3duZXJPck1hbmFnZXJDYWxsZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5jaGVja0lmQmluQ2xvc2VkKCkgLT4gdm9pZDoKY2hlY2tJZkJpbkNsb3NlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDMxCiAgICAvLyBwcml2YXRlIGNoZWNrSWZCaW5DbG9zZWQoKSB7CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzMgogICAgLy8gY29uc3QgY3VycmVudEJpblNpemUgPSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZQogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNiAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMzIKICAgIC8vIGNvbnN0IGN1cnJlbnRCaW5TaXplID0gdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMzMKICAgIC8vIGlmIChHbG9iYWwucm91bmQgPj0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgY3VycmVudEJpblNpemUpIHsKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDYKICAgIC8vIGJpblJvdW5kU3RhcnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYmluUm91bmRTdGFydCcgfSkKICAgIGJ5dGVjIDkgLy8gImJpblJvdW5kU3RhcnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzMwogICAgLy8gaWYgKEdsb2JhbC5yb3VuZCA+PSB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgKyBjdXJyZW50QmluU2l6ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgPj0KICAgIGJ6IGNoZWNrSWZCaW5DbG9zZWRfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzNAogICAgLy8gZW5zdXJlQnVkZ2V0KDMwMCkKICAgIGludGMgNiAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM1CiAgICAvLyBjb25zdCBhcHByb3hSb3VuZHNQZXJZZWFyID0gQmlnVWludChjdXJyZW50QmluU2l6ZSAqIDM2NSkKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIHB1c2hpbnQgMzY1IC8vIDM2NQogICAgKgogICAgaXRvYgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzNgogICAgLy8gY29uc3QgYXZnU3Rha2UgPSBCaWdVaW50KHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgLyBCaWdVaW50KGN1cnJlbnRCaW5TaXplKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTExCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM2CiAgICAvLyBjb25zdCBhdmdTdGFrZSA9IEJpZ1VpbnQodGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSAvIEJpZ1VpbnQoY3VycmVudEJpblNpemUpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBiLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM3CiAgICAvLyBpZiAoYXZnU3Rha2UgIT09IDBuKSB7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGIhPQogICAgYnogY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQzCiAgICAvLyAoKChCaWdVaW50KHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUpICogMTAwMDAwMG4pIC8gYXZnU3Rha2UpICoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTE1CiAgICAvLyByZXdhcmRBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXdhcmRBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQzCiAgICAvLyAoKChCaWdVaW50KHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUpICogMTAwMDAwMG4pIC8gYXZnU3Rha2UpICoKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwZjQyNDAKICAgIGIqCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNDQKICAgIC8vIChhcHByb3hSb3VuZHNQZXJZZWFyIC8gQmlnVWludChjdXJyZW50QmluU2l6ZSkpKSAvCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDQKICAgIGIvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0My0xMDQ0CiAgICAvLyAoKChCaWdVaW50KHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUpICogMTAwMDAwMG4pIC8gYXZnU3Rha2UpICoKICAgIC8vICAgKGFwcHJveFJvdW5kc1BlclllYXIgLyBCaWdVaW50KGN1cnJlbnRCaW5TaXplKSkpIC8KICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0NQogICAgLy8gMTAwbiwKICAgIGJ5dGVjIDE0IC8vIDB4NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQzLTEwNDUKICAgIC8vICgoKEJpZ1VpbnQodGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSkgKiAxMDAwMDAwbikgLyBhdmdTdGFrZSkgKgogICAgLy8gICAoYXBwcm94Um91bmRzUGVyWWVhciAvIEJpZ1VpbnQoY3VycmVudEJpblNpemUpKSkgLwogICAgLy8gICAxMDBuLAogICAgYi8KICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNDgKICAgIC8vIGxldCBhbHBoYSA9IEJpZ1VpbnQoMTApIC8vIC4xCiAgICBwdXNoYnl0ZXMgMHgwYQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1MAogICAgLy8gaWYgKGF2Z1N0YWtlID4gMzAwMDAwMDAwMDAwbikgewogICAgcHVzaGJ5dGVzIDB4NDVkOTY0YjgwMAogICAgYj4KICAgIGJ6IGNoZWNrSWZCaW5DbG9zZWRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1MQogICAgLy8gYWxwaGEgPSBCaWdVaW50KDkwKSAvLyAuOQogICAgcHVzaGJ5dGVzIDB4NWEKICAgIGZyYW1lX2J1cnkgMAoKY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1NQogICAgLy8gaWYgKHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlLm5hdGl2ZSA9PT0gMG4pIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTE4CiAgICAvLyB3ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ2V3bWEnIH0pCiAgICBieXRlYyAxMiAvLyAiZXdtYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDU1CiAgICAvLyBpZiAodGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUubmF0aXZlID09PSAwbikgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBieiBjaGVja0lmQmluQ2xvc2VkX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1NgogICAgLy8gdGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUgPSBuZXcgVWludDEyOChhcHIpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18zIC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTgKICAgIC8vIHdlaWdodGVkTW92aW5nQXZlcmFnZSA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnZXdtYScgfSkKICAgIGJ5dGVjIDEyIC8vICJld21hIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTYKICAgIC8vIHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlID0gbmV3IFVpbnQxMjgoYXByKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNoZWNrSWZCaW5DbG9zZWRfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNjYKICAgIC8vIHRoaXMuc2V0Um91bmRzUGVyRGF5KCkKICAgIGNhbGxzdWIgc2V0Um91bmRzUGVyRGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgoQmlnVWludCh0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSkgKiBCaWdVaW50KHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6ODYKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgoQmlnVWludCh0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSkgKiBCaWdVaW50KHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNAogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDYgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDY3CiAgICAvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgPSBuZXcgVWludDEyOChCaWdVaW50KHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlKSAqIEJpZ1VpbnQodGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGIqCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzMgLy8gMTYKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjExMQogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDcgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2NwogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgoQmlnVWludCh0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSkgKiBCaWdVaW50KHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTE1CiAgICAvLyByZXdhcmRBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXdhcmRBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDY4CiAgICAvLyB0aGlzLnJld2FyZEFjY3VtdWxhdG9yLnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2OQogICAgLy8gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlID0gR2xvYmFsLnJvdW5kIC0gKEdsb2JhbC5yb3VuZCAlIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNiAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNjkKICAgIC8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IEdsb2JhbC5yb3VuZCAtIChHbG9iYWwucm91bmQgJSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAlCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNjkKICAgIC8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IEdsb2JhbC5yb3VuZCAtIChHbG9iYWwucm91bmQgJSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjaGVja0lmQmluQ2xvc2VkX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKY2hlY2tJZkJpbkNsb3NlZF9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDU5CiAgICAvLyAodGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUubmF0aXZlICogKEJpZ1VpbnQoMTAwKSAtIGFscGhhKSkgLyBCaWdVaW50KDEwMCkgKwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTgKICAgIC8vIHdlaWdodGVkTW92aW5nQXZlcmFnZSA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnZXdtYScgfSkKICAgIGJ5dGVjIDEyIC8vICJld21hIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTkKICAgIC8vICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZS5uYXRpdmUgKiAoQmlnVWludCgxMDApIC0gYWxwaGEpKSAvIEJpZ1VpbnQoMTAwKSArCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgMTQgLy8gMHg2NAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgYi0KICAgIGIqCiAgICBieXRlYyAxNCAvLyAweDY0CiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNjAKICAgIC8vIChhcHIgKiBhbHBoYSkgLyBCaWdVaW50KDEwMCksCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWMgMTQgLy8gMHg2NAogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDU5LTEwNjAKICAgIC8vICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZS5uYXRpdmUgKiAoQmlnVWludCgxMDApIC0gYWxwaGEpKSAvIEJpZ1VpbnQoMTAwKSArCiAgICAvLyAgIChhcHIgKiBhbHBoYSkgLyBCaWdVaW50KDEwMCksCiAgICBiKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTgtMTA2MQogICAgLy8gdGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUgPSBuZXcgVWludDEyOCgKICAgIC8vICAgKHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlLm5hdGl2ZSAqIChCaWdVaW50KDEwMCkgLSBhbHBoYSkpIC8gQmlnVWludCgxMDApICsKICAgIC8vICAgICAoYXByICogYWxwaGEpIC8gQmlnVWludCgxMDApLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18zIC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMTgKICAgIC8vIHdlaWdodGVkTW92aW5nQXZlcmFnZSA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnZXdtYScgfSkKICAgIGJ5dGVjIDEyIC8vICJld21hIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTgtMTA2MQogICAgLy8gdGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUgPSBuZXcgVWludDEyOCgKICAgIC8vICAgKHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlLm5hdGl2ZSAqIChCaWdVaW50KDEwMCkgLSBhbHBoYSkpIC8gQmlnVWludCgxMDApICsKICAgIC8vICAgICAoYXByICogYWxwaGEpIC8gQmlnVWludCgxMDApLAogICAgLy8gKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDgKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLnNldFJvdW5kc1BlckRheSgpIC0+IHZvaWQ6CnNldFJvdW5kc1BlckRheToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDczCiAgICAvLyBwcml2YXRlIHNldFJvdW5kc1BlckRheSgpIHsKICAgIHByb3RvIDAgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA3OAogICAgLy8gaWYgKFR4bi5maXJzdFZhbGlkIDwgMTIpIHsKICAgIHR4biBGaXJzdFZhbGlkCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICA8CiAgICBieiBzZXRSb3VuZHNQZXJEYXlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNiAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwODAKICAgIC8vIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlID0gQVBQUk9YX0FWR19ST1VORFNfUEVSX0RBWQogICAgaW50YyA5IC8vIDMwODU3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwODEKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpzZXRSb3VuZHNQZXJEYXlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwODUKICAgIC8vIG9wLkJsb2NrLmJsa1RpbWVzdGFtcChUeG4uZmlyc3RWYWxpZCAtIDEpIC0gb3AuQmxvY2suYmxrVGltZXN0YW1wKFR4bi5maXJzdFZhbGlkIC0gMTEpCiAgICB0eG4gRmlyc3RWYWxpZAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJsb2NrIEJsa1RpbWVzdGFtcAogICAgdHhuIEZpcnN0VmFsaWQKICAgIHB1c2hpbnQgMTEgLy8gMTEKICAgIC0KICAgIGJsb2NrIEJsa1RpbWVzdGFtcAogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDg2CiAgICAvLyBpZiAoYXZnQmxvY2tUaW1lVGVudGhzID09PSAwKSB7CiAgICBibnogc2V0Um91bmRzUGVyRGF5X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNAogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDYgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDg4CiAgICAvLyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSA9IEFQUFJPWF9BVkdfUk9VTkRTX1BFUl9EQVkKICAgIGludGMgOSAvLyAzMDg1NwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDg5CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKc2V0Um91bmRzUGVyRGF5X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDk0CiAgICAvLyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSA9ICgyNCAqIDYwICogNjAgKiAxMCkgLyBhdmdCbG9ja1RpbWVUZW50aHMKICAgIHB1c2hpbnQgODY0MDAwIC8vIDg2NDAwMAogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2Qvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQKICAgIC8vIHJvdW5kc1BlckRheSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyb3VuZHNQZXJEYXknIH0pCiAgICBieXRlYyA2IC8vICJyb3VuZHNQZXJEYXkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3N0YWtpbmdQb29sLmFsZ28udHM6MTA5NAogICAgLy8gdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgPSAoMjQgKiA2MCAqIDYwICogMTApIC8gYXZnQmxvY2tUaW1lVGVudGhzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyALAAFAEMgBnQGsAqCWgAHAhD2J8QEAJhwHc3Rha2VycwpjcmVhdG9yQXBwBBUffHULdmFsaWRhdG9ySWQGcG9vbElkBnN0YWtlZAxyb3VuZHNQZXJEYXkQc3Rha2VBY2N1bXVsYXRvcgIAAg1iaW5Sb3VuZFN0YXJ0Cm51bVN0YWtlcnMRcmV3YXJkQWNjdW11bGF0b3IEZXdtYQR1r/YdAWQNbWluRW50cnlTdGFrZQpsYXN0UGF5b3V0C2Vwb2NoTnVtYmVyCgABAAAAAAAPQkACAAEEDCJF4QMGgQEQAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAABKLcUbUEVydn0QRN+NhuAgADMRtBAGaCDQRZ6QqmBDFyyp0ER8/MBAT5xwy9BEIbWr4E9YktVgRc+7BXBGPz8osEhqNyXATvwmCNBJzuLkAEUe87IQSiTicXJxQ2GgCODgEGAP0A5wDJALYAqgCXAIAAbgBiADcAKwAVAAIiQzEZFEQxGEQ2GgGIDu8qTFCwI0MxGRREMRhENhoBFzYaAlcCAIgOmyNDMRkURDEYRIgOdCNDMRkURDEYRDEWIwlJOBAjEkQ2GgE2GgI2GgM2GgQXNhoFFzYaBheIDgMjQzEZFEQxGESIBuYjQzEZFEQxGEQ2GgFXAgCIBr8jQzEZFEQxGEQ2GgE2GgIXNhoDF4gGeSNDMRkURDEYRDYaAYgGLypMULAjQzEZFEQxGESIBTQjQzEZFEQxGEQ2GgE2GgIXiANLI0MxGRREMRhEMRYjCUk4ECMSRDYaAYgB8xYqTFCwI0MxGRREMRhEMRYjCUk4ECMSRIgBUSNDMRkURDEYRCNDMRkURDEYFEQ2GgEXNhoCFzYaAxc2GgQXiADJI0OKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJxWyHicVsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viYoCAyKAAEknFov+IlkiiwWLBAxBACOL/lcCAIsFSU4CgQgLWxaLA6NJFSUORCWvq4wDIwiMBUL/1ScWjACL/yJZjAEijAKLAosBDEEAI4v/VwIAiwJJTgKBCAtbFosAo0kVJQ5EJa+rjAAjCIwCQv/ViwOLAKJJFYEIDkSBCK+rF4v+i/+MAowBjACJigQAi/xAAFGL/RREi/4URIv/IQgPRCmL/Gcri/1nJwSL/mcnCiJnJwUiZycPi/9nJxAyBmcnESJniA6GMgZJIicGZUQYCScJTGcnBycXZycLImcnDCcXZ4mL/USL/kRC/66KAQAovUUBFESxIillRCIrZUQWJw2yGrIashiBBrIQIrIBs7Q+SVcABCoSRCEFW0lBAFAiJwRlRCMSQQBGI4GgjQYLgdT2vgIIi/84BzIKEov/OAhPAhIQRCiBgGS5SIsAQQAeIicEZUQjEkEAFLEyCiKyErIUiwCyEYEEshAisgGziSJC/7eKAgEiSYAASSi9RQFEMQAiKWVEcghEEkSL/zIDE0SIDNWL/jgAIillRHIIRBKL/jgHMgoSEIv+OAhJTwIjEEQyBoHAAghMIkwiJwVlREsBCCcFTGciJwllRCInBmVECDIGCSInB2VETwIWSU4DTwIWo6BJFSUORCWvqycHTGciKL1FAUSLCCEEDEEAbCEGIoj9vosIJAtJjAIoTCS6SYwBVwAgSYwAi/8SQQAlKIsCSU4CJLqBIFuLBAgWiwFMXCCLBUlOAhZcOChPA08Cu4wAiYsGSYwDQAASiwAyAxKLBowDQQAGiwgjCIwDiwOMBosIIwiMCEL/h4sGSRQURCInD2VEiwQORCMJJAsoSwEkulcAIDIDEkSL/4sHUCIWTEsBUExQiwVJTgIWUChPA08CuyInCmVEIwgnCkxnjACJigIAIkmAAEcGi/4xABNBAASIC1xEiAufIowGKL1FAUSLBkkhBAxEIQYiiPzkJAtJjAUoTCS6SYwAVwAgi/4SQQGLi/+MBIv/QAANKIsFJLqBIFtJjP+MBIsEjP8oiwUkuoEgW0mL/wwURIv/CRaLAExcIEmMACInBWVEi/8JJwVMZyKMAkmBMFtJjANMjAFBAFQiJwRlRCMSQQElsSIpZUQiK2VEFicNshqyGrIYgQayECKyAbO0PklXAAQqEkSxIQVbiwOyEov+shSyEYEEshAisgGzIhaLAExcMIwAiwOMAosAjAGLAUmMAIEgW0mMCEEACyInD2VEiwgOQQC+I0SxgAh1bnN0YWtlZLIFi/6yB4v/sggjshAisgGzIowHiwCMAYsIQAAgIicKZUQjCScKTGeLADIDXAAiFkxLAVwoTFwwI4wHjAGLASiLBU8CuyInCWVEIicGZUQIMgYJi/8LFiInB2VETKFJFSUORCWvqycHTGexIillRCIrZUQiJwRlRDIITwIWTwIWUEwWUIv/FosCFoABACKLB1QnGLIaTwOyGov+shpPArIaTLIashqyGIEGshAisgGziSJC/z8iFosATFwwjABC/xGLBiMIjAZC/kWKAAAiSYAASTEAIii9RQFEiwVJIQQMRCEGIoj7HiQLSYwDKEwkukmMAVcAIIsEEkEAsCiLAyS6SVcwCIwAgTBbSYwCQAABiSInBGVEIxJBAIWxIillRCIrZUQWJw2yGrIashiBBrIQIrIBs7Q+SVcABCoSRLEhBVuLArISiwSyFLIRgQSyECKyAbMiFosBTFwwjAEoiwOLAbuxIillRCIrZUQiJwRlRDIITwIWTwIWUEwWUCIWJxiyGkyyGosEshqyGosAshqAAQCyGrIYgQayECKyAbOJIhaLAUxcMIwBQv+xiwUjCIwFQv8gigEBgAAiKL1FAUSLAUkhBAxEIQQiiPo4JAtJjAAoTCS6VwAgi/8SQQAIKIsAJLqMAImLASMIjAFC/8uKAwAxACIpZURyCEQSRCInBGVEIxJEi/5EsYv/shKL/bIUi/6yEYEEshAisgGziYoBAIgIP0SACGFsZ29kVmVyi/9niYoAACJHBoAARyIisSIpZUQiK2VEFicNshqyGrIYgQayECKyAbO0PkcCVwAEKhJESYGtAVpJTgIyBklLAhhLAUwJSU4CTgQiJxBlRElPBBgJTwITRIgIICcQTGciJxFlRCMIJxFMZyEFW0kyCEwyCklOAkxBAHYiJwRlRCMTQQA2sSIpZUQiK2VEFiMWJxmyGkyyGrIashiBBrIQIrIBs7Q+SVcEAExXAAQqEkQXSYwvcghMjDBEIicEZUQjEkEGGLEiKWVEIitlRBYnGrIashqyGIEGshAisgGztD5JVwQAjCpXAAQqEkSLMIwxizGMMLEiKWVEIitlRBaABB8vAQmyGrIashiBBrIQIrIBs7Q+SVcABCoSREmBFluMGjIKcwBEIicFZUQJMgpzAUQJjAcijBN1FicITFCBZBZQgegHFowCgAoAAQAAAAAAAAPoiPi6RgJJjApMgQ5bSYwnDEEAAyOMEyJJjB8ijCIijCQijA+MIIsuQQBBizCLLnAASIsaFhcJiyuBpQFbSYwoD0EAJCInBGVEIwmLKlcAwEyBCAtbiygWJwhMUEwWUCcSiPhaRgKMH4sfjCCLIEmMH0AAIosHIQgMQQAagBYhdG9rZW4mJiFub2FsZ28gdG8gcGF5sImLE0EEAIsrgbEBWosHSU4CFicITFBMFksBTFAnEoj4CEYCTIsKFlCLJxYXFicTTFCI9/VGAkmMDU4CCUmMDg1BAASLDowNiweLDUlOAglJjA+xMQIjCdEGgCJwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rsgWyB7III7IQIrIBs4wHIowRiwdAAA2LIowjixGMEosfQQLXIowYIowQiweMCIsfjCAovUUBRIsQIQQMQQGCgZADIoj3K4sQJAtJjAsoTCS6SYwDVwAgMgMTixGMEosIjAmLIowjiyCMIYsYjBlBADIoiwskuoE4W0mMKYstD0EAPiiLCyS6gSBbixgIjBiLEYwSiwiMCYsijCOLIIwhixiMGYsSjBGLCYwIiyOMIoshjCCLGYwYixAjCIwQQv9yiy2LKQlJjBuLLAyLEYwSiwiMCYsijCOLIIwhixiMGUEAyCiLCyS6gSBbSYwlixgIjBiLG4HoBwuLLAqMHIsijCOLIEmMIYsDjARBAEKLJRYnG0xQix8WUIscFlAiJwVlRBYnCExQiwJQiPaARgKLIEsBCSiLCyS6gTBbSwIIFosDTFwwiyJPAwiMI4wEjCGLIYsjiwRJgSBbSRYnG0xQiwcWUIscFlAiJwVlRBYnCExQiwJQiPY1RgKLCEsBCU8CSwIIFk8DTFwgSYEoW0sDCBZcKIsRTwMIKIsLTwO7jBKMCYwjjCGLGIwZixKMEYsJjAiLI4wiiyGMIIsZjBhC/s4iJwVlRIsYCUmMF4sijCOLEYwSQQEhIowUKL1FAUSLFCEEDEEBCSEEIoj1hIsUJAtJjAwoTCS6SYwFVwAgMgMTixGMEosijCNBANMoiwwkuoE4W0mMJostDIsRjBKLIowjQQC6iy2LJgmLLA+LEYwSiyKMI0EApIsijCOLBYwGiyBBADooiwxJTgIkuoEgWxYnCExQiyAWUIsXFicTTFCI9UlGAihPAiS6gTBbSwEIFosFTFwwiyJPAgiMI4wGiyOMIosGSYwFixGMEowGiwhBADmLBUmBIFtJFicITFCLCBZQixcWJxNMUIj0/0YCTEsBCBZPAkxcIEmBKFtLAggWXCiLEU8CCIwSjAaLEosGKIsMTwK7jBKLIowjQgAAixKMEYsjjCKLFCMIjBRC/uqLIowjixGMEkIAAIsjixIiJwllRCInBmVECDIGCSInBWVESwIIJwVMZyInB2VESwIWTwIWSwGjTwKgSRUlDkQlr6snB0xnIicLZURPAggnC0xnsSIpZUQiK2VEIicEZUQyCE8CFk8CFlBMFlBPAxaLJBaLDxaABEGPzvyyGk8DshpPBLIaTwKyGkyyGrIashiBBrIQIrIBs4mLK4GxAVpJjB2LB4wIQQDYiwdJFicITFCLHRZQJxKI9AJGAkmMJExLAQmMB0EAtSJJjBWLK0lXLCBJTgKMAFe1IEmMARNMjBZBAGqLAElzAERMcwFECSEHDIsVjBZBAFWLJEkhBwwhB04CTbGANXZhbGlkYXRvciByZXdhcmQgdG8gbWFuYWdlciBmb3IgZnVuZGluZyBlcG9jaCB1cGRhdGVzsgWLALIHSbIII7IQIrIBs4wWiySLFglJjB5BACSxgBB2YWxpZGF0b3IgcmV3YXJksgWLAbIHix6yCCOyECKyAbOLB4wIiwiMB0L7l7EiK2VEIicEZUQyCE8CFk8CFlBMFlAnFLIashqLL7IYgQayECKyAbO0PklXBACMKlcABCoSREL514oHAIgBGUQyCnMMSEAAMzITi/k4BzIKEov5OAhLAhIQRLGL/7IOi/6yDYv9sgyL/LI/i/uyC4v6sgqBArIQsgGziSJC/8sxACIpZURyCEQTQQAEiADJRLGBArIQIrIBs4mKAgCIALhEsSEKi/4WMgqL/rIygA92ZXJpZnlfbmZkX2FkZHKyGov/shpMshqyGrIYgQayECKyAbOJigEBIitlRIv/VwAIi/8iW0sCEkQiJwRlRCMSRIv/VwgIi/+BCFsjE0SxIillRCcZshpPArIaTLIaSbIYgQayECKyAbO0PklXBABMVwAEKhJEF4v/JVtMSwESRDEATHIIRBJEsUwWJxqyGrIashiBBrIQIrIBs7Q+SVcEAExXAAQqEkSJigABsSIpZUQiK2VEFoAEL6IsS7IashqyGIEGshAisgGztD5HAlcABCoSRDEATFcEIBJAAAsxAIsAVyQgEkEAAyNMiSJC//qKAAAiRwUnBmVMSU8CRDIGIicJZURPAggPQQCdIQYiiPE4iwVJge0CCxaMASInB2VETBZJjASiSYwDgACpQQBLIicLZUQWgAMPQkCjiwNJTgKiiwGLBKKjJw6ijAKAAQqMAIAFRdlkuAClQQAFgAFajAAiJwxlRIAAqEEAPYsCSRUlDkQlr6snDExniABVIicFZUQWIicGZUQWo0kVJQ5EJa+rJwdMZycLImcyBkkiJwZlRBgJJwlMZ4kiJwxlRCcOiwBJTgOhoycOoosCTwKjJw6ioEkVJQ5EJa+rJwxMZ0L/qIoAAIAAMQKBDAxBAAYnBiEJZ4kxAiMJ0QExAoELCdEBCUmMAEAABicGIQlniYGA3jSLAAonBkxniQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 0, "patch": 0 } }, "events": [], "templateVariables": { "NFD_REGISTRY_APP_ID": { "type": "AVMUint64" } } }