{ "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": "updateApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "UpdateApplication" ] }, "readonly": false, "events": [], "recommendations": {} }, { "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": false, "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": [ 1030, 1249, 1703, 1931, 2677, 3145 ], "errorMessage": "Box must have value" }, { "pc": [ 799, 1407, 1802, 2093, 2229, 2288, 2342, 3858, 4083, 4133, 4176 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 1238 ], "errorMessage": "If staker is not sender in removeStake call, then sender MUST be owner or manager of validator" }, { "pc": [ 1323 ], "errorMessage": "Insufficient balance" }, { "pc": [ 119, 138, 160, 172, 215, 227, 245, 268, 287, 299, 318, 348, 370, 379 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 410 ], "errorMessage": "OnCompletion is not UpdateApplication" }, { "pc": [ 1152 ], "errorMessage": "Staking pool full" }, { "pc": [ 658 ], "errorMessage": "Temporary: contract is upgradeable but only during testing and only from a development account" }, { "pc": [ 2353, 2364, 3653, 3657 ], "errorMessage": "account funded" }, { "pc": [ 1256, 1710, 1938 ], "errorMessage": "account not found" }, { "pc": [ 837, 874, 918, 940, 1991, 2239, 3928, 4100 ], "errorMessage": "application exists" }, { "pc": [ 847, 959, 3884 ], "errorMessage": "assert target is match for conditions" }, { "pc": [ 4031 ], "errorMessage": "callee must be pool 1" }, { "pc": [ 4044 ], "errorMessage": "caller must NOT be pool 1" }, { "pc": [ 4023 ], "errorMessage": "caller must be part of same validator set!" }, { "pc": [ 2033, 3868, 3936, 3953 ], "errorMessage": "can only be called by owner or manager of validator" }, { "pc": [ 383 ], "errorMessage": "can only call when creating" }, { "pc": [ 122, 141, 163, 175, 218, 230, 248, 271, 290, 302, 321, 351, 373, 413 ], "errorMessage": "can only call when not creating" }, { "pc": [ 2004 ], "errorMessage": "can only claim token rewards from validator that has them" }, { "pc": [ 2131 ], "errorMessage": "can't call epochBalanceUpdate in same epoch as prior call" }, { "pc": [ 1473 ], "errorMessage": "cannot reduce balance below minimum allowed stake unless all is removed" }, { "pc": [ 770, 774, 811, 863, 915, 937, 973, 985, 990, 999, 1157, 1208, 1340, 1368, 1378, 1382, 1465, 1518, 1558, 1563, 1576, 1597, 1601, 1606, 1763, 1773, 1777, 1844, 1848, 1853, 1988, 1998, 2063, 2067, 2122, 2144, 2181, 2191, 2195, 2244, 2254, 2258, 2309, 2313, 2358, 2478, 2914, 3015, 3120, 3438, 3443, 3452, 3464, 3495, 3507, 3511, 3516, 3816, 3821, 3925, 4010, 4028, 4049, 4142, 4146, 4214, 4224, 4252, 4268, 4314, 4359, 4383 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 2001 ], "errorMessage": "must be pool 1 in order to be called to pay out token rewards" }, { "pc": [ 1161 ], "errorMessage": "must stake at least the minimum for this pool" }, { "pc": [ 522, 580, 604, 1016, 1584, 3482, 4341 ], "errorMessage": "overflow" }, { "pc": [ 920 ], "errorMessage": "stake can only be added via the validator contract" }, { "pc": [ 765 ], "errorMessage": "staking pool already initialized" }, { "pc": [ 909 ], "errorMessage": "staking pool must be initialized first" }, { "pc": [ 681 ], "errorMessage": "staking pool must have minimum entry of 1 algo" }, { "pc": [ 1993 ], "errorMessage": "this can only be called via the validator contract" }, { "pc": [ 185, 331, 361 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDY0IDYgMjAwIDMwODU3IDE1NyAzMDAgMjEwMDAwMCAxMDAwMDAwIDIwMDAwMDAgVE1QTF9ORkRfUkVHSVNUUllfQVBQX0lECiAgICBieXRlY2Jsb2NrICJzdGFrZXJzIiAiY3JlYXRvckFwcCIgMHgxNTFmN2M3NSAidmFsaWRhdG9ySWQiICJwb29sSWQiICJzdGFrZWQiICJzdGFrZUFjY3VtdWxhdG9yIiAicm91bmRzUGVyRGF5IiAweDAwMDIgImJpblJvdW5kU3RhcnQiICJudW1TdGFrZXJzIiAicmV3YXJkQWNjdW11bGF0b3IiICJsYXN0UGF5b3V0IiAweDc1YWZmNjFkICJtaW5FbnRyeVN0YWtlIiAiZXBvY2hOdW1iZXIiICJld21hIiAweDAwMDEgMHg2NCAweDBjMjI0NWUxIDB4MDY4MTAxIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAweGEyZGM1MWI1IDB4NTcyNzY3ZDEgMHg0ZGY4ZDg2ZSAweDAwMDEwMDAwMDAwMDAwMGY0MjQwIDB4MDAwMyBUTVBMX0ZFRV9TSU5LX0FERFIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjEKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjEKICAgIHB1c2hieXRlc3MgMHg0NmY3NjUzMyAweDU5ZTkwYWE2IDB4MzE3MmNhOWQgMHg0N2NmY2MwNCAweGY5YzcwY2JkIDB4NDIxYjVhYmUgMHhmNTg5MmQ1NiAweDVjZmJiMDU3IDB4NjNmM2YyOGIgMHg4NmEzNzI1YyAweGVmYzI2MDhkIDB4OWNlZTJlNDAgMHg1MWVmM2IyMSAweGEyNGUyNzE3IC8vIG1ldGhvZCAidXBkYXRlQXBwbGljYXRpb24oKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnYXMoKXZvaWQiLCBtZXRob2QgImluaXRTdG9yYWdlKHBheSl2b2lkIiwgbWV0aG9kICJhZGRTdGFrZShwYXksYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJlbW92ZVN0YWtlKGFkZHJlc3MsdWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltVG9rZW5zKCl2b2lkIiwgbWV0aG9kICJnZXRTdGFrZXJJbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicGF5VG9rZW5SZXdhcmQoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFsZ29kVmVyKHN0cmluZyl2b2lkIiwgbWV0aG9kICJlcG9jaEJhbGFuY2VVcGRhdGUoKXZvaWQiLCBtZXRob2QgImdvT25saW5lKHBheSxieXRlWzMyXSxieXRlWzMyXSxieXRlWzY0XSx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnb09mZmxpbmUoKXZvaWQiLCBtZXRob2QgImxpbmtUb05GRCh1aW50NjQsc3RyaW5nKXZvaWQiCiAgICBieXRlYyAxOSAvLyBtZXRob2QgInByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpKHVpbnQ2NFsyNF0sdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlQXBwbGljYXRpb25fcm91dGVAMyBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDQgbWFpbl9nYXNfcm91dGVANSBtYWluX2luaXRTdG9yYWdlX3JvdXRlQDYgbWFpbl9hZGRTdGFrZV9yb3V0ZUA3IG1haW5fcmVtb3ZlU3Rha2Vfcm91dGVAOCBtYWluX2NsYWltVG9rZW5zX3JvdXRlQDkgbWFpbl9nZXRTdGFrZXJJbmZvX3JvdXRlQDEwIG1haW5fcGF5VG9rZW5SZXdhcmRfcm91dGVAMTEgbWFpbl91cGRhdGVBbGdvZFZlcl9yb3V0ZUAxMiBtYWluX2Vwb2NoQmFsYW5jZVVwZGF0ZV9yb3V0ZUAxMyBtYWluX2dvT25saW5lX3JvdXRlQDE0IG1haW5fZ29PZmZsaW5lX3JvdXRlQDE1IG1haW5fbGlua1RvTkZEX3JvdXRlQDE2IG1haW5fcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW9fcm91dGVAMTcKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjEKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk2OQogICAgLy8gcHJveGllZFNldFRva2VuUGF5b3V0UmF0aW8ocG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSk6IFBvb2xUb2tlblBheW91dFJhdGlvIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NjkKICAgIC8vIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICBjYWxsc3ViIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2xpbmtUb05GRF9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ2CiAgICAvLyBsaW5rVG9ORkQobmZkQXBwSWQ6IHVpbnQ2NCwgbmZkTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjEKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGFraW5nUG9vbCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk0NgogICAgLy8gbGlua1RvTkZEKG5mZEFwcElkOiB1aW50NjQsIG5mZE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgY2FsbHN1YiBsaW5rVG9ORkQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ29PZmZsaW5lX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MzMKICAgIC8vIGdvT2ZmbGluZSgpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnb09mZmxpbmUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ29PbmxpbmVfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkwMS05MTEKICAgIC8vIGdvT25saW5lKAogICAgLy8gICBmZWVQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIC8vIFRPRE86IGZpeCBBQkkgdHlwZXMgdG8ganVzdCB1c2UgYnl0ZXMgaHR0cHM6Ly9naXRodWIuY29tL2FsZ29yYW5kZm91bmRhdGlvbi9wdXlhLXRzL2lzc3Vlcy8yNDQKICAgIC8vIAogICAgLy8gICB2b3RlUEs6IGJ5dGVzPDMyPiwKICAgIC8vICAgc2VsZWN0aW9uUEs6IGJ5dGVzPDMyPiwKICAgIC8vICAgc3RhdGVQcm9vZlBLOiBieXRlczw2ND4sCiAgICAvLyAgIHZvdGVGaXJzdDogdWludDY0LAogICAgLy8gICB2b3RlTGFzdDogdWludDY0LAogICAgLy8gICB2b3RlS2V5RGlsdXRpb246IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTAxLTkxMQogICAgLy8gZ29PbmxpbmUoCiAgICAvLyAgIGZlZVBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgLy8gVE9ETzogZml4IEFCSSB0eXBlcyB0byBqdXN0IHVzZSBieXRlcyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL3B1eWEtdHMvaXNzdWVzLzI0NAogICAgLy8gCiAgICAvLyAgIHZvdGVQSzogYnl0ZXM8MzI+LAogICAgLy8gICBzZWxlY3Rpb25QSzogYnl0ZXM8MzI+LAogICAgLy8gICBzdGF0ZVByb29mUEs6IGJ5dGVzPDY0PiwKICAgIC8vICAgdm90ZUZpcnN0OiB1aW50NjQsCiAgICAvLyAgIHZvdGVMYXN0OiB1aW50NjQsCiAgICAvLyAgIHZvdGVLZXlEaWx1dGlvbjogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBjYWxsc3ViIGdvT25saW5lCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Vwb2NoQmFsYW5jZVVwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTQzCiAgICAvLyBlcG9jaEJhbGFuY2VVcGRhdGUoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZXBvY2hCYWxhbmNlVXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUFsZ29kVmVyX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MzAKICAgIC8vIHVwZGF0ZUFsZ29kVmVyKGFsZ29kVmVyOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTMwCiAgICAvLyB1cGRhdGVBbGdvZFZlcihhbGdvZFZlcjogc3RyaW5nKTogdm9pZCB7CiAgICBjYWxsc3ViIHVwZGF0ZUFsZ29kVmVyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheVRva2VuUmV3YXJkX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MDIKICAgIC8vIHBheVRva2VuUmV3YXJkKHN0YWtlcjogQWRkcmVzcywgcmV3YXJkVG9rZW46IHVpbnQ2NCwgYW1vdW50VG9TZW5kOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MDIKICAgIC8vIHBheVRva2VuUmV3YXJkKHN0YWtlcjogQWRkcmVzcywgcmV3YXJkVG9rZW46IHVpbnQ2NCwgYW1vdW50VG9TZW5kOiB1aW50NjQpOiB2b2lkIHsKICAgIGNhbGxzdWIgcGF5VG9rZW5SZXdhcmQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0U3Rha2VySW5mb19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDgyCiAgICAvLyBnZXRTdGFrZXJJbmZvKHN0YWtlcjogQWRkcmVzcyk6IFN0YWtlZEluZm8gewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ4MgogICAgLy8gZ2V0U3Rha2VySW5mbyhzdGFrZXI6IEFkZHJlc3MpOiBTdGFrZWRJbmZvIHsKICAgIGNhbGxzdWIgZ2V0U3Rha2VySW5mbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbGFpbVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MTIKICAgIC8vIGNsYWltVG9rZW5zKCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltVG9rZW5zCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVN0YWtlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI5OAogICAgLy8gcmVtb3ZlU3Rha2Uoc3Rha2VyOiBBZGRyZXNzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI5OAogICAgLy8gcmVtb3ZlU3Rha2Uoc3Rha2VyOiBBZGRyZXNzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiByZW1vdmVTdGFrZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRTdGFrZV9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyMTEKICAgIC8vIGFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgc3Rha2VyOiBBZGRyZXNzKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIxMQogICAgLy8gYWRkU3Rha2Uoc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBzdGFrZXI6IEFkZHJlc3MpOiB1aW50NjQgewogICAgY2FsbHN1YiBhZGRTdGFrZQogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9pbml0U3RvcmFnZV9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNjkKICAgIC8vIGluaXRTdG9yYWdlKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZ1Bvb2wgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTY5CiAgICAvLyBpbml0U3RvcmFnZShtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4pOiB2b2lkIHsKICAgIGNhbGxzdWIgaW5pdFN0b3JhZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2FzX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE1MwogICAgLy8gZ2FzKCk6IHZvaWQge30KICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMjQKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogdWludDY0LCB2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCwgbWluRW50cnlTdGFrZTogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YWtpbmdQb29sIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMjQKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogdWludDY0LCB2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCwgbWluRW50cnlTdGFrZTogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUFwcGxpY2F0aW9uX3JvdXRlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjExMAogICAgLy8gdXBkYXRlQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBVcGRhdGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHVwZGF0ZUFwcGxpY2F0aW9uCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6OndpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiBieXRlcywgZGVub21pbmF0b3JGYWN0b3JzOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CndpZGVSYXRpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHdpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiB1aW50NjRbXSwgZGVub21pbmF0b3JGYWN0b3JzOiB1aW50NjRbXSk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDMKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czo1CiAgICAvLyBsZXQgbnVtZXJhdG9yID0gbmV3IFVpbnQxMjgoMW4pCiAgICBieXRlYyAyMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjYKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIG51bWVyYXRvckZhY3RvcnMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKd2lkZVJhdGlvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6NgogICAgLy8gZm9yIChjb25zdCBmYWN0b3Igb2YgbnVtZXJhdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiB3aWRlUmF0aW9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czo3CiAgICAvLyBudW1lcmF0b3IgPSBuZXcgVWludDEyOChCaWdVaW50KGZhY3RvcikgKiBudW1lcmF0b3IubmF0aXZlKQogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIGIqCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgd2lkZVJhdGlvX2Zvcl9oZWFkZXJAMQoKd2lkZVJhdGlvX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czoxMAogICAgLy8gbGV0IGRlbm9taW5hdG9yID0gbmV3IFVpbnQxMjgoMW4pCiAgICBieXRlYyAyMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6MTEKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIGRlbm9taW5hdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKd2lkZVJhdGlvX2Zvcl9oZWFkZXJANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6MTEKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIGRlbm9taW5hdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB3aWRlUmF0aW9fYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czoxMgogICAgLy8gZGVub21pbmF0b3IgPSBuZXcgVWludDEyOChCaWdVaW50KGZhY3RvcikgKiBkZW5vbWluYXRvci5uYXRpdmUpCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgYioKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB3aWRlUmF0aW9fZm9yX2hlYWRlckA1Cgp3aWRlUmF0aW9fYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjE1CiAgICAvLyBjb25zdCByYXRpbzogYmlndWludCA9IG51bWVyYXRvci5uYXRpdmUgLyBkZW5vbWluYXRvci5uYXRpdmUKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6MTYKICAgIC8vIHJldHVybiBuZXcgVWludDY0KHJhdGlvKS5uYXRpdmUKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA4IC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLnVwZGF0ZUFwcGxpY2F0aW9uKCkgLT4gdm9pZDoKdXBkYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjExMgogICAgLy8gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikgPT09IG5ldyBBZGRyZXNzKCdMWjRWMklSVkxDWEZKSzRSRUpWNFRBR0VLRVlUQTJHTVI2VEMyMzQ0T0IzTDNBRjNNV1haNlpBRklRJyksCiAgICB0eG4gU2VuZGVyCiAgICBwdXNoYnl0ZXMgYmFzZTMyKExaNFYySVJWTENYRkpLNFJFSlY0VEFHRUtFWVRBMkdNUjZUQzIzNDRPQjNMM0FGM01XWFEpIC8vIGFkZHIgTFo0VjJJUlZMQ1hGSks0UkVKVjRUQUdFS0VZVEEyR01SNlRDMjM0NE9CM0wzQUYzTVdYWjZaQUZJUQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTExLTExNAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gbmV3IEFkZHJlc3MoJ0xaNFYySVJWTENYRkpLNFJFSlY0VEFHRUtFWVRBMkdNUjZUQzIzNDRPQjNMM0FGM01XWFo2WkFGSVEnKSwKICAgIC8vICAgJ1RlbXBvcmFyeTogY29udHJhY3QgaXMgdXBncmFkZWFibGUgYnV0IG9ubHkgZHVyaW5nIHRlc3RpbmcgYW5kIG9ubHkgZnJvbSBhIGRldmVsb3BtZW50IGFjY291bnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIFRlbXBvcmFyeTogY29udHJhY3QgaXMgdXBncmFkZWFibGUgYnV0IG9ubHkgZHVyaW5nIHRlc3RpbmcgYW5kIG9ubHkgZnJvbSBhIGRldmVsb3BtZW50IGFjY291bnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKGNyZWF0aW5nQ29udHJhY3RJZDogdWludDY0LCB2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCwgbWluRW50cnlTdGFrZTogdWludDY0KSAtPiB2b2lkOgpjcmVhdGVBcHBsaWNhdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTI0CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihjcmVhdGluZ0NvbnRyYWN0SWQ6IHVpbnQ2NCwgdmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQsIG1pbkVudHJ5U3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEyNQogICAgLy8gaWYgKGNyZWF0aW5nQ29udHJhY3RJZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC00CiAgICBibnogY3JlYXRlQXBwbGljYXRpb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgPT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMjgKICAgIC8vIGFzc2VydChwb29sSWQgPT09IDApCiAgICBmcmFtZV9kaWcgLTIKICAgICEKICAgIGFzc2VydAoKY3JlYXRlQXBwbGljYXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMzMKICAgIC8vIGFzc2VydChtaW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOSAvLyAxMDAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjYKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSA9IGNyZWF0aW5nQ29udHJhY3RJZAogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTM1CiAgICAvLyB0aGlzLnZhbGlkYXRvcklkLnZhbHVlID0gdmFsaWRhdG9ySWQKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEzNgogICAgLy8gdGhpcy5wb29sSWQudmFsdWUgPSBwb29sSWQKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzUKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDEwIC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMzcKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OAogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTM4CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gbWluRW50cnlTdGFrZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdtaW5FbnRyeVN0YWtlJyB9KQogICAgYnl0ZWMgMTQgLy8gIm1pbkVudHJ5U3Rha2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5taW5FbnRyeVN0YWtlLnZhbHVlID0gbWluRW50cnlTdGFrZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MwogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTIgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy5sYXN0UGF5b3V0LnZhbHVlID0gR2xvYmFsLnJvdW5kIC8vIHNldCB0byBpbml0IGJsb2NrIHRvIGVzdGFibGlzaCBiYXNlbGluZQogICAgZ2xvYmFsIFJvdW5kCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NgogICAgLy8gZXBvY2hOdW1iZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZXBvY2hOdW1iZXInIH0pCiAgICBieXRlYyAxNSAvLyAiZXBvY2hOdW1iZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE0MQogICAgLy8gdGhpcy5lcG9jaE51bWJlci52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NgogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDcgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2NgogICAgLy8gdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgPSBBVkdfUk9VTkRTX1BFUl9EQVkKICAgIGludGMgNSAvLyAzMDg1NwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTQ0CiAgICAvLyB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgPSBHbG9iYWwucm91bmQgLSAoR2xvYmFsLnJvdW5kICUgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpIC8vIHBsYWNlIGF0IHN0YXJ0IG9mIGJpbgogICAgZ2xvYmFsIFJvdW5kCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2NgogICAgLy8gdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgPSBBVkdfUk9VTkRTX1BFUl9EQVkKICAgIGludGMgNSAvLyAzMDg1NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNDQKICAgIC8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IEdsb2JhbC5yb3VuZCAtIChHbG9iYWwucm91bmQgJSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkgLy8gcGxhY2UgYXQgc3RhcnQgb2YgYmluCiAgICAlCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk4CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNDQKICAgIC8vIHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSA9IEdsb2JhbC5yb3VuZCAtIChHbG9iYWwucm91bmQgJSB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkgLy8gcGxhY2UgYXQgc3RhcnQgb2YgYmluCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA2IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNDUKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KDApCiAgICBieXRlYyAyMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDIKICAgIC8vIHJld2FyZEFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jld2FyZEFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgMTEgLy8gInJld2FyZEFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNDYKICAgIC8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyB3ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ2V3bWEnIH0pCiAgICBieXRlYyAxNiAvLyAiZXdtYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTQ3CiAgICAvLyB0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZSA9IG5ldyBVaW50MTI4KDApCiAgICBieXRlYyAyMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpjcmVhdGVBcHBsaWNhdGlvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTMwCiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgIT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMzEKICAgIC8vIGFzc2VydChwb29sSWQgIT09IDApCiAgICBmcmFtZV9kaWcgLTIKICAgIGFzc2VydAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5pbml0U3RvcmFnZShtYnJQYXltZW50OiB1aW50NjQpIC0+IHZvaWQ6CmluaXRTdG9yYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNjkKICAgIC8vIGluaXRTdG9yYWdlKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTcwCiAgICAvLyBhc3NlcnQoIXRoaXMuc3Rha2Vycy5leGlzdHMsICdzdGFraW5nIHBvb2wgYWxyZWFkeSBpbml0aWFsaXplZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBzdGFraW5nIHBvb2wgYWxyZWFkeSBpbml0aWFsaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNzMtMTc2CiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNzQKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE3NAogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTc1CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTc1CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNzMtMTc2CiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRWYWxpZGF0b3JDb25maWcodWludDY0KSh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgaW50YyA2IC8vIDE1NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxNzgKICAgIC8vIGNvbnN0IGlzVG9rZW5FbGlnaWJsZSA9IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkICE9PSAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE3OQogICAgLy8gY29uc3QgZXh0cmFNQlI6IHVpbnQ2NCA9IGlzVG9rZW5FbGlnaWJsZSAmJiB0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSA/IEFTU0VUX0hPTERJTkdfRkVFIDogMAogICAgYnogaW5pdFN0b3JhZ2VfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MgogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTc5CiAgICAvLyBjb25zdCBleHRyYU1CUjogdWludDY0ID0gaXNUb2tlbkVsaWdpYmxlICYmIHRoaXMucG9vbElkLnZhbHVlID09PSAxID8gQVNTRVRfSE9MRElOR19GRUUgOiAwCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBpbml0U3RvcmFnZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgppbml0U3RvcmFnZV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE3OQogICAgLy8gY29uc3QgZXh0cmFNQlI6IHVpbnQ2NCA9IGlzVG9rZW5FbGlnaWJsZSAmJiB0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSA/IEFTU0VUX0hPTERJTkdfRkVFIDogMAogICAgcHVzaGludCAxMDAwMDAgLy8gMTAwMDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE4MS0xODMKICAgIC8vIEFMR09SQU5EX0FDQ09VTlRfTUlOX0JBTEFOQ0UgKwogICAgLy8gZXh0cmFNQlIgKwogICAgLy8gdGhpcy5jb3N0Rm9yQm94U3RvcmFnZSg3IC8qICdzdGFrZXJzJyBuYW1lICovICsgYXJjNEVuY29kZWRMZW5ndGg8U3Rha2VkSW5mbz4oKSAqIE1BWF9TVEFLRVJTX1BFUl9QT09MKQogICAgcHVzaGludCA1MjI1MzAwIC8vIDUyMjUzMDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTg2CiAgICAvLyBhc3NlcnRNYXRjaChtYnJQYXltZW50LCB7IHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuYWRkcmVzcywgYW1vdW50OiBQb29sSW5pdE1iciB9KQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE4NwogICAgLy8gdGhpcy5zdGFrZXJzLmNyZWF0ZSgpCiAgICBwdXNoaW50IDEyODAwIC8vIDEyODAwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTg5CiAgICAvLyBpZiAoaXNUb2tlbkVsaWdpYmxlICYmIHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBmcmFtZV9kaWcgMAogICAgYnogaW5pdFN0b3JhZ2VfYWZ0ZXJfaWZfZWxzZUA5CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MgogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTg5CiAgICAvLyBpZiAoaXNUb2tlbkVsaWdpYmxlICYmIHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBpbml0U3RvcmFnZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTkxLTE5NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjE5NAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTk1CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxOTEtMTk2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxOTEtMTk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0Cgppbml0U3RvcmFnZV9hZnRlcl9pZl9lbHNlQDk6CiAgICByZXRzdWIKCmluaXRTdG9yYWdlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGluaXRTdG9yYWdlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IHVpbnQ2NCwgc3Rha2VyOiBieXRlcykgLT4gdWludDY0OgphZGRTdGFrZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjExCiAgICAvLyBhZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIHN0YWtlcjogQWRkcmVzcyk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjEyCiAgICAvLyBhc3NlcnQodGhpcy5zdGFrZXJzLmV4aXN0cywgJ3N0YWtpbmcgcG9vbCBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0JykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHN0YWtpbmcgcG9vbCBtdXN0IGJlIGluaXRpYWxpemVkIGZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIxNgogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyMTYKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIxNS0yMTgKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICAvLyAgICdzdGFrZSBjYW4gb25seSBiZSBhZGRlZCB2aWEgdGhlIHZhbGlkYXRvciBjb250cmFjdCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gc3Rha2UgY2FuIG9ubHkgYmUgYWRkZWQgdmlhIHRoZSB2YWxpZGF0b3IgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjE5CiAgICAvLyBhc3NlcnQoc3Rha2VyICE9PSBuZXcgQWRkcmVzcyhHbG9iYWwuemVyb0FkZHJlc3MpKQogICAgZnJhbWVfZGlnIC0xCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjIyCiAgICAvLyB0aGlzLmNoZWNrSWZCaW5DbG9zZWQoKQogICAgY2FsbHN1YiBjaGVja0lmQmluQ2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIyNi0yMzAKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlZEFtb3VudFBheW1lbnQsIHsKICAgIC8vICAgc2VuZGVyOiBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50LAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIyNwogICAgLy8gc2VuZGVyOiBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIyNwogICAgLy8gc2VuZGVyOiBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIyNi0yMzAKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlZEFtb3VudFBheW1lbnQsIHsKICAgIC8vICAgc2VuZGVyOiBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcywKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50LAogICAgLy8gfSkKICAgID09CiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjIyOAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjI2LTIzMAogICAgLy8gYXNzZXJ0TWF0Y2goc3Rha2VkQW1vdW50UGF5bWVudCwgewogICAgLy8gICBzZW5kZXI6IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQsCiAgICAvLyB9KQogICAgPT0KICAgICYmCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIEFtb3VudAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjM1CiAgICAvLyBjb25zdCBlbnRyeVJvdW5kOiB1aW50NjQgPSBHbG9iYWwucm91bmQgKyBBTEdPUkFORF9TVEFLSU5HX0JMT0NLX0RFTEFZCiAgICBnbG9iYWwgUm91bmQKICAgIHB1c2hpbnQgMzIwIC8vIDMyMAogICAgKwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyMzYKICAgIC8vIGxldCBmaXJzdEVtcHR5OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyMzgKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OAogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjM4CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyMzgKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk4CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NgogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDcgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQwCiAgICAvLyBjb25zdCByb3VuZHNMZWZ0SW5CaW46IHVpbnQ2NCA9IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIC0gR2xvYmFsLnJvdW5kCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgZ2xvYmFsIFJvdW5kCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI0MgogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSArIEJpZ1VpbnQoc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQpICogQmlnVWludChyb3VuZHNMZWZ0SW5CaW4pLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNiAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQyCiAgICAvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYioKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI0MS0yNDMKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDYgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI0MS0yNDMKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNDYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphZGRTdGFrZV93aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNDYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyA4CiAgICBpbnRjIDQgLy8gMjAwCiAgICA8CiAgICBieiBhZGRTdGFrZV9hZnRlcl93aGlsZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI0NwogICAgLy8gZW5zdXJlQnVkZ2V0KDMwMCkKICAgIGludGMgNyAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQ5CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgOAogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI0OQogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgc3dhcAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQ5LTI1MAogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgLy8gaWYgKGNtcFN0YWtlci5hY2NvdW50ID09PSBzdGFrZXIpIHsKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjUwCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQgPT09IHN0YWtlcikgewogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQ5CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI1MgogICAgLy8gY21wU3Rha2VyLmJhbGFuY2UgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI1MwogICAgLy8gY21wU3Rha2VyLmVudHJ5Um91bmQgPSBlbnRyeVJvdW5kCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI1NgogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI1OAogICAgLy8gcmV0dXJuIGVudHJ5Um91bmQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjYwCiAgICAvLyBpZiAoZmlyc3RFbXB0eSA9PT0gMCAmJiBjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgPT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgYm56IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNjEKICAgIC8vIGZpcnN0RW1wdHkgPSBpICsgMQogICAgZnJhbWVfZGlnIDgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjQ2CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgOAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgOAogICAgYiBhZGRTdGFrZV93aGlsZV90b3BAMQoKYWRkU3Rha2VfYWZ0ZXJfd2hpbGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjY1CiAgICAvLyBpZiAoZmlyc3RFbXB0eSA9PT0gMCkgewogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgIQogICAgIQogICAgYXNzZXJ0IC8vIFN0YWtpbmcgcG9vbCBmdWxsCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI3MgogICAgLy8gYXNzZXJ0KHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50ID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwgJ211c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gbWluRW50cnlTdGFrZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdtaW5FbnRyeVN0YWtlJyB9KQogICAgYnl0ZWMgMTQgLy8gIm1pbkVudHJ5U3Rha2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI3MgogICAgLy8gYXNzZXJ0KHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50ID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwgJ211c3Qgc3Rha2UgYXQgbGVhc3QgdGhlIG1pbmltdW0gZm9yIHRoaXMgcG9vbCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI3NAogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0uYWNjb3VudC5uYXRpdmUgPT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gNjQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoyNzQKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcnMudmFsdWVbZmlyc3RFbXB0eSAtIDFdLmFjY291bnQubmF0aXZlID09PSBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAwIDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mjc2LTI4MgogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHsKICAgIC8vICAgYWNjb3VudDogc3Rha2VyLAogICAgLy8gICBiYWxhbmNlOiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKICAgIC8vICAgdG90YWxSZXdhcmRlZDogMCwKICAgIC8vICAgcmV3YXJkVG9rZW5CYWxhbmNlOiAwLAogICAgLy8gICBlbnRyeVJvdW5kOiBlbnRyeVJvdW5kLAogICAgLy8gfQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI3OQogICAgLy8gdG90YWxSZXdhcmRlZDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI3Ni0yODIKICAgIC8vIHRoaXMuc3Rha2Vycy52YWx1ZVtmaXJzdEVtcHR5IC0gMV0gPSB7CiAgICAvLyAgIGFjY291bnQ6IHN0YWtlciwKICAgIC8vICAgYmFsYW5jZTogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQsCiAgICAvLyAgIHRvdGFsUmV3YXJkZWQ6IDAsCiAgICAvLyAgIHJld2FyZFRva2VuQmFsYW5jZTogMCwKICAgIC8vICAgZW50cnlSb3VuZDogZW50cnlSb3VuZCwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mjc2LTI4MgogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ZpcnN0RW1wdHkgLSAxXSA9IHsKICAgIC8vICAgYWNjb3VudDogc3Rha2VyLAogICAgLy8gICBiYWxhbmNlOiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCwKICAgIC8vICAgdG90YWxSZXdhcmRlZDogMCwKICAgIC8vICAgcmV3YXJkVG9rZW5CYWxhbmNlOiAwLAogICAgLy8gICBlbnRyeVJvdW5kOiBlbnRyeVJvdW5kLAogICAgLy8gfQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI4MwogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc1CiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyAxMCAvLyAibnVtU3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjgzCiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc1CiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyAxMCAvLyAibnVtU3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MjgzCiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gZW50cnlSb3VuZAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5yZW1vdmVTdGFrZShzdGFrZXI6IGJ5dGVzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlU3Rha2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjI5OAogICAgLy8gcmVtb3ZlU3Rha2Uoc3Rha2VyOiBBZGRyZXNzLCBhbW91bnRUb1Vuc3Rha2U6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMDEKICAgIC8vIGlmIChzdGFrZXIubmF0aXZlICE9PSBUeG4uc2VuZGVyKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIHR4biBTZW5kZXIKICAgICE9CiAgICBieiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzAzCiAgICAvLyB0aGlzLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSwKICAgIGNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMDItMzA1CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuaXNPd25lck9yTWFuYWdlckNhbGxlcigpLAogICAgLy8gICAnSWYgc3Rha2VyIGlzIG5vdCBzZW5kZXIgaW4gcmVtb3ZlU3Rha2UgY2FsbCwgdGhlbiBzZW5kZXIgTVVTVCBiZSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gSWYgc3Rha2VyIGlzIG5vdCBzZW5kZXIgaW4gcmVtb3ZlU3Rha2UgY2FsbCwgdGhlbiBzZW5kZXIgTVVTVCBiZSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgoKcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMDgKICAgIC8vIHRoaXMuY2hlY2tJZkJpbkNsb3NlZCgpCiAgICBjYWxsc3ViIGNoZWNrSWZCaW5DbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzEwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVTdGFrZV93aGlsZV90b3BAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMTAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGludGMgNCAvLyAyMDAKICAgIDwKICAgIGFzc2VydCAvLyBhY2NvdW50IG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMTEKICAgIC8vIGVuc3VyZUJ1ZGdldCgzMDApCiAgICBpbnRjIDcgLy8gMzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgc3dhcAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzEzLTMxNAogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgLy8gaWYgKGNtcFN0YWtlci5hY2NvdW50ID09PSBzdGFrZXIpIHsKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMTQKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudCA9PT0gc3Rha2VyKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDI1CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMTUKICAgIC8vIGlmIChhbW91bnRUb1Vuc3Rha2UgPT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IHJlbW92ZVN0YWtlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzE3CiAgICAvLyBhbW91bnRUb1Vuc3Rha2UgPSBjbXBTdGFrZXIuYmFsYW5jZQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSA0CgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDc6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMxMwogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzE5CiAgICAvLyBpZiAoY21wU3Rha2VyLmJhbGFuY2UgPCBhbW91bnRUb1Vuc3Rha2UpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgIQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMyMgogICAgLy8gY21wU3Rha2VyLmJhbGFuY2UgLT0gYW1vdW50VG9VbnN0YWtlCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzIzCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtPSBhbW91bnRUb1Vuc3Rha2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMjMKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFRvVW5zdGFrZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OAogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzIzCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtPSBhbW91bnRUb1Vuc3Rha2UKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMyNQogICAgLy8gbGV0IGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMjYKICAgIC8vIGlmIChjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlID4gMCkgewogICAgZHVwCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMjgKICAgIC8vIGlmICh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMyOAogICAgLy8gaWYgKHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiByZW1vdmVTdGFrZV9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzI5LTMzMgogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzMwCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMzAKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMzMQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjMzMQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzI5LTMzMgogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzM2LTM0MgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGludGMgNiAvLyAxNTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzM4CiAgICAvLyB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzM2LTM0MQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlLAogICAgLy8gICB9KQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMzYtMzQyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzQ1CiAgICAvLyBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgZnJhbWVfYnVyeSAwCgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozNTcKICAgIC8vIGNtcFN0YWtlci5iYWxhbmNlID09PSAwIHx8IGNtcFN0YWtlci5iYWxhbmNlID49IHRoaXMubWluRW50cnlTdGFrZS52YWx1ZSwKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogcmVtb3ZlU3Rha2VfYm9vbF90cnVlQDE4CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MAogICAgLy8gbWluRW50cnlTdGFrZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdtaW5FbnRyeVN0YWtlJyB9KQogICAgYnl0ZWMgMTQgLy8gIm1pbkVudHJ5U3Rha2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM1NwogICAgLy8gY21wU3Rha2VyLmJhbGFuY2UgPT09IDAgfHwgY21wU3Rha2VyLmJhbGFuY2UgPj0gdGhpcy5taW5FbnRyeVN0YWtlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA4CiAgICA8PQogICAgYnogcmVtb3ZlU3Rha2VfYm9vbF9mYWxzZUAxOQoKcmVtb3ZlU3Rha2VfYm9vbF90cnVlQDE4OgogICAgaW50Y18xIC8vIDEKCnJlbW92ZVN0YWtlX2Jvb2xfbWVyZ2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM1Ni0zNTkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY21wU3Rha2VyLmJhbGFuY2UgPT09IDAgfHwgY21wU3Rha2VyLmJhbGFuY2UgPj0gdGhpcy5taW5FbnRyeVN0YWtlLnZhbHVlLAogICAgLy8gICAnY2Fubm90IHJlZHVjZSBiYWxhbmNlIGJlbG93IG1pbmltdW0gYWxsb3dlZCBzdGFrZSB1bmxlc3MgYWxsIGlzIHJlbW92ZWQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbm5vdCByZWR1Y2UgYmFsYW5jZSBiZWxvdyBtaW5pbXVtIGFsbG93ZWQgc3Rha2UgdW5sZXNzIGFsbCBpcyByZW1vdmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM2NC0zNzAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50VG9VbnN0YWtlLAogICAgLy8gICAgIHJlY2VpdmVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd1bnN0YWtlZCcsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozNjgKICAgIC8vIG5vdGU6ICd1bnN0YWtlZCcsCiAgICBwdXNoYnl0ZXMgInVuc3Rha2VkIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzY0LTM2OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRUb1Vuc3Rha2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Vuc3Rha2VkJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzY0LTM3MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRUb1Vuc3Rha2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Vuc3Rha2VkJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozNzIKICAgIC8vIGxldCBzdGFrZXJSZW1vdmVkID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzczCiAgICAvLyBpZiAoY21wU3Rha2VyLmJhbGFuY2UgPT09IDApIHsKICAgIGZyYW1lX2RpZyA4CiAgICBibnogcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozNzUKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSAtPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NQogICAgLy8gbnVtU3Rha2VycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1TdGFrZXJzJyB9KQogICAgYnl0ZWMgMTAgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NQogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NQogICAgLy8gbnVtU3Rha2VycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1TdGFrZXJzJyB9KQogICAgYnl0ZWMgMTAgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NQogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NgogICAgLy8gY21wU3Rha2VyLmFjY291bnQgPSBuZXcgQWRkcmVzcyhHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXBsYWNlMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3NwogICAgLy8gY21wU3Rha2VyLnRvdGFsUmV3YXJkZWQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3OAogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM3OQogICAgLy8gc3Rha2VyUmVtb3ZlZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDcKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzgyCiAgICAvLyB0aGlzLnN0YWtlcnMudmFsdWVbaV0gPSBjbG9uZShjbXBTdGFrZXIpCiAgICBmcmFtZV9kaWcgNQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozODQKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk4CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozODQKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NgogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDcgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mzg0CiAgICAvLyBjb25zdCByb3VuZHNMZWZ0SW5CaW46IHVpbnQ2NCA9IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIC0gR2xvYmFsLnJvdW5kCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgZ2xvYmFsIFJvdW5kCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM4NQogICAgLy8gY29uc3Qgc3VidHJhY3RBbW91bnQgPSBCaWdVaW50KGFtb3VudFRvVW5zdGFrZSAqIHJvdW5kc0xlZnRJbkJpbikKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozODYKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgLSBzdWJ0cmFjdEFtb3VudCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDYgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM4NgogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgodGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSAtIHN1YnRyYWN0QW1vdW50KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDYgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM4NgogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgodGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSAtIHN1YnRyYWN0QW1vdW50KQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzkxLTQwMAogICAgLy8gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuc3Rha2VSZW1vdmVkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICAvLyAgICAgc3Rha2VyLAogICAgLy8gICAgIGFtb3VudFRvVW5zdGFrZSwKICAgIC8vICAgICBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQsCiAgICAvLyAgICAgc3Rha2VyUmVtb3ZlZCwKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM5MgogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjYKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzkyCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozOTQKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mzk0CiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcyCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozOTQKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mzk2CiAgICAvLyBhbW91bnRUb1Vuc3Rha2UsCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Mzk3CiAgICAvLyBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQsCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozOTgKICAgIC8vIHN0YWtlclJlbW92ZWQsCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyA3CiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MzkxLTQwMAogICAgLy8gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuc3Rha2VSZW1vdmVkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICAvLyAgICAgc3Rha2VyLAogICAgLy8gICAgIGFtb3VudFRvVW5zdGFrZSwKICAgIC8vICAgICBhbW91bnRSZXdhcmRUb2tlblJlbW92ZWQsCiAgICAvLyAgICAgc3Rha2VyUmVtb3ZlZCwKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBieXRlYyAyMyAvLyBtZXRob2QgInN0YWtlUmVtb3ZlZCgodWludDY0LHVpbnQ2NCx1aW50NjQpLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCnJlbW92ZVN0YWtlX2Jvb2xfZmFsc2VAMTk6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZW1vdmVTdGFrZV9ib29sX21lcmdlQDIwCgpyZW1vdmVTdGFrZV9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjM1MQogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMAogICAgYiByZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDE1CgpyZW1vdmVTdGFrZV9hZnRlcl9pZl9lbHNlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czozMTAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZVN0YWtlX3doaWxlX3RvcEAzCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuY2xhaW1Ub2tlbnMoKSAtPiB2b2lkOgpjbGFpbVRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDEyCiAgICAvLyBjbGFpbVRva2VucygpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDE2CiAgICAvLyBjb25zdCBzdGFrZXIgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQxOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmNsYWltVG9rZW5zX3doaWxlX3RvcEAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQxOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50YyA0IC8vIDIwMAogICAgPAogICAgYXNzZXJ0IC8vIGFjY291bnQgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQxOQogICAgLy8gZW5zdXJlQnVkZ2V0KDMwMCkKICAgIGludGMgNyAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBpbnRjXzIgLy8gNjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MjEtNDIyCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQubmF0aXZlID09PSBzdGFrZXIpIHsKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MjIKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgPT09IHN0YWtlcikgewogICAgZnJhbWVfZGlnIDQKICAgID09CiAgICBieiBjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBleHRyYWN0IDQ4IDgKICAgIGZyYW1lX2J1cnkgMAogICAgcHVzaGludCA0OCAvLyA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MjMKICAgIC8vIGlmIChjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlID09PSAwKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGJueiBjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDI0CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKY2xhaW1Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MjgKICAgIC8vIGlmICh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQyOAogICAgLy8gaWYgKHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBjbGFpbVRva2Vuc19lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MjktNDMyCiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5nZXRWYWxpZGF0b3JDb25maWcsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvLyAtLS0tLS0tLS0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDMwCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MzAKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQzMQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQzMQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDI5LTQzMgogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLy8gLS0tLS0tLS0tCiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQzNS00NDEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdmFsaWRhdG9yQ29uZmlnLnJld2FyZFRva2VuSWQsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGludGMgNiAvLyAxNTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDM3CiAgICAvLyB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgNAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MzUtNDQwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHN0YWtlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDM1LTQ0MQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDQzCiAgICAvLyBjbXBTdGFrZXIucmV3YXJkVG9rZW5CYWxhbmNlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgZnJhbWVfYnVyeSAxCgpjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1MwogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0NTgtNDY3CiAgICAvLyBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5zdGFrZVJlbW92ZWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBuZXcgQWRkcmVzcyhzdGFrZXIpLAogICAgLy8gICAgIDAsIC8vIG5vIGFsZ28gcmVtb3ZlZAogICAgLy8gICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKICAgIC8vICAgICBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0NTkKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ1OQogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDYxCiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ2MQogICAgLy8geyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MgogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDYxCiAgICAvLyB7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9LAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ2MwogICAgLy8gMCwgLy8gbm8gYWxnbyByZW1vdmVkCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0NTgtNDY3CiAgICAvLyBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5zdGFrZVJlbW92ZWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBuZXcgQWRkcmVzcyhzdGFrZXIpLAogICAgLy8gICAgIDAsIC8vIG5vIGFsZ28gcmVtb3ZlZAogICAgLy8gICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKICAgIC8vICAgICBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMjMgLy8gbWV0aG9kICJzdGFrZVJlbW92ZWQoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDY1CiAgICAvLyBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0NTgtNDY3CiAgICAvLyBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5zdGFrZVJlbW92ZWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBuZXcgQWRkcmVzcyhzdGFrZXIpLAogICAgLy8gICAgIDAsIC8vIG5vIGFsZ28gcmVtb3ZlZAogICAgLy8gICAgIGFtb3VudFJld2FyZFRva2VuUmVtb3ZlZCwKICAgIC8vICAgICBmYWxzZSwgLy8gc3Rha2VyIGlzbid0IGJlaW5nIHJlbW92ZWQuCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDY4CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKY2xhaW1Ub2tlbnNfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ0OQogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGZyYW1lX2J1cnkgMQogICAgYiBjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEwCgpjbGFpbVRva2Vuc19hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0MTgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGNsYWltVG9rZW5zX3doaWxlX3RvcEAxCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuZ2V0U3Rha2VySW5mbyhzdGFrZXI6IGJ5dGVzKSAtPiBieXRlczoKZ2V0U3Rha2VySW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDgyCiAgICAvLyBnZXRTdGFrZXJJbmZvKHN0YWtlcjogQWRkcmVzcyk6IFN0YWtlZEluZm8gewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDgzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKZ2V0U3Rha2VySW5mb193aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0ODMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGMgNCAvLyAyMDAKICAgIDwKICAgIGFzc2VydCAvLyBhY2NvdW50IG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0ODQKICAgIC8vIGVuc3VyZUJ1ZGdldCgyMDApCiAgICBpbnRjIDQgLy8gMjAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjQ4NQogICAgLy8gaWYgKHRoaXMuc3Rha2Vycy52YWx1ZVtpXS5hY2NvdW50ID09PSBzdGFrZXIpIHsKICAgIGludGNfMiAvLyA2NAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0ODUKICAgIC8vIGlmICh0aGlzLnN0YWtlcnMudmFsdWVbaV0uYWNjb3VudCA9PT0gc3Rha2VyKSB7CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDAgMzIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldFN0YWtlckluZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NDg2CiAgICAvLyByZXR1cm4gdGhpcy5zdGFrZXJzLnZhbHVlW2ldCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFN0YWtlckluZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo0ODMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldFN0YWtlckluZm9fd2hpbGVfdG9wQDEKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5wYXlUb2tlblJld2FyZChzdGFrZXI6IGJ5dGVzLCByZXdhcmRUb2tlbjogdWludDY0LCBhbW91bnRUb1NlbmQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5VG9rZW5SZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjUwMgogICAgLy8gcGF5VG9rZW5SZXdhcmQoc3Rha2VyOiBBZGRyZXNzLCByZXdhcmRUb2tlbjogdWludDY0LCBhbW91bnRUb1NlbmQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjUwNQogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MDUKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjUwNC01MDcKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24odGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUpLmFkZHJlc3MsCiAgICAvLyAgICd0aGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB2aWEgdGhlIHZhbGlkYXRvciBjb250cmFjdCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdGhpcyBjYW4gb25seSBiZSBjYWxsZWQgdmlhIHRoZSB2YWxpZGF0b3IgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTA4CiAgICAvLyBhc3NlcnQodGhpcy5wb29sSWQudmFsdWUgPT09IDEsICdtdXN0IGJlIHBvb2wgMSBpbiBvcmRlciB0byBiZSBjYWxsZWQgdG8gcGF5IG91dCB0b2tlbiByZXdhcmRzJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcyCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MDgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSwgJ211c3QgYmUgcG9vbCAxIGluIG9yZGVyIHRvIGJlIGNhbGxlZCB0byBwYXkgb3V0IHRva2VuIHJld2FyZHMnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG11c3QgYmUgcG9vbCAxIGluIG9yZGVyIHRvIGJlIGNhbGxlZCB0byBwYXkgb3V0IHRva2VuIHJld2FyZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTA5CiAgICAvLyBhc3NlcnQocmV3YXJkVG9rZW4gIT09IDAsICdjYW4gb25seSBjbGFpbSB0b2tlbiByZXdhcmRzIGZyb20gdmFsaWRhdG9yIHRoYXQgaGFzIHRoZW0nKQogICAgZnJhbWVfZGlnIC0yCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2xhaW0gdG9rZW4gcmV3YXJkcyBmcm9tIHZhbGlkYXRvciB0aGF0IGhhcyB0aGVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjUxMi01MTgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogcmV3YXJkVG9rZW4sCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50VG9TZW5kLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTEyLTUxNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiByZXdhcmRUb2tlbiwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRUb1NlbmQsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjUxMi01MTgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogcmV3YXJkVG9rZW4sCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50VG9TZW5kLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC51cGRhdGVBbGdvZFZlcihhbGdvZFZlcjogYnl0ZXMpIC0+IHZvaWQ6CnVwZGF0ZUFsZ29kVmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MzAKICAgIC8vIHVwZGF0ZUFsZ29kVmVyKGFsZ29kVmVyOiBzdHJpbmcpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MzEKICAgIC8vIGFzc2VydCh0aGlzLmlzT3duZXJPck1hbmFnZXJDYWxsZXIoKSwgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicpCiAgICBjYWxsc3ViIGlzT3duZXJPck1hbmFnZXJDYWxsZXIKICAgIGFzc2VydCAvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODkKICAgIC8vIGFsZ29kVmVyID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsga2V5OiAnYWxnb2RWZXInIH0pCiAgICBwdXNoYnl0ZXMgImFsZ29kVmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1MzIKICAgIC8vIHRoaXMuYWxnb2RWZXIudmFsdWUgPSBCeXRlcyhhbGdvZFZlcikKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmVwb2NoQmFsYW5jZVVwZGF0ZSgpIC0+IHZvaWQ6CmVwb2NoQmFsYW5jZVVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTQzCiAgICAvLyBlcG9jaEJhbGFuY2VVcGRhdGUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDkKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTQ1LTU0OAogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTQ2CiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1NDYKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU0NwogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU0NwogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTQ1LTU0OAogICAgLy8gY29uc3QgdmFsaWRhdG9yQ29uZmlnID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yQ29uZmlnLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIHB1c2hpbnQgMTczIC8vIDE3MwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1NTQKICAgIC8vIGNvbnN0IGVwb2NoUm91bmRMZW5ndGggPSB2YWxpZGF0b3JDb25maWcuZXBvY2hSb3VuZExlbmd0aC5uYXRpdmUKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTU1CiAgICAvLyBjb25zdCBjdXJSb3VuZCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTU2CiAgICAvLyBjb25zdCB0aGlzRXBvY2hCZWdpbjogdWludDY0ID0gY3VyUm91bmQgLSAoY3VyUm91bmQgJSBlcG9jaFJvdW5kTGVuZ3RoKQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICUKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTU5CiAgICAvLyBpZiAodGhpcy5sYXN0UGF5b3V0Lmhhc1ZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MwogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTIgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU1OQogICAgLy8gaWYgKHRoaXMubGFzdFBheW91dC5oYXNWYWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1NjAKICAgIC8vIGNvbnN0IGxhc3RQYXlvdXRFcG9jaDogdWludDY0ID0gdGhpcy5sYXN0UGF5b3V0LnZhbHVlIC0gKHRoaXMubGFzdFBheW91dC52YWx1ZSAlIGVwb2NoUm91bmRMZW5ndGgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MwogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTIgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU2MAogICAgLy8gY29uc3QgbGFzdFBheW91dEVwb2NoOiB1aW50NjQgPSB0aGlzLmxhc3RQYXlvdXQudmFsdWUgLSAodGhpcy5sYXN0UGF5b3V0LnZhbHVlICUgZXBvY2hSb3VuZExlbmd0aCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA0NQogICAgJQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1NjQKICAgIC8vIGFzc2VydChsYXN0UGF5b3V0RXBvY2ggIT09IHRoaXNFcG9jaEJlZ2luLCAiY2FuJ3QgY2FsbCBlcG9jaEJhbGFuY2VVcGRhdGUgaW4gc2FtZSBlcG9jaCBhcyBwcmlvciBjYWxsIikKICAgIGZyYW1lX2RpZyA0NwogICAgIT0KICAgIGFzc2VydCAvLyBjYW4ndCBjYWxsIGVwb2NoQmFsYW5jZVVwZGF0ZSBpbiBzYW1lIGVwb2NoIGFzIHByaW9yIGNhbGwKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU2NwogICAgLy8gdGhpcy5jaGVja0lmQmluQ2xvc2VkKCkKICAgIGNhbGxzdWIgY2hlY2tJZkJpbkNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MwogICAgLy8gbGFzdFBheW91dCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXN0UGF5b3V0JyB9KQogICAgYnl0ZWMgMTIgLy8gImxhc3RQYXlvdXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU3MAogICAgLy8gdGhpcy5sYXN0UGF5b3V0LnZhbHVlID0gY3VyUm91bmQKICAgIGZyYW1lX2RpZyA0NgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTcxCiAgICAvLyB0aGlzLmVwb2NoTnVtYmVyLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2CiAgICAvLyBlcG9jaE51bWJlciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdlcG9jaE51bWJlcicgfSkKICAgIGJ5dGVjIDE1IC8vICJlcG9jaE51bWJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTcxCiAgICAvLyB0aGlzLmVwb2NoTnVtYmVyLnZhbHVlICs9IDEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NgogICAgLy8gZXBvY2hOdW1iZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZXBvY2hOdW1iZXInIH0pCiAgICBieXRlYyAxNSAvLyAiZXBvY2hOdW1iZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU3MQogICAgLy8gdGhpcy5lcG9jaE51bWJlci52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1NzYKICAgIC8vIGNvbnN0IGlzVG9rZW5FbGlnaWJsZSA9IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRUb2tlbklkICE9PSAwCiAgICBmcmFtZV9kaWcgNDQKICAgIGludGMgNiAvLyAxNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTc3CiAgICAvLyBsZXQgcG9vbE9uZUFwcElEID0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGZyYW1lX2J1cnkgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTc4CiAgICAvLyBsZXQgcG9vbE9uZUFkZHJlc3MgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9kaWcgNDMKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU4MwogICAgLy8gaWYgKGlzVG9rZW5FbGlnaWJsZSkgewogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTg0CiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgIT09IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcyCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1ODQKICAgIC8vIGlmICh0aGlzLnBvb2xJZC52YWx1ZSAhPT0gMSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1ODYtNTg5CiAgICAvLyBwb29sT25lQXBwSUQgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5nZXRQb29sQXBwSWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgMV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1ODcKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU4NwogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTg4CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgMV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTg4CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgMV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTg2LTU4OQogICAgLy8gcG9vbE9uZUFwcElEID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWUsIDFdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDI0IC8vIG1ldGhvZCAiZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1OTAKICAgIC8vIHBvb2xPbmVBZGRyZXNzID0gQXBwbGljYXRpb24ocG9vbE9uZUFwcElEKS5hZGRyZXNzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDcKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU5NQogICAgLy8gaWYgKHRoaXMucG9vbElkLnZhbHVlID09PSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MgogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTk1CiAgICAvLyBpZiAodGhpcy5wb29sSWQudmFsdWUgPT09IDEpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTk2LTU5OQogICAgLy8gdG9rZW5QYXlvdXRSYXRpbyA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLnNldFRva2VuUGF5b3V0UmF0aW8sIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1OTcKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjU5NwogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTk4CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NTk4CiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo1OTYtNTk5CiAgICAvLyB0b2tlblBheW91dFJhdGlvID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuc2V0VG9rZW5QYXlvdXRSYXRpbywgewogICAgLy8gICBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAyNSAvLyBtZXRob2QgInNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZnJhbWVfYnVyeSA0MwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGZyYW1lX2RpZyA0MwogICAgZnJhbWVfYnVyeSA5CiAgICBmcmFtZV9kaWcgNwogICAgZnJhbWVfYnVyeSA4CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9idXJ5IDQzCiAgICBmcmFtZV9kaWcgOAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxMS02MTQKICAgIC8vIGNvbnN0IHZhbGlkYXRvclN0YXRlID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yU3RhdGUsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MTIKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2CiAgICAvLyBjcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnY3JlYXRvckFwcCcgfSkKICAgIGJ5dGVjXzEgLy8gImNyZWF0b3JBcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxMgogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjEzCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjEzCiAgICAvLyBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MTEtNjE0CiAgICAvLyBjb25zdCB2YWxpZGF0b3JTdGF0ZSA9IGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLmdldFZhbGlkYXRvclN0YXRlLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDFmMmYwMTA5IC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yU3RhdGUodWludDY0KSh1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYxNQogICAgLy8gY29uc3QgcmV3YXJkVG9rZW5IZWxkQmFjayA9IHZhbGlkYXRvclN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sKICAgIGR1cAogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjIyCiAgICAvLyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcy5iYWxhbmNlIC0KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MjMKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MjMKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYyMi02MjMKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLmJhbGFuY2UgLQogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MjQKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLm1pbkJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MjItNjI0CiAgICAvLyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcy5iYWxhbmNlIC0KICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0KICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLm1pbkJhbGFuY2UKICAgIC0KICAgIGZyYW1lX2J1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjI1CiAgICAvLyBsZXQgaXNQb29sU2F0dXJhdGVkID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMDkKICAgIC8vIHJldHVybiB3aWRlUmF0aW8oW29ubGluZSwgTUFYX1ZBTElEQVRPUl9TT0ZUX1BDVF9PRl9PTkxJTkVfMURFQ0lNQUxdLCBbMTAwMF0pCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAyCiAgICBwdXNoYnl0ZXNzIDB4MDAwMjAwMDcxYWZkNDk4ZDAwMDAwMDAwMDAwMDAwMDAwMDY0IDB4MDAwMTAwMDAwMDAwMDAwMDAzZTggLy8gMHgwMDAyMDAwNzFhZmQ0OThkMDAwMDAwMDAwMDAwMDAwMDAwNjQsIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTgKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MzQKICAgIC8vIGlmICh2YWxpZGF0b3JTdGF0ZS50b3RhbEFsZ29TdGFrZWQgPiBhbGdvU2F0dXJhdGlvbkFtdCkgewogICAgc3dhcAogICAgcHVzaGludCAxNCAvLyAxNAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MAogICAgPAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjM1CiAgICAvLyBpc1Bvb2xTYXR1cmF0ZWQgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxOQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY0MQogICAgLy8gbGV0IHRva2VuUmV3YXJkQXZhaWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjQyCiAgICAvLyBsZXQgdG9rZW5SZXdhcmRQYWlkT3V0OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NDMKICAgIC8vIGxldCB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjQ0CiAgICAvLyBsZXQgZXhjZXNzVG9GZWVTaW5rOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxNQogICAgZnJhbWVfYnVyeSAzMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NDUKICAgIC8vIGlmIChpc1Rva2VuRWxpZ2libGUpIHsKICAgIGZyYW1lX2RpZyAzNwogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjQ3CiAgICAvLyBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHBvb2xPbmVBZGRyZXNzLCB2YWxpZGF0b3JDb25maWcucmV3YXJkVG9rZW5JZClbMF0gLSByZXdhcmRUb2tlbkhlbGRCYWNrCiAgICBmcmFtZV9kaWcgNwogICAgZnJhbWVfZGlnIDM3CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgZnJhbWVfZGlnIDI3CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY1MQogICAgLy8gaWYgKHRva2VuUmV3YXJkQmFsID49IHZhbGlkYXRvckNvbmZpZy5yZXdhcmRQZXJQYXlvdXQpIHsKICAgIGZyYW1lX2RpZyA0NAogICAgcHVzaGludCAxNjUgLy8gMTY1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQxCiAgICA+PQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjU3CiAgICAvLyBjb25zdCBvdXJQb29sUGN0T2ZXaG9sZSA9IHRva2VuUGF5b3V0UmF0aW8ucG9vbFBjdE9mV2hvbGVbdGhpcy5wb29sSWQudmFsdWUgLSAxXQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY1NwogICAgLy8gY29uc3Qgb3VyUG9vbFBjdE9mV2hvbGUgPSB0b2tlblBheW91dFJhdGlvLnBvb2xQY3RPZldob2xlW3RoaXMucG9vbElkLnZhbHVlIC0gMV0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZnJhbWVfZGlnIDQzCiAgICBleHRyYWN0IDAgMTkyCiAgICBzd2FwCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjU5CiAgICAvLyB0b2tlblJld2FyZEF2YWlsID0gd2lkZVJhdGlvKFt2YWxpZGF0b3JDb25maWcucmV3YXJkUGVyUGF5b3V0LCBvdXJQb29sUGN0T2ZXaG9sZV0sIFsxXzAwMF8wMDBdKQogICAgZnJhbWVfZGlnIDQxCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMTAwMDAwMDAwMDAwZjQyNDAKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIGZyYW1lX2J1cnkgMzIKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDE5OgogICAgZnJhbWVfZGlnIDMyCiAgICBmcmFtZV9idXJ5IDMzCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2MgogICAgLy8gaWYgKHRva2VuUmV3YXJkQXZhaWwgPT09IDApIHsKICAgIGJueiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NjcKICAgIC8vIGlmIChhbGdvUmV3YXJkQXZhaWwgPCAxXzAwMF8wMDApIHsKICAgIGZyYW1lX2RpZyAxMAogICAgaW50YyA5IC8vIDEwMDAwMDAKICAgIDwKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY2OAogICAgLy8gbG9nKCchdG9rZW4mJiFub2FsZ28gdG8gcGF5JykKICAgIHB1c2hieXRlcyAiIXRva2VuJiYhbm9hbGdvIHRvIHBheSIKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NjkKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjczCiAgICAvLyBpZiAoaXNQb29sU2F0dXJhdGVkKSB7CiAgICBmcmFtZV9kaWcgMTkKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlAMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Njc2CiAgICAvLyBjb25zdCBkaW1pbmlzaGVkUmV3YXJkID0gd2lkZVJhdGlvKFthbGdvUmV3YXJkQXZhaWwsIGFsZ29TYXR1cmF0aW9uQW10XSwgW3ZhbGlkYXRvclN0YXRlLnRvdGFsQWxnb1N0YWtlZF0pCiAgICBmcmFtZV9kaWcgMTAKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0MAogICAgaXRvYgogICAgYnl0ZWMgMTcgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Njc4CiAgICAvLyBleGNlc3NUb0ZlZVNpbmsgPSBhbGdvUmV3YXJkQXZhaWwgLSBkaW1pbmlzaGVkUmV3YXJkCiAgICBzd2FwCiAgICBkaWcgMQogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY3OS02ODUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogZXhjZXNzVG9GZWVTaW5rLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmdldEZlZVNpbmsoKS5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3Bvb2wgc2F0dXJhdGVkLCBleGNlc3MgdG8gZmVlIHNpbmsnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTk3CiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXI8QWRkcmVzcz4oJ0ZFRV9TSU5LX0FERFInKQogICAgYnl0ZWMgMjggLy8gVE1QTF9GRUVfU0lOS19BRERSCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY4MwogICAgLy8gbm90ZTogJ3Bvb2wgc2F0dXJhdGVkLCBleGNlc3MgdG8gZmVlIHNpbmsnLAogICAgcHVzaGJ5dGVzICJwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NzktNjg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGV4Y2Vzc1RvRmVlU2luaywKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5nZXRGZWVTaW5rKCkubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICdwb29sIHNhdHVyYXRlZCwgZXhjZXNzIHRvIGZlZSBzaW5rJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Njc5LTY4NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBleGNlc3NUb0ZlZVNpbmssCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuZ2V0RmVlU2luaygpLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAncG9vbCBzYXR1cmF0ZWQsIGV4Y2VzcyB0byBmZWUgc2luaycsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGZyYW1lX2J1cnkgMTAKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MzYKICAgIC8vIGxldCBpbmNyZWFzZWRTdGFrZTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzYwCiAgICAvLyBpZiAoYWxnb1Jld2FyZEF2YWlsICE9PSAwIHx8IHRva2VuUmV3YXJkQXZhaWwgIT09IDApIHsKICAgIGZyYW1lX2RpZyAxMAogICAgYm56IGVwb2NoQmFsYW5jZVVwZGF0ZV9pZl9ib2R5QDQxCiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDMyCiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA3MAoKZXBvY2hCYWxhbmNlVXBkYXRlX2lmX2JvZHlANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2MQogICAgLy8gbGV0IHBhcnRpYWxTdGFrZXJzVG90YWxTdGFrZTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzYyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJzLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxNgoKZXBvY2hCYWxhbmNlVXBkYXRlX3doaWxlX3RvcEA0MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxNgogICAgaW50YyA0IC8vIDIwMAogICAgPAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX3doaWxlQDU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2MwogICAgLy8gZW5zdXJlQnVkZ2V0KDQwMCkKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjUKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyAxNgogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjUKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIHN3YXAKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2NS03NjYKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgewogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2NgogICAgLy8gaWYgKGNtcFN0YWtlci5hY2NvdW50Lm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2J1cnkgMTgKICAgIGZyYW1lX2RpZyAxMAogICAgZnJhbWVfYnVyeSAxMQogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMzIKICAgIGZyYW1lX2J1cnkgMzMKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjUKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyAxMwogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1NiAvLyA1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjcKICAgIC8vIGlmIChjbXBTdGFrZXIuZW50cnlSb3VuZCA+PSB0aGlzRXBvY2hCZWdpbikgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MgogICAgZnJhbWVfZGlnIDQ3CiAgICA+PQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2Vsc2VfYm9keUA0NgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2NQogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgZnJhbWVfZGlnIDEzCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc3MAogICAgLy8gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlICs9IGNtcFN0YWtlci5iYWxhbmNlCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDI0CiAgICArCiAgICBmcmFtZV9idXJ5IDI0CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MzoKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDEwCiAgICBmcmFtZV9idXJ5IDExCiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyAzMgogICAgZnJhbWVfYnVyeSAzMwogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1NDoKICAgIGZyYW1lX2RpZyAxOAogICAgZnJhbWVfYnVyeSAxNwogICAgZnJhbWVfZGlnIDExCiAgICBmcmFtZV9idXJ5IDEwCiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2J1cnkgMzQKICAgIGZyYW1lX2RpZyAzMwogICAgZnJhbWVfYnVyeSAzMgogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc2MgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxNgogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfd2hpbGVfdG9wQDQyCgplcG9jaEJhbGFuY2VVcGRhdGVfZWxzZV9ib2R5QDQ2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NzQKICAgIC8vIGNvbnN0IHRpbWVJblBvb2w6IHVpbnQ2NCA9IHRoaXNFcG9jaEJlZ2luIC0gY21wU3Rha2VyLmVudHJ5Um91bmQKICAgIGZyYW1lX2RpZyA0NwogICAgZnJhbWVfZGlnIDQyCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Nzc4CiAgICAvLyBpZiAodGltZUluUG9vbCA8IGVwb2NoUm91bmRMZW5ndGgpIHsKICAgIGZyYW1lX2RpZyA0NQogICAgPAogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgMTAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGZyYW1lX2RpZyAzNAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfZGlnIDMyCiAgICBmcmFtZV9idXJ5IDMzCiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDUyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzY1CiAgICAvLyBjb25zdCBjbXBTdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMudmFsdWVbaV0pCiAgICBmcmFtZV9kaWcgMTMKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Nzc5CiAgICAvLyBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UgKz0gY21wU3Rha2VyLmJhbGFuY2UKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGZyYW1lX2RpZyAyNAogICAgKwogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3ODAKICAgIC8vIHRpbWVQZXJjZW50YWdlID0gKHRpbWVJblBvb2wgKiAxMDAwKSAvIGVwb2NoUm91bmRMZW5ndGgKICAgIGZyYW1lX2RpZyAyOAogICAgcHVzaGludCAxMDAwIC8vIDEwMDAKICAgICoKICAgIGZyYW1lX2RpZyA0NQogICAgLwogICAgZnJhbWVfYnVyeSAyOQogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3ODIKICAgIC8vIGlmICh0b2tlblJld2FyZEF2YWlsID4gMCkgewogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Nzg1CiAgICAvLyBbY21wU3Rha2VyLmJhbGFuY2UsIHRva2VuUmV3YXJkQXZhaWwsIHRpbWVQZXJjZW50YWdlXSwKICAgIGZyYW1lX2RpZyAzOAogICAgaXRvYgogICAgYnl0ZWMgMjcgLy8gMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyOQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4NgogICAgLy8gW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3ODYKICAgIC8vIFt0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSwgMTAwMF0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3ODQtNzg3CiAgICAvLyBjb25zdCBzdGFrZXJUb2tlblJld2FyZCA9IHdpZGVSYXRpbygKICAgIC8vICAgW2NtcFN0YWtlci5iYWxhbmNlLCB0b2tlblJld2FyZEF2YWlsLCB0aW1lUGVyY2VudGFnZV0sCiAgICAvLyAgIFt0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSwgMTAwMF0sCiAgICAvLyApCiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc5MQogICAgLy8gdG9rZW5SZXdhcmRBdmFpbCAtPSBzdGFrZXJUb2tlblJld2FyZAogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3NjUKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyAxMwogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA0OCAvLyA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OTIKICAgIC8vIGNtcFN0YWtlci5yZXdhcmRUb2tlbkJhbGFuY2UgKz0gc3Rha2VyVG9rZW5SZXdhcmQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc5MwogICAgLy8gdG9rZW5SZXdhcmRQYWlkT3V0ICs9IHN0YWtlclRva2VuUmV3YXJkCiAgICBmcmFtZV9kaWcgMzQKICAgIHVuY292ZXIgMwogICAgKwogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDMzCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfYnVyeSAzNAogICAgZnJhbWVfZGlnIDMzCiAgICBmcmFtZV9idXJ5IDMyCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDEwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OTUKICAgIC8vIGlmIChhbGdvUmV3YXJkQXZhaWwgPiAwKSB7CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OTgKICAgIC8vIFtjbXBTdGFrZXIuYmFsYW5jZSwgYWxnb1Jld2FyZEF2YWlsLCB0aW1lUGVyY2VudGFnZV0sCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyAyNyAvLyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDI5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6Nzk5CiAgICAvLyBbdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUsIDEwMDBdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzgKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc5OQogICAgLy8gW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc5Ny04MDAKICAgIC8vIGNvbnN0IHN0YWtlclJld2FyZCA9IHdpZGVSYXRpbygKICAgIC8vICAgW2NtcFN0YWtlci5iYWxhbmNlLCBhbGdvUmV3YXJkQXZhaWwsIHRpbWVQZXJjZW50YWdlXSwKICAgIC8vICAgW3RoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlLCAxMDAwXSwKICAgIC8vICkKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODA0CiAgICAvLyBhbGdvUmV3YXJkQXZhaWwgLT0gc3Rha2VyUmV3YXJkCiAgICBzd2FwCiAgICBkaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MDcKICAgIC8vIGNtcFN0YWtlci5iYWxhbmNlICs9IHN0YWtlclJld2FyZAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MDgKICAgIC8vIGNtcFN0YWtlci50b3RhbFJld2FyZGVkICs9IHN0YWtlclJld2FyZAogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgwOQogICAgLy8gaW5jcmVhc2VkU3Rha2UgKz0gc3Rha2VyUmV3YXJkCiAgICBmcmFtZV9kaWcgMTcKICAgIHVuY292ZXIgMwogICAgKwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDExCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MToKICAgIGZyYW1lX2RpZyAxMQogICAgZnJhbWVfZGlnIDE4CiAgICBmcmFtZV9kaWcgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgxMgogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgZnJhbWVfZGlnIDEzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9idXJ5IDExCiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyAzMgogICAgZnJhbWVfYnVyeSAzMwogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA1MjoKICAgIGZyYW1lX2RpZyAxOAogICAgZnJhbWVfYnVyeSAxNwogICAgZnJhbWVfZGlnIDExCiAgICBmcmFtZV9idXJ5IDEwCiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2J1cnkgMzQKICAgIGZyYW1lX2RpZyAzMwogICAgZnJhbWVfYnVyeSAzMgogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDI0CiAgICBiIGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDUzCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfd2hpbGVANTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgyMAogICAgLy8gY29uc3QgbmV3UG9vbFRvdGFsU3Rha2U6IHVpbnQ2NCA9IHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC0gcGFydGlhbFN0YWtlcnNUb3RhbFN0YWtlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3OAogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjIDUgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODIwCiAgICAvLyBjb25zdCBuZXdQb29sVG90YWxTdGFrZTogdWludDY0ID0gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLSBwYXJ0aWFsU3Rha2Vyc1RvdGFsU3Rha2UKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMjQKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMwogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2J1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODI0CiAgICAvLyBpZiAobmV3UG9vbFRvdGFsU3Rha2UgPiAwKSB7CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2OQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MjYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIwCgplcG9jaEJhbGFuY2VVcGRhdGVfd2hpbGVfdG9wQDU3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgyNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2Vycy52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDIwCiAgICBpbnRjIDQgLy8gMjAwCiAgICA8CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfd2hpbGVANjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODI3CiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwKQogICAgaW50YyA0IC8vIDIwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MjkKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18yIC8vIDY0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MjkKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIHN3YXAKICAgIGludGNfMiAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgyOS04MzAKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODMwCiAgICAvLyBpZiAoY21wU3Rha2VyLmFjY291bnQubmF0aXZlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MgJiYgY21wU3Rha2VyLmVudHJ5Um91bmQgPCB0aGlzRXBvY2hCZWdpbikgewogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkyCiAgICAvLyBzdGFrZXJzID0gQm94PEZpeGVkQXJyYXk8U3Rha2VkSW5mbywgdHlwZW9mIE1BWF9TVEFLRVJTX1BFUl9QT09MPj4oeyBrZXk6ICdzdGFrZXJzJyB9KQogICAgYnl0ZWNfMCAvLyAic3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODI5LTgzMAogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgLy8gaWYgKGNtcFN0YWtlci5hY2NvdW50Lm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzICYmIGNtcFN0YWtlci5lbnRyeVJvdW5kIDwgdGhpc0Vwb2NoQmVnaW4pIHsKICAgIGZyYW1lX2RpZyAxNAogICAgaW50Y18yIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1NiAvLyA1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MzAKICAgIC8vIGlmIChjbXBTdGFrZXIuYWNjb3VudC5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBjbXBTdGFrZXIuZW50cnlSb3VuZCA8IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM5CiAgICBmcmFtZV9kaWcgNDcKICAgIDwKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBieiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MzEKICAgIC8vIGNvbnN0IHRpbWVJblBvb2w6IHVpbnQ2NCA9IHRoaXNFcG9jaEJlZ2luIC0gY21wU3Rha2VyLmVudHJ5Um91bmQKICAgIGZyYW1lX2RpZyA0NwogICAgZnJhbWVfZGlnIDM5CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgzMwogICAgLy8gaWYgKHRpbWVJblBvb2wgPj0gZXBvY2hSb3VuZExlbmd0aCkgewogICAgZnJhbWVfZGlnIDQ1CiAgICA+PQogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY2CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODM4CiAgICAvLyBpZiAodG9rZW5SZXdhcmRBdmFpbCA+IDApIHsKICAgIGZyYW1lX2RpZyAzMgogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTIKICAgIC8vIHN0YWtlcnMgPSBCb3g8Rml4ZWRBcnJheTxTdGFrZWRJbmZvLCB0eXBlb2YgTUFYX1NUQUtFUlNfUEVSX1BPT0w+Pih7IGtleTogJ3N0YWtlcnMnIH0pCiAgICBieXRlY18wIC8vICJzdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MjkKICAgIC8vIGNvbnN0IGNtcFN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2Vycy52YWx1ZVtpXSkKICAgIGZyYW1lX2RpZyAxNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgzOQogICAgLy8gY29uc3Qgc3Rha2VyVG9rZW5SZXdhcmQgPSB3aWRlUmF0aW8oW2NtcFN0YWtlci5iYWxhbmNlLCB0b2tlblJld2FyZEF2YWlsXSwgW25ld1Bvb2xUb3RhbFN0YWtlXSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMzIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIzCiAgICBpdG9iCiAgICBieXRlYyAxNyAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjgyOQogICAgLy8gY29uc3QgY21wU3Rha2VyID0gY2xvbmUodGhpcy5zdGFrZXJzLnZhbHVlW2ldKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg0MgogICAgLy8gY21wU3Rha2VyLnJld2FyZFRva2VuQmFsYW5jZSArPSBzdGFrZXJUb2tlblJld2FyZAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODQzCiAgICAvLyB0b2tlblJld2FyZFBhaWRPdXQgKz0gc3Rha2VyVG9rZW5SZXdhcmQKICAgIGZyYW1lX2RpZyAzNAogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9idXJ5IDYKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDYzOgogICAgZnJhbWVfZGlnIDM1CiAgICBmcmFtZV9idXJ5IDM0CiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2RpZyAxNwogICAgZnJhbWVfYnVyeSAxOAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg0NQogICAgLy8gaWYgKGFsZ29SZXdhcmRBdmFpbCA+IDApIHsKICAgIGZyYW1lX2RpZyAxMAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODQ2CiAgICAvLyBjb25zdCBzdGFrZXJSZXdhcmQgPSB3aWRlUmF0aW8oW2NtcFN0YWtlci5iYWxhbmNlLCBhbGdvUmV3YXJkQXZhaWxdLCBbbmV3UG9vbFRvdGFsU3Rha2VdKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyMwogICAgaXRvYgogICAgYnl0ZWMgMTcgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODQ5CiAgICAvLyBjbXBTdGFrZXIuYmFsYW5jZSArPSBzdGFrZXJSZXdhcmQKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg1MAogICAgLy8gY21wU3Rha2VyLnRvdGFsUmV3YXJkZWQgKz0gc3Rha2VyUmV3YXJkCiAgICBkdXAKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODUxCiAgICAvLyBpbmNyZWFzZWRTdGFrZSArPSBzdGFrZXJSZXdhcmQKICAgIGZyYW1lX2RpZyAxNwogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9idXJ5IDYKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY1OgogICAgZnJhbWVfZGlnIDE4CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MgogICAgLy8gc3Rha2VycyA9IEJveDxGaXhlZEFycmF5PFN0YWtlZEluZm8sIHR5cGVvZiBNQVhfU1RBS0VSU19QRVJfUE9PTD4+KHsga2V5OiAnc3Rha2VycycgfSkKICAgIGJ5dGVjXzAgLy8gInN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg1NQogICAgLy8gdGhpcy5zdGFrZXJzLnZhbHVlW2ldID0gY2xvbmUoY21wU3Rha2VyKQogICAgZnJhbWVfZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICBmcmFtZV9idXJ5IDE4CiAgICBmcmFtZV9kaWcgMzQKICAgIGZyYW1lX2J1cnkgMzUKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY2OgogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA2NwoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANjc6CiAgICBmcmFtZV9kaWcgMTgKICAgIGZyYW1lX2J1cnkgMTcKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4MjYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlcnMudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjAKICAgIGIgZXBvY2hCYWxhbmNlVXBkYXRlX3doaWxlX3RvcEA1NwoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX3doaWxlQDY4OgogICAgZnJhbWVfZGlnIDM0CiAgICBmcmFtZV9idXJ5IDM1CiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2J1cnkgMTgKCmVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDY5OgogICAgYiBlcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUA3MAoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VANzA6CiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NjUKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk4CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NjUKICAgIC8vIGNvbnN0IHJvdW5kc0xlZnRJbkJpbjogdWludDY0ID0gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlICsgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUgLSBHbG9iYWwucm91bmQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NgogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDcgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODY1CiAgICAvLyBjb25zdCByb3VuZHNMZWZ0SW5CaW46IHVpbnQ2NCA9IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlIC0gR2xvYmFsLnJvdW5kCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgZ2xvYmFsIFJvdW5kCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2NgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gaW5jcmVhc2VkU3Rha2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjc4CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWMgNSAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NjYKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IGluY3JlYXNlZFN0YWtlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzgKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2NgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gaW5jcmVhc2VkU3Rha2UKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2OAogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSArIEJpZ1VpbnQoaW5jcmVhc2VkU3Rha2UpICogQmlnVWludChyb3VuZHNMZWZ0SW5CaW4pLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNiAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODY4CiAgICAvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChpbmNyZWFzZWRTdGFrZSkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZGlnIDEKICAgIGIqCiAgICB1bmNvdmVyIDIKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2Ny04NjkKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChpbmNyZWFzZWRTdGFrZSkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMAogICAgLy8gc3Rha2VBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnc3Rha2VBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDYgLy8gInN0YWtlQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg2Ny04NjkKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUubmF0aXZlICsgQmlnVWludChpbmNyZWFzZWRTdGFrZSkgKiBCaWdVaW50KHJvdW5kc0xlZnRJbkJpbiksCiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NzAKICAgIC8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSB0aGlzLnJld2FyZEFjY3VtdWxhdG9yLnZhbHVlICsgaW5jcmVhc2VkU3Rha2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMgogICAgLy8gcmV3YXJkQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmV3YXJkQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyAxMSAvLyAicmV3YXJkQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg3MAogICAgLy8gdGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSA9IHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgKyBpbmNyZWFzZWRTdGFrZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDIKICAgIC8vIHJld2FyZEFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jld2FyZEFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgMTEgLy8gInJld2FyZEFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NzAKICAgIC8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSB0aGlzLnJld2FyZEFjY3VtdWxhdG9yLnZhbHVlICsgaW5jcmVhc2VkU3Rha2UKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg3Ni04ODUKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLnN0YWtlVXBkYXRlZFZpYVJld2FyZHMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBpbmNyZWFzZWRTdGFrZSwKICAgIC8vICAgICB0b2tlblJld2FyZFBhaWRPdXQsCiAgICAvLyAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCiAgICAvLyAgICAgZXhjZXNzVG9GZWVTaW5rLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6ODc3CiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NzcKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg3OQogICAgLy8geyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY5CiAgICAvLyB2YWxpZGF0b3JJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YWxpZGF0b3JJZCcgfSkKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRvcklkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4NzkKICAgIC8vIHsgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIKICAgIC8vIHBvb2xJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwb29sSWQnIH0pCiAgICBieXRlYyA0IC8vICJwb29sSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg3OQogICAgLy8geyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4ODEKICAgIC8vIHRva2VuUmV3YXJkUGFpZE91dCwKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo4ODIKICAgIC8vIHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0LAogICAgZnJhbWVfZGlnIDM2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg4MwogICAgLy8gZXhjZXNzVG9GZWVTaW5rLAogICAgZnJhbWVfZGlnIDE1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjg3Ni04ODUKICAgIC8vIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLnN0YWtlVXBkYXRlZFZpYVJld2FyZHMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfSwKICAgIC8vICAgICBpbmNyZWFzZWRTdGFrZSwKICAgIC8vICAgICB0b2tlblJld2FyZFBhaWRPdXQsCiAgICAvLyAgICAgdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQsCiAgICAvLyAgICAgZXhjZXNzVG9GZWVTaW5rLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDQxOGZjZWZjIC8vIG1ldGhvZCAic3Rha2VVcGRhdGVkVmlhUmV3YXJkcygodWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgplcG9jaEJhbGFuY2VVcGRhdGVfZWxzZV9ib2R5QDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2ODgKICAgIC8vIH0gZWxzZSBpZiAodmFsaWRhdG9yQ29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgIT09IDApIHsKICAgIGZyYW1lX2RpZyA0NAogICAgcHVzaGludCAxNzcgLy8gMTc3CiAgICBleHRyYWN0X3VpbnQzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMwCiAgICBmcmFtZV9kaWcgMTAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY5MQogICAgLy8gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgPSB3aWRlUmF0aW8oW2FsZ29SZXdhcmRBdmFpbCwgdmFsaWRhdG9yQ29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmVdLCBbMV8wMDBfMDAwXSkKICAgIGZyYW1lX2RpZyAxMAogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA4IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMzAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMjYgLy8gMHgwMDAxMDAwMDAwMDAwMDBmNDI0MAogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjY5NAogICAgLy8gYWxnb1Jld2FyZEF2YWlsIC09IHZhbGlkYXRvckNvbW1pc3Npb25QYWlkT3V0CiAgICBzd2FwCiAgICBkaWcgMQogICAgLQogICAgZnJhbWVfYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MDEKICAgIC8vIGlmICh2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCA+IDApIHsKICAgIGJ6IGVwb2NoQmFsYW5jZVVwZGF0ZV9hZnRlcl9pZl9lbHNlQDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcwNAogICAgLy8gbGV0IG1hbmFnZXJUb3BPZmY6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzA2CiAgICAvLyB2YWxpZGF0b3JDb25maWcubWFuYWdlciAhPT0gdmFsaWRhdG9yQ29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzICYmCiAgICBmcmFtZV9kaWcgNDQKICAgIGR1cAogICAgZXh0cmFjdCA0NCAzMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3QgMTgxIDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgIT0KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzA2LTcwNwogICAgLy8gdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyAmJgogICAgLy8gdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIubmF0aXZlLmJhbGFuY2UgLSB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUubWluQmFsYW5jZSA8IDJfMTAwXzAwMAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzA3CiAgICAvLyB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUuYmFsYW5jZSAtIHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZS5taW5CYWxhbmNlIDwgMl8xMDBfMDAwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgc3dhcAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC0KICAgIGludGMgOCAvLyAyMTAwMDAwCiAgICA8CiAgICBmcmFtZV9kaWcgMjEKICAgIGZyYW1lX2J1cnkgMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzA2LTcwNwogICAgLy8gdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIgIT09IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyAmJgogICAgLy8gdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIubmF0aXZlLmJhbGFuY2UgLSB2YWxpZGF0b3JDb25maWcubWFuYWdlci5uYXRpdmUubWluQmFsYW5jZSA8IDJfMTAwXzAwMAogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzA5CiAgICAvLyBtYW5hZ2VyVG9wT2ZmID0gdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgPCAyXzEwMF8wMDAgPyB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCA6IDJfMTAwXzAwMAogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIGludGMgOCAvLyAyMTAwMDAwCiAgICA8CiAgICBpbnRjIDggLy8gMjEwMDAwMAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcxMC03MTYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogbWFuYWdlclRvcE9mZiwKICAgIC8vICAgICByZWNlaXZlcjogdmFsaWRhdG9yQ29uZmlnLm1hbmFnZXIubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkIHRvIG1hbmFnZXIgZm9yIGZ1bmRpbmcgZXBvY2ggdXBkYXRlcycsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MTQKICAgIC8vIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkIHRvIG1hbmFnZXIgZm9yIGZ1bmRpbmcgZXBvY2ggdXBkYXRlcycsCiAgICBwdXNoYnl0ZXMgInZhbGlkYXRvciByZXdhcmQgdG8gbWFuYWdlciBmb3IgZnVuZGluZyBlcG9jaCB1cGRhdGVzIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MTAtNzE1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAndmFsaWRhdG9yIHJld2FyZCB0byBtYW5hZ2VyIGZvciBmdW5kaW5nIGVwb2NoIHVwZGF0ZXMnLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MTAtNzE2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIC8vICAgICBub3RlOiAndmFsaWRhdG9yIHJld2FyZCB0byBtYW5hZ2VyIGZvciBmdW5kaW5nIGVwb2NoIHVwZGF0ZXMnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBmcmFtZV9idXJ5IDIyCgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzE4CiAgICAvLyBpZiAodmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgLSBtYW5hZ2VyVG9wT2ZmID4gMCkgewogICAgZnJhbWVfZGlnIDM2CiAgICBmcmFtZV9kaWcgMjIKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMQogICAgYnogZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzE5LTcyNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzIzCiAgICAvLyBub3RlOiAndmFsaWRhdG9yIHJld2FyZCcsCiAgICBwdXNoYnl0ZXMgInZhbGlkYXRvciByZXdhcmQiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMzEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcxOS03MjQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogdmFsaWRhdG9yQ29tbWlzc2lvblBhaWRPdXQgLSBtYW5hZ2VyVG9wT2ZmLAogICAgLy8gICAgIHJlY2VpdmVyOiB2YWxpZGF0b3JDb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MubmF0aXZlLAogICAgLy8gICAgIG5vdGU6ICd2YWxpZGF0b3IgcmV3YXJkJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzE5LTcyNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiB2YWxpZGF0b3JDb21taXNzaW9uUGFpZE91dCAtIG1hbmFnZXJUb3BPZmYsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgbm90ZTogJ3ZhbGlkYXRvciByZXdhcmQnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgplcG9jaEJhbGFuY2VVcGRhdGVfYWZ0ZXJfaWZfZWxzZUAzNzoKICAgIGZyYW1lX2RpZyAxMAogICAgZnJhbWVfYnVyeSAxMQoKZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICBmcmFtZV9kaWcgMTEKICAgIGZyYW1lX2J1cnkgMTAKICAgIGIgZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMzkKCmVwb2NoQmFsYW5jZVVwZGF0ZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYwMi02MDUKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2wucHJvdG90eXBlLnByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvLCB7CiAgICAvLyAgIGFwcElkOiBwb29sT25lQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFt7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9XSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYwNAogICAgLy8gYXJnczogW3sgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH1dLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjYwNAogICAgLy8gYXJnczogW3sgaWQ6IHRoaXMudmFsaWRhdG9ySWQudmFsdWUsIHBvb2xJZDogdGhpcy5wb29sSWQudmFsdWUsIHBvb2xBcHBJZDogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjcyCiAgICAvLyBwb29sSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncG9vbElkJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MDQKICAgIC8vIGFyZ3M6IFt7IGlkOiB0aGlzLnZhbGlkYXRvcklkLnZhbHVlLCBwb29sSWQ6IHRoaXMucG9vbElkLnZhbHVlLCBwb29sQXBwSWQ6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCB9XSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2MDItNjA1CiAgICAvLyBhYmlDYWxsKFN0YWtpbmdQb29sLnByb3RvdHlwZS5wcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbywgewogICAgLy8gICBhcHBJZDogcG9vbE9uZUFwcElELAogICAgLy8gICBhcmdzOiBbeyBpZDogdGhpcy52YWxpZGF0b3JJZC52YWx1ZSwgcG9vbElkOiB0aGlzLnBvb2xJZC52YWx1ZSwgcG9vbEFwcElkOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQgfV0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTkgLy8gbWV0aG9kICJwcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbygodWludDY0LHVpbnQ2NCx1aW50NjQpKSh1aW50NjRbMjRdLHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAyNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGIgZXBvY2hCYWxhbmNlVXBkYXRlX2FmdGVyX2lmX2Vsc2VAMTIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nb09ubGluZShmZWVQYXltZW50OiB1aW50NjQsIHZvdGVQSzogYnl0ZXMsIHNlbGVjdGlvblBLOiBieXRlcywgc3RhdGVQcm9vZlBLOiBieXRlcywgdm90ZUZpcnN0OiB1aW50NjQsIHZvdGVMYXN0OiB1aW50NjQsIHZvdGVLZXlEaWx1dGlvbjogdWludDY0KSAtPiB2b2lkOgpnb09ubGluZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTAxLTkxMQogICAgLy8gZ29PbmxpbmUoCiAgICAvLyAgIGZlZVBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgLy8gVE9ETzogZml4IEFCSSB0eXBlcyB0byBqdXN0IHVzZSBieXRlcyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL3B1eWEtdHMvaXNzdWVzLzI0NAogICAgLy8gCiAgICAvLyAgIHZvdGVQSzogYnl0ZXM8MzI+LAogICAgLy8gICBzZWxlY3Rpb25QSzogYnl0ZXM8MzI+LAogICAgLy8gICBzdGF0ZVByb29mUEs6IGJ5dGVzPDY0PiwKICAgIC8vICAgdm90ZUZpcnN0OiB1aW50NjQsCiAgICAvLyAgIHZvdGVMYXN0OiB1aW50NjQsCiAgICAvLyAgIHZvdGVLZXlEaWx1dGlvbjogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA3IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTEyCiAgICAvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQogICAgY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkxNAogICAgLy8gYXNzZXJ0TWF0Y2goZmVlUGF5bWVudCwgeyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGFtb3VudDogZXh0cmFGZWUgfSkKICAgIGZyYW1lX2RpZyAtNwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgZnJhbWVfZGlnIC03CiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAxOQogICAgLy8gcmV0dXJuIDJfMDAwXzAwMAogICAgaW50YyAxMCAvLyAyMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkxNAogICAgLy8gYXNzZXJ0TWF0Y2goZmVlUGF5bWVudCwgeyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGFtb3VudDogZXh0cmFGZWUgfSkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTE1LTkyNQogICAgLy8gaXR4bgogICAgLy8gICAua2V5UmVnaXN0cmF0aW9uKHsKICAgIC8vICAgICB2b3RlS2V5OiB2b3RlUEssCiAgICAvLyAgICAgc2VsZWN0aW9uS2V5OiBzZWxlY3Rpb25QSywKICAgIC8vICAgICBzdGF0ZVByb29mS2V5OiBzdGF0ZVByb29mUEssCiAgICAvLyAgICAgdm90ZUZpcnN0OiB2b3RlRmlyc3QsCiAgICAvLyAgICAgdm90ZUxhc3Q6IHZvdGVMYXN0LAogICAgLy8gICAgIHZvdGVLZXlEaWx1dGlvbjogdm90ZUtleURpbHV0aW9uLAogICAgLy8gICAgIGZlZTogdGhpcy5nZXRHb09ubGluZUZlZSgpLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBWb3RlS2V5RGlsdXRpb24KICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBWb3RlTGFzdAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFZvdGVGaXJzdAogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIFN0YXRlUHJvb2ZQSwogICAgZnJhbWVfZGlnIC01CiAgICBpdHhuX2ZpZWxkIFNlbGVjdGlvblBLCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgVm90ZVBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkxNS05MjQKICAgIC8vIGl0eG4KICAgIC8vICAgLmtleVJlZ2lzdHJhdGlvbih7CiAgICAvLyAgICAgdm90ZUtleTogdm90ZVBLLAogICAgLy8gICAgIHNlbGVjdGlvbktleTogc2VsZWN0aW9uUEssCiAgICAvLyAgICAgc3RhdGVQcm9vZktleTogc3RhdGVQcm9vZlBLLAogICAgLy8gICAgIHZvdGVGaXJzdDogdm90ZUZpcnN0LAogICAgLy8gICAgIHZvdGVMYXN0OiB2b3RlTGFzdCwKICAgIC8vICAgICB2b3RlS2V5RGlsdXRpb246IHZvdGVLZXlEaWx1dGlvbiwKICAgIC8vICAgICBmZWU6IHRoaXMuZ2V0R29PbmxpbmVGZWUoKSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMTkKICAgIC8vIHJldHVybiAyXzAwMF8wMDAKICAgIGludGMgMTAgLy8gMjAwMDAwMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTE1LTkyNQogICAgLy8gaXR4bgogICAgLy8gICAua2V5UmVnaXN0cmF0aW9uKHsKICAgIC8vICAgICB2b3RlS2V5OiB2b3RlUEssCiAgICAvLyAgICAgc2VsZWN0aW9uS2V5OiBzZWxlY3Rpb25QSywKICAgIC8vICAgICBzdGF0ZVByb29mS2V5OiBzdGF0ZVByb29mUEssCiAgICAvLyAgICAgdm90ZUZpcnN0OiB2b3RlRmlyc3QsCiAgICAvLyAgICAgdm90ZUxhc3Q6IHZvdGVMYXN0LAogICAgLy8gICAgIHZvdGVLZXlEaWx1dGlvbjogdm90ZUtleURpbHV0aW9uLAogICAgLy8gICAgIGZlZTogdGhpcy5nZXRHb09ubGluZUZlZSgpLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5nb09mZmxpbmUoKSAtPiB2b2lkOgpnb09mZmxpbmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkzNgogICAgLy8gaWYgKFR4bi5zZW5kZXIgIT09IEFwcGxpY2F0aW9uKHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlKS5hZGRyZXNzKSB7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5MzYKICAgIC8vIGlmIChUeG4uc2VuZGVyICE9PSBBcHBsaWNhdGlvbih0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSkuYWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgICE9CiAgICBieiBnb09mZmxpbmVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjkzNwogICAgLy8gYXNzZXJ0KHRoaXMuaXNPd25lck9yTWFuYWdlckNhbGxlcigpLCAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJykKICAgIGNhbGxzdWIgaXNPd25lck9yTWFuYWdlckNhbGxlcgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgoKZ29PZmZsaW5lX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTQwCiAgICAvLyBpdHhuLmtleVJlZ2lzdHJhdGlvbih7fSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5saW5rVG9ORkQobmZkQXBwSWQ6IHVpbnQ2NCwgbmZkTmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmxpbmtUb05GRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ2CiAgICAvLyBsaW5rVG9ORkQobmZkQXBwSWQ6IHVpbnQ2NCwgbmZkTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ3CiAgICAvLyBhc3NlcnQodGhpcy5pc093bmVyT3JNYW5hZ2VyQ2FsbGVyKCksICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InKQogICAgY2FsbHN1YiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk0OS05NjAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBCeXRlcygndmVyaWZ5X25mZF9hZGRyJyksCiAgICAvLyAgICAgICBCeXRlcyhuZmROYW1lKSwKICAgIC8vICAgICAgIG9wLml0b2IobmZkQXBwSWQpLAogICAgLy8gICAgICAgbmV3IEFkZHJlc3MoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLmJ5dGVzLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwczogW25mZEFwcElkXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk1MQogICAgLy8gYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIGludGMgMTEgLy8gVE1QTF9ORkRfUkVHSVNUUllfQVBQX0lECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk1NQogICAgLy8gb3AuaXRvYihuZmRBcHBJZCksCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTU2CiAgICAvLyBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykuYnl0ZXMsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NTMKICAgIC8vIEJ5dGVzKCd2ZXJpZnlfbmZkX2FkZHInKSwKICAgIHB1c2hieXRlcyAidmVyaWZ5X25mZF9hZGRyIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk0OS05NTkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBCeXRlcygndmVyaWZ5X25mZF9hZGRyJyksCiAgICAvLyAgICAgICBCeXRlcyhuZmROYW1lKSwKICAgIC8vICAgICAgIG9wLml0b2IobmZkQXBwSWQpLAogICAgLy8gICAgICAgbmV3IEFkZHJlc3MoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLmJ5dGVzLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwczogW25mZEFwcElkXSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTQ5LTk2MAogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogVGVtcGxhdGVWYXI8dWludDY0PignTkZEX1JFR0lTVFJZX0FQUF9JRCcpLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIEJ5dGVzKCd2ZXJpZnlfbmZkX2FkZHInKSwKICAgIC8vICAgICAgIEJ5dGVzKG5mZE5hbWUpLAogICAgLy8gICAgICAgb3AuaXRvYihuZmRBcHBJZCksCiAgICAvLyAgICAgICBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykuYnl0ZXMsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHBzOiBbbmZkQXBwSWRdLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjpTdGFraW5nUG9vbC5wcm94aWVkU2V0VG9rZW5QYXlvdXRSYXRpbyhwb29sS2V5OiBieXRlcykgLT4gYnl0ZXM6CnByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NjkKICAgIC8vIHByb3hpZWRTZXRUb2tlblBheW91dFJhdGlvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTcwCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JJZC52YWx1ZSA9PT0gcG9vbEtleS5pZCwgJ2NhbGxlciBtdXN0IGJlIHBhcnQgb2Ygc2FtZSB2YWxpZGF0b3Igc2V0IScpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2OQogICAgLy8gdmFsaWRhdG9ySWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmFsaWRhdG9ySWQnIH0pCiAgICBieXRlY18zIC8vICJ2YWxpZGF0b3JJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTcwCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JJZC52YWx1ZSA9PT0gcG9vbEtleS5pZCwgJ2NhbGxlciBtdXN0IGJlIHBhcnQgb2Ygc2FtZSB2YWxpZGF0b3Igc2V0IScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgOAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbGxlciBtdXN0IGJlIHBhcnQgb2Ygc2FtZSB2YWxpZGF0b3Igc2V0IQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NzEKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xJZC52YWx1ZSA9PT0gMSwgJ2NhbGxlZSBtdXN0IGJlIHBvb2wgMScpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo3MgogICAgLy8gcG9vbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Bvb2xJZCcgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTcxCiAgICAvLyBhc3NlcnQodGhpcy5wb29sSWQudmFsdWUgPT09IDEsICdjYWxsZWUgbXVzdCBiZSBwb29sIDEnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbGxlZSBtdXN0IGJlIHBvb2wgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NzIKICAgIC8vIGFzc2VydChwb29sS2V5LnBvb2xJZCAhPT0gMSwgJ2NhbGxlciBtdXN0IE5PVCBiZSBwb29sIDEnKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDggOAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbGxlciBtdXN0IE5PVCBiZSBwb29sIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTc0LTk3NwogICAgLy8gY29uc3QgY2FsbGVyUG9vbEFwcElEID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0UG9vbEFwcElkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3Bvb2xLZXkuaWQsIHBvb2xLZXkucG9vbElkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk3NQogICAgLy8gYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjYKICAgIC8vIGNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdjcmVhdG9yQXBwJyB9KQogICAgYnl0ZWNfMSAvLyAiY3JlYXRvckFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTc1CiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NzQtOTc3CiAgICAvLyBjb25zdCBjYWxsZXJQb29sQXBwSUQgPSBhYmlDYWxsKFZhbGlkYXRvclJlZ2lzdHJ5QUJJLnByb3RvdHlwZS5nZXRQb29sQXBwSWQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbcG9vbEtleS5pZCwgcG9vbEtleS5wb29sSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDI0IC8vIG1ldGhvZCAiZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk3OQogICAgLy8gYXNzZXJ0KGNhbGxlclBvb2xBcHBJRCA9PT0gcG9vbEtleS5wb29sQXBwSWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5ODAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwb29sS2V5LnBvb2xBcHBJZCkuYWRkcmVzcykKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTgyLTk4NQogICAgLy8gcmV0dXJuIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLnNldFRva2VuUGF5b3V0UmF0aW8sIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5ODQKICAgIC8vIGFyZ3M6IFt0aGlzLnZhbGlkYXRvcklkLnZhbHVlXSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTgyLTk4NQogICAgLy8gcmV0dXJuIGFiaUNhbGwoVmFsaWRhdG9yUmVnaXN0cnlBQkkucHJvdG90eXBlLnNldFRva2VuUGF5b3V0UmF0aW8sIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy52YWxpZGF0b3JJZC52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgMjUgLy8gbWV0aG9kICJzZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo6U3Rha2luZ1Bvb2wuaXNPd25lck9yTWFuYWdlckNhbGxlcigpIC0+IHVpbnQ2NDoKaXNPd25lck9yTWFuYWdlckNhbGxlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTg4CiAgICAvLyBwcml2YXRlIGlzT3duZXJPck1hbmFnZXJDYWxsZXIoKTogYm9vbGVhbiB7CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTg5LTk5MgogICAgLy8gY29uc3QgT3duZXJBbmRNYW5hZ2VyID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTkwCiAgICAvLyBhcHBJZDogdGhpcy5jcmVhdGluZ1ZhbGlkYXRvckNvbnRyYWN0QXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo2NgogICAgLy8gY3JlYXRpbmdWYWxpZGF0b3JDb250cmFjdEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2NyZWF0b3JBcHAnIH0pCiAgICBieXRlY18xIC8vICJjcmVhdG9yQXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5OTAKICAgIC8vIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk5MQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NjkKICAgIC8vIHZhbGlkYXRvcklkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhbGlkYXRvcklkJyB9KQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdG9ySWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk5MQogICAgLy8gYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OTg5LTk5MgogICAgLy8gY29uc3QgT3duZXJBbmRNYW5hZ2VyID0gYWJpQ2FsbChWYWxpZGF0b3JSZWdpc3RyeUFCSS5wcm90b3R5cGUuZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmNyZWF0aW5nVmFsaWRhdG9yQ29udHJhY3RBcHBJZC52YWx1ZSwKICAgIC8vICAgYXJnczogW3RoaXMudmFsaWRhdG9ySWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweDJmYTIyYzRiIC8vIG1ldGhvZCAiZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHVpbnQ2NCkoYWRkcmVzcyxhZGRyZXNzKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5OTMKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyID09PSBPd25lckFuZE1hbmFnZXJbMF0ubmF0aXZlIHx8IFR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclsxXS5uYXRpdmUKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGV4dHJhY3QgNCAzMgogICAgPT0KICAgIGJueiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyX2Jvb2xfdHJ1ZUAzCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAzNiAzMgogICAgPT0KICAgIGJ6IGlzT3duZXJPck1hbmFnZXJDYWxsZXJfYm9vbF9mYWxzZUA0Cgppc093bmVyT3JNYW5hZ2VyQ2FsbGVyX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmlzT3duZXJPck1hbmFnZXJDYWxsZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5OTMKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyID09PSBPd25lckFuZE1hbmFnZXJbMF0ubmF0aXZlIHx8IFR4bi5zZW5kZXIgPT09IE93bmVyQW5kTWFuYWdlclsxXS5uYXRpdmUKICAgIHN3YXAKICAgIHJldHN1YgoKaXNPd25lck9yTWFuYWdlckNhbGxlcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc093bmVyT3JNYW5hZ2VyQ2FsbGVyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6OlN0YWtpbmdQb29sLmNoZWNrSWZCaW5DbG9zZWQoKSAtPiB2b2lkOgpjaGVja0lmQmluQ2xvc2VkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDMyCiAgICAvLyBwcml2YXRlIGNoZWNrSWZCaW5DbG9zZWQoKSB7CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMzMKICAgIC8vIGNvbnN0IGN1cnJlbnRCaW5TaXplID0gQmlnVWludCh0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5NgogICAgLy8gcm91bmRzUGVyRGF5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3JvdW5kc1BlckRheScgfSkKICAgIGJ5dGVjIDcgLy8gInJvdW5kc1BlckRheSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzMwogICAgLy8gY29uc3QgY3VycmVudEJpblNpemUgPSBCaWdVaW50KHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgaXRvYgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM0CiAgICAvLyBpZiAoR2xvYmFsLnJvdW5kID49IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKSB7CiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk4CiAgICAvLyBiaW5Sb3VuZFN0YXJ0ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2JpblJvdW5kU3RhcnQnIH0pCiAgICBieXRlYyA5IC8vICJiaW5Sb3VuZFN0YXJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM0CiAgICAvLyBpZiAoR2xvYmFsLnJvdW5kID49IHRoaXMuYmluUm91bmRTdGFydC52YWx1ZSArIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICA+PQogICAgYnogY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzNQogICAgLy8gZW5zdXJlQnVkZ2V0KDMwMCkKICAgIGludGMgNyAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAzNwogICAgLy8gY29uc3QgYXBwcm94Um91bmRzUGVyWWVhcjogYmlndWludCA9IGN1cnJlbnRCaW5TaXplICogQmlnVWludCgzNjUpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMTZkCiAgICBiKgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMzgKICAgIC8vIGNvbnN0IGF2Z1N0YWtlOiBiaWd1aW50ID0gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlLm5hdGl2ZSAvIGN1cnJlbnRCaW5TaXplCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDAKICAgIC8vIHN0YWtlQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ3N0YWtlQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyA2IC8vICJzdGFrZUFjY3VtdWxhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM4CiAgICAvLyBjb25zdCBhdmdTdGFrZTogYmlndWludCA9IHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZS5uYXRpdmUgLyBjdXJyZW50QmluU2l6ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGIvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDM5CiAgICAvLyBpZiAoYXZnU3Rha2UgIT09IEJpZ1VpbnQoMCkpIHsKICAgIHB1c2hieXRlcyAweAogICAgYiE9CiAgICBieiBjaGVja0lmQmluQ2xvc2VkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQ0CiAgICAvLyAoKEJpZ1VpbnQodGhpcy5yZXdhcmRBY2N1bXVsYXRvci52YWx1ZSkgKiBCaWdVaW50KDEwMDAwKSkgLyBhdmdTdGFrZSkgKiAoYXBwcm94Um91bmRzUGVyWWVhciAvIGN1cnJlbnRCaW5TaXplKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAyCiAgICAvLyByZXdhcmRBY2N1bXVsYXRvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXdhcmRBY2N1bXVsYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJyZXdhcmRBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0NAogICAgLy8gKChCaWdVaW50KHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUpICogQmlnVWludCgxMDAwMCkpIC8gYXZnU3Rha2UpICogKGFwcHJveFJvdW5kc1BlclllYXIgLyBjdXJyZW50QmluU2l6ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgyNzEwCiAgICBiKgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYi8KICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgYi8KICAgIGIqCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0NgogICAgLy8gbGV0IGFscGhhID0gQmlnVWludCgxMCkgLy8gLjEKICAgIHB1c2hieXRlcyAweDBhCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0OAogICAgLy8gaWYgKGF2Z1N0YWtlID4gQmlnVWludCgzMDAwMDAwMDAwMDApKSB7CiAgICBwdXNoYnl0ZXMgMHg0NWQ5NjRiODAwCiAgICBiPgogICAgYnogY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0OQogICAgLy8gYWxwaGEgPSBCaWdVaW50KDkwKSAvLyAuOQogICAgcHVzaGJ5dGVzIDB4NWEKICAgIGZyYW1lX2J1cnkgMAoKY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTIKICAgIC8vICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZS5uYXRpdmUgKiAoQmlnVWludCgxMDApIC0gYWxwaGEpKSAvIEJpZ1VpbnQoMTAwKSArCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDQKICAgIC8vIHdlaWdodGVkTW92aW5nQXZlcmFnZSA9IEdsb2JhbFN0YXRlPFVpbnQxMjg+KHsga2V5OiAnZXdtYScgfSkKICAgIGJ5dGVjIDE2IC8vICJld21hIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDUyCiAgICAvLyAodGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUubmF0aXZlICogKEJpZ1VpbnQoMTAwKSAtIGFscGhhKSkgLyBCaWdVaW50KDEwMCkgKwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDE4IC8vIDB4NjQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGItCiAgICBiKgogICAgYnl0ZWMgMTggLy8gMHg2NAogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1MwogICAgLy8gKGFwciAqIGFscGhhKSAvIEJpZ1VpbnQoMTAwKSwKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlYyAxOCAvLyAweDY0CiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDUyLTEwNTMKICAgIC8vICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZS5uYXRpdmUgKiAoQmlnVWludCgxMDApIC0gYWxwaGEpKSAvIEJpZ1VpbnQoMTAwKSArCiAgICAvLyAgIChhcHIgKiBhbHBoYSkgLyBCaWdVaW50KDEwMCksCiAgICBiKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDUxLTEwNTQKICAgIC8vIHRoaXMud2VpZ2h0ZWRNb3ZpbmdBdmVyYWdlLnZhbHVlID0gbmV3IFVpbnQxMjgoCiAgICAvLyAgICh0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZS5uYXRpdmUgKiAoQmlnVWludCgxMDApIC0gYWxwaGEpKSAvIEJpZ1VpbnQoMTAwKSArCiAgICAvLyAgICAgKGFwciAqIGFscGhhKSAvIEJpZ1VpbnQoMTAwKSwKICAgIC8vICkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA0CiAgICAvLyB3ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UgPSBHbG9iYWxTdGF0ZTxVaW50MTI4Pih7IGtleTogJ2V3bWEnIH0pCiAgICBieXRlYyAxNiAvLyAiZXdtYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1MS0xMDU0CiAgICAvLyB0aGlzLndlaWdodGVkTW92aW5nQXZlcmFnZS52YWx1ZSA9IG5ldyBVaW50MTI4KAogICAgLy8gICAodGhpcy53ZWlnaHRlZE1vdmluZ0F2ZXJhZ2UudmFsdWUubmF0aXZlICogKEJpZ1VpbnQoMTAwKSAtIGFscGhhKSkgLyBCaWdVaW50KDEwMCkgKwogICAgLy8gICAgIChhcHIgKiBhbHBoYSkgLyBCaWdVaW50KDEwMCksCiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2hlY2tJZkJpbkNsb3NlZF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk2CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNyAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDY2CiAgICAvLyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSA9IEFWR19ST1VORFNfUEVSX0RBWQogICAgaW50YyA1IC8vIDMwODU3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDU5CiAgICAvLyB0aGlzLnN0YWtlQWNjdW11bGF0b3IudmFsdWUgPSBuZXcgVWludDEyOCh0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAqIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6NzgKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlYyA1IC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTkKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICogdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDY2CiAgICAvLyB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSA9IEFWR19ST1VORFNfUEVSX0RBWQogICAgaW50YyA1IC8vIDMwODU3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNTkKICAgIC8vIHRoaXMuc3Rha2VBY2N1bXVsYXRvci52YWx1ZSA9IG5ldyBVaW50MTI4KHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICogdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpCiAgICAqCiAgICBpdG9iCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTAwCiAgICAvLyBzdGFrZUFjY3VtdWxhdG9yID0gR2xvYmFsU3RhdGU8VWludDEyOD4oeyBrZXk6ICdzdGFrZUFjY3VtdWxhdG9yJyB9KQogICAgYnl0ZWMgNiAvLyAic3Rha2VBY2N1bXVsYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA1OQogICAgLy8gdGhpcy5zdGFrZUFjY3VtdWxhdG9yLnZhbHVlID0gbmV3IFVpbnQxMjgodGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKiB0aGlzLnJvdW5kc1BlckRheS52YWx1ZSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwMgogICAgLy8gcmV3YXJkQWNjdW11bGF0b3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmV3YXJkQWNjdW11bGF0b3InIH0pCiAgICBieXRlYyAxMSAvLyAicmV3YXJkQWNjdW11bGF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjEwNjAKICAgIC8vIHRoaXMucmV3YXJkQWNjdW11bGF0b3IudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2MQogICAgLy8gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlID0gR2xvYmFsLnJvdW5kIC0gKEdsb2JhbC5yb3VuZCAlIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS9zdGFraW5nUG9vbC5hbGdvLnRzOjk2CiAgICAvLyByb3VuZHNQZXJEYXkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncm91bmRzUGVyRGF5JyB9KQogICAgYnl0ZWMgNyAvLyAicm91bmRzUGVyRGF5IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czoxMDYxCiAgICAvLyB0aGlzLmJpblJvdW5kU3RhcnQudmFsdWUgPSBHbG9iYWwucm91bmQgLSAoR2xvYmFsLnJvdW5kICUgdGhpcy5yb3VuZHNQZXJEYXkudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgJQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvc3Rha2luZ1Bvb2wuYWxnby50czo5OAogICAgLy8gYmluUm91bmRTdGFydCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdiaW5Sb3VuZFN0YXJ0JyB9KQogICAgYnl0ZWMgOSAvLyAiYmluUm91bmRTdGFydCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3N0YWtpbmdQb29sLmFsZ28udHM6MTA2MQogICAgLy8gdGhpcy5iaW5Sb3VuZFN0YXJ0LnZhbHVlID0gR2xvYmFsLnJvdW5kIC0gKEdsb2JhbC5yb3VuZCAlIHRoaXMucm91bmRzUGVyRGF5LnZhbHVlKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNoZWNrSWZCaW5DbG9zZWRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiAMAAFABsgBifEBnQGsAqCWgAHAhD2AiXoAJh0Hc3Rha2VycwpjcmVhdG9yQXBwBBUffHULdmFsaWRhdG9ySWQGcG9vbElkBnN0YWtlZBBzdGFrZUFjY3VtdWxhdG9yDHJvdW5kc1BlckRheQIAAg1iaW5Sb3VuZFN0YXJ0Cm51bVN0YWtlcnMRcmV3YXJkQWNjdW11bGF0b3IKbGFzdFBheW91dAR1r/YdDW1pbkVudHJ5U3Rha2ULZXBvY2hOdW1iZXIEZXdtYQIAAQFkBAwiReEDBoEBEAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAASi3FG1BFcnZ9EETfjYbgoAAQAAAAAAD0JAAgADADEbQQBtgg4ERvdlMwRZ6QqmBDFyyp0ER8/MBAT5xwy9BEIbWr4E9YktVgRc+7BXBGPz8osEhqNyXATvwmCNBJzuLkAEUe87IQSiTicXJxM2GgCODwEjAQYA/QDnAMkAtgCqAJcAgABuAGIANwArABUAAiJDMRkURDEYRDYaAYgPIypMULAjQzEZFEQxGEQ2GgEXNhoCVwIAiA7QI0MxGRREMRhEiA6pI0MxGRREMRhEMRYjCUk4ECMSRDYaATYaAjYaAzYaBBc2GgUXNhoGF4gORCNDMRkURDEYRIgHIiNDMRkURDEYRDYaAVcCAIgG+yNDMRkURDEYRDYaATYaAhc2GgMXiAa1I0MxGRREMRhENhoBiAZrKkxQsCNDMRkURDEYRIgFciNDMRkURDEYRDYaATYaAheIA4kjQzEZFEQxGEQxFiMJSTgQIxJENhoBiAIvFipMULAjQzEZFEQxGEQxFiMJSTgQIxJEiAGII0MxGRREMRhEI0MxGRREMRgURDYaARc2GgIXNhoDFzYaBBeIAQEjQzEZgQQSRDEYRIgAzCNDigIAi/6BCgiLADIMDUEAKbElshCBBbIZJxSyHicUsh+L/40CAAsABLNC/9wyALIBQv/1IrIBQv/viYoCAyKAAEknFYv+IlkiiwWLBAxBACWL/lcCAIsFSU4CgQgLWxaLA6NJFYEQDkSBEK+rjAMjCIwFQv/TJxWMAIv/IlmMASKMAosCiwEMQQAli/9XAgCLAklOAoEIC1sWiwCjSRWBEA5EgRCvq4wAIwiMAkL/04sDiwCiSRWBCA5EgQivqxeL/ov/jAKMAYwAiTEAgCBeeV0iNViuVKuRImvJgMRRMTBozI+mLW+ccHa9gLtlrxJEiYoEAIv8QABQi/0URIv+FESL/yEJD0Qpi/xnK4v9ZycEi/5nJwoiZycFImcnDov/ZycMMgZnJw8iZycHIQVnMgZJIQUYCScJTGcnBicWZycLImcnECcWZ4mL/USL/kRC/6+KAQAovUUBFESxIillRCIrZUQWJw2yGrIashglshAisgGztD5JVwAEKhJEIQZbSUEAViInBGVEIxJBAEwjgaCNBguB1Pa+AgiL/zgHMghyCEQSi/84CE8CEhBEKIGAZLlIiwBBACEiJwRlRCMSQQAXsTIIcghEIrISshSLALIRgQSyECKyAbOJIkL/sYoCASJJgABJKL1FAUQxACIpZURyCEQSRIv/MgMTRIgMy4v+OAAiKWVEcghEEov+OAcyChIQi/44CElPAiMQRDIGgcACCEwiTCInBWVESwEIJwVMZyInCWVEIicHZUQIMgYJIicGZURPAhZJTgNPAhajoEkVgRAORIEQr6snBkxnIii9RQFEiwghBAxBAGwhByKI/Y6LCCQLSYwCKEwkukmMAVcAIEmMAIv/EkEAJSiLAklOAiS6gSBbiwQIFosBTFwgiwVJTgIWXDgoTwNPAruMAImLBkmMA0AAEosAMgMSiwaMA0EABosIIwiMA4sDjAaLCCMIjAhC/4eLBkkUFEQiJw5lRIsEDkQjCSQLKEsBJLpXACAyAxJEi/+LB1AiFkxLAVBMUIsFSU4CFlAoTwNPArsiJwplRCMIJwpMZ4wAiYoCACJJgABHBov+MQATQQAEiAtRRIgLkyKMBii9RQFEiwZJIQQMRCEHIoj8tCQLSYwFKEwkukmMAFcAIIv+EkEBi4v/jASL/0AADSiLBSS6gSBbSYz/jASLBIz/KIsFJLqBIFtJi/8MFESL/wkWiwBMXCBJjAAiJwVlRIv/CScFTGcijAJJgTBbSYwDTIwBQQBTIicEZUQjEkEBJbEiKWVEIitlRBYnDbIashqyGCWyECKyAbO0PklXAAQqEkSxIQZbiwOyEov+shSyEYEEshAisgGzIhaLAExcMIwAiwOMAosAjAGLAUmMAIEgW0mMCEEACyInDmVEiwgOQQC/I0SxgAh1bnN0YWtlZLIFi/6yB4v/sggjshAisgGzIowHiwCMAYsIQAAgIicKZUQjCScKTGeLADIDXAAiFkxLAVwoTFwwI4wHjAGLASiLBU8CuyInCWVEIicHZUQIMgYJi/8LFiInBmVETKFJFYEQDkSBEK+rJwZMZ7EiKWVEIitlRCInBGVEMghPAhZPAhZQTBZQi/8WiwIWgAEAIosHVCcXshpPA7Iai/6yGk8CshpMshqyGrIYJbIQIrIBs4kiQv8+IhaLAExcMIwAQv8QiwYjCIwGQv5FigAAIkmAAEkxACIovUUBRIsFSSEEDEQhByKI+u4kC0mMAyhMJLpJjAFXACCLBBJBAK4oiwMkuklXMAiMAIEwW0mMAkAAAYkiJwRlRCMSQQCDsSIpZUQiK2VEFicNshqyGrIYJbIQIrIBs7Q+SVcABCoSRLEhBluLArISiwSyFLIRgQSyECKyAbMiFosBTFwwjAEoiwOLAbuxIillRCIrZUQiJwRlRDIITwIWTwIWUEwWUCIWJxeyGkyyGosEshqyGosAshqAAQCyGrIYJbIQIrIBs4kiFosBTFwwjAFC/7KLBSMIjAVC/yKKAQGAACIovUUBRIsBSSEEDEQhBCKI+gokC0mMAChMJLpXACCL/xJBAAgoiwAkuowAiYsBIwiMAUL/y4oDADEAIillRHIIRBJEIicEZUQjEkSL/kSxi/+yEov9shSL/rIRgQSyECKyAbOJigEAiAg2RIAIYWxnb2RWZXKL/2eJigAAIkcJgABHICKxIillRCIrZUQWJw2yGrIashglshAisgGztD5HAlcABCoSRIGtAVpJMgZJTgJJTwIYCSInDGVFAUEADiInDGVESYstGAmLLxNEiAgWJwyLLmciJw9lRCMIJw9MZ4ssIQZbSYwlMgiMGjIKSYwHiyuMCYwIQQB4IicEZUQjE0EANbEiKWVEIitlRBYjFicYshpMshqyGrIYJbIQIrIBs7Q+SVcEAExXAAQqEkQXSYwacghMjAdEIicEZUQjEkEGGrEiKWVEIitlRBYnGbIashqyGCWyECKyAbO0PklXBACMK1cABCoSRIsrjAmLB4wIiwmMK4sIjAexIillRCIrZUQWgAQfLwEJshqyGrIYJbIQIrIBs7Q+SVcABCoSREmBFluMGzIKcwBEIicFZUQJMgpzAUQJjAoijBOB6AcWjAKCAhIAAgAHGv1JjQAAAAAAAAAAAGQKAAEAAAAAAAAD6Ij4cUYCSYwMTIEOW0mMKAxBAAMjjBMiSYwgIowiIowkIowPjCGLJUEAP4sHiyVwAEiLGwmLLIGlAVtJjCkPQQAkIicEZUQjCYsrVwDATIEIC1uLKRYnCExQTBZQJxqI+BNGAowgiyCMIYshSYwgQAAiiwohCQxBABqAFiF0b2tlbiYmIW5vYWxnbyB0byBwYXmwiYsTQQP0iwpJFicITFCLDBZQiygWJxFMUIj3xkYCTEsBCUmMD7EnHIAicG9vbCBzYXR1cmF0ZWQsIGV4Y2VzcyB0byBmZWUgc2lua7IFsgeyCCOyECKyAbOMCiKMEYsKQAANiyKMI4sRjBKLIEEC+yKMGCKMECi9RQFEixAhBAxBAa6BkAMiiPceixAkC0mMDShMJLpJjANXACAyAxOLEYwSiwqMC4sijCOLIIwhixiMGUEAMiiLDSS6gThbSYwqiy8PQQA+KIsNJLqBIFuLGAiMGIsRjBKLCowLiyKMI4sgjCGLGIwZixKMEYsLjAqLI4wiiyGMIIsZjBiLECMIjBBC/3KLL4sqCUmMHIstDIsRjBKLCowLiyKMI4sgjCGLGIwZQQD0KIsNJLqBIFtJjCaLGAiMGIscgegHC4stCowdiyKMI4sgSYwhiwOMBEEARIsmFicbTFCLIElOAhZQix0WUCInBWVEFicITFCLAlCI9m9GAkxLAQkoiw0kuoEwW0sCCBaLA0xcMIsiTwMIjCOMBIwhiyOMIoshjCCLBEmMA4sRjBKLCkmMC0yMBEEATYsDSYEgW0kWJxtMUIsKSU4CFlCLHRZQIicFZUQWJwhMUIsCUIj2CkYCTEsBCU8CSwIIFk8DTFwgSYEoW0sDCBZcKIsRTwMIjBKMBIwLiwuLEosEKIsNTwK7jBKMC4sijCOLIIwhixiMGYsSjBGLC4wKiyOMIoshjCCLGYwYQv6iIicFZUSLGAlJjBeLIowjixGMEkEBISKMFCi9RQFEixQhBAxBAQkhBCKI9UuLFCQLSYwOKEwkukmMBVcAIDIDE4sRjBKLIowjQQDTKIsOJLqBOFtJjCeLLwyLEYwSiyKMI0EAuosviycJiy0PixGMEosijCNBAKSLIowjiwWMBosgQQA6KIsOSU4CJLqBIFsWJwhMUIsgFlCLFxYnEUxQiPUPRgIoTwIkuoEwW0sBCBaLBUxcMIsiTwIIjCOMBosjjCKLBkmMBYsRjBKMBosKQQA5iwVJgSBbSRYnCExQiwoWUIsXFicRTFCI9MVGAkxLAQgWTwJMXCBJgShbSwIIFlwoixFPAgiMEowGixKLBiiLDk8Cu4wSiyKMI0IAAIsSjBGLI4wiixQjCIwUQv7qiyKMI4sRjBJCAACLI4sSIicJZUQiJwdlRAgyBgkiJwVlREsCCCcFTGciJwZlREsCFk8CFksBo08CoEkVgRAORIEQr6snBkxnIicLZURPAggnC0xnsSIpZUQiK2VEIicEZUQyCE8CFk8CFlBMFlBPAxaLJBaLDxaABEGPzvyyGk8DshpPBLIaTwKyGkyyGrIashglshAisgGziYssgbEBWkmMHosKjAtBANiLCkkWJwhMUIseFlAnGojzx0YCSYwkTEsBCYwKQQC1IkmMFYssSVcsIElOAowAV7UgSYwBE0yMFkEAaosASXMARExzAUQJIQgMixWMFkEAVYskSSEIDCEITgJNsYA1dmFsaWRhdG9yIHJld2FyZCB0byBtYW5hZ2VyIGZvciBmdW5kaW5nIGVwb2NoIHVwZGF0ZXOyBYsAsgdJsggjshAisgGzjBaLJIsWCUmMH0EAJLGAEHZhbGlkYXRvciByZXdhcmSyBYsBsgeLH7III7IQIrIBs4sKjAuLC4wKQvtysSIrZUQiJwRlRDIITwIWTwIWUEwWUCcTshqyGosashglshAisgGztD5XAAQqEkRC+duKBwCIAQtEi/k4BzIKEov5OAghChIQRLGL/7IOi/6yDYv9sgyL/LI/i/uyC4v6sgqBArIQIQqyAbOJMQAiKWVEcghEE0EABIgAx0SxgQKyECKyAbOJigIAiAC2RLEhC4v+FjIKi/6yMoAPdmVyaWZ5X25mZF9hZGRyshqL/7IaTLIashqyGCWyECKyAbOJigEBIitlRIv/VwAIi/8iW0sCEkQiJwRlRCMSRIv/VwgIi/+BCFsjE0SxIillRCcYshpPArIaTLIaSbIYJbIQIrIBs7Q+SVcEAExXAAQqEkQXi/+BEFtMSwESRDEATHIIRBJEsUwWJxmyGrIashglshAisgGztD5JVwQATFcABCoSRImKAAGxIillRCIrZUQWgAQvoixLshqyGrIYJbIQIrIBs7Q+RwJXAAQqEkQxAExXBCASQAALMQCLAFckIBJBAAMjTIkiQv/6igAAIkcEJwdlREkWTDIGIicJZURPAggPQQCeIQciiPEViwRJgAIBbaOMASInBmVETKJJjAOAAKlBAFYiJwtlRBaAAicQo4sDSU4CoosBiwSio4wCgAEKjACABUXZZLgApUEABYABWowAIicQZUQnEosASU4DoaMnEqKLAk8CoycSoqBJFYEQDkSBEK+rJxBMZycHIQVnIicFZUQhBQsWgRCvqycGTGcnCyJnMgZJIicHZUQYCScJTGeJ", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 0, "patch": 0 } }, "events": [], "templateVariables": { "NFD_REGISTRY_APP_ID": { "type": "AVMUint64" }, "FEE_SINK_ADDR": { "type": "address" } } }