{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "ObjectAE8BF7D4": [ { "name": "custodianGroupId", "type": "uint64" }, { "name": "assetId", "type": "uint64" } ], "AdminChange": [ { "name": "changeType", "type": "uint64" }, { "name": "targetGroupId", "type": "uint64" }, { "name": "groupName", "type": "string" }, { "name": "memberAddr", "type": "address" }, { "name": "memberType", "type": "uint64" }, { "name": "memberLabel", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "activeFlag", "type": "uint64" }, { "name": "guardAmount", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "AssetGuard": [ { "name": "createdRound", "type": "uint64" }, { "name": "lockedAmount", "type": "uint64" } ], "GroupSeed": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "groupType", "type": "uint64" } ], "Member": [ { "name": "accountType", "type": "uint64" }, { "name": "label", "type": "string" }, { "name": "addr", "type": "address" } ], "Proposal": [ { "name": "groupId", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "payloadType", "type": "uint64" }, { "name": "approvalsCount", "type": "uint64" }, { "name": "threshold", "type": "uint64" }, { "name": "expiryRound", "type": "uint64" }, { "name": "proposer", "type": "address" }, { "name": "numPayloads", "type": "uint64" }, { "name": "epochAtCreation", "type": "uint64" }, { "name": "payloadVersion", "type": "uint64" }, { "name": "totalTxns", "type": "uint64" } ], "RekeyedAddress": [ { "name": "label", "type": "string" }, { "name": "addedRound", "type": "uint64" } ], "SignerGroup": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "memberCount", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "dailyUsage", "type": "uint64" }, { "name": "dailyPeriodStart", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "monthlyUsage", "type": "uint64" }, { "name": "monthlyPeriodStart", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "lastExecutionRound", "type": "uint64" }, { "name": "membershipEpoch", "type": "uint64" }, { "name": "active", "type": "uint64" }, { "name": "groupType", "type": "uint64" }, { "name": "guardCount", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "createApplication \u2014 called once on deployment. Initialises global state.\nThe creator is the only account that can bootstrap the safe.", "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "string", "name": "groupName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "bootstrap \u2014 simple one-call bootstrap for a fresh safe.\nCreates group 1 with full admin+action privileges and adds the creator as\nthe sole member. Incompatible with bootstrapGroup (the two paths cannot mix).", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] } ], "recommendations": {} }, { "name": "bootstrapGroup", "args": [ { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "GroupSeed", "name": "seed" }, { "type": "(address,uint64,string)[]", "name": "members" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "bootstrapGroup \u2014 clone-friendly bootstrap; may be called multiple times before\nfinalizeBootstrap(). Each call creates one group with its full member set.\nUsed by deployClonedSafe() to mirror the predecessor safe's governance structure\ninto a newly deployed contract before activating it.", "events": [ { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] } ], "recommendations": {} }, { "name": "bootstrapRekeyedAddress", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "bootstrapRekeyedAddress \u2014 seed the rekeyed-address registry during cloning.\nOnly callable before finalizeBootstrap(); mirrors entries from the predecessor.", "events": [ { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] } ], "recommendations": {} }, { "name": "finalizeBootstrap", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "finalizeBootstrap \u2014 activates a cloned safe seeded via bootstrapGroup.\nRequires at least one active group with PRIV_GROUP to prevent lockout.\nAfter this call _newProposal succeeds and normal governance begins.", "events": [], "recommendations": {} }, { "name": "proposeTransactionGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "expiryRound" }, { "type": "bool", "name": "execute" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "proposeTransactionGroup \u2014 create and optionally immediately execute a transaction\nproposal. The caller must be a member of groupId.\n\nexecute=true skips the approval phase (valid only when threshold=1 and the\nproposer is the sole member, i.e. the proposal is instantly READY).\n\nThe payload is stored in chunk slot 1; further chunks can be appended via\nappendTransactionGroupPayload before the first independent approval.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "appendTransactionGroupPayload", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "appendTransactionGroupPayload \u2014 add an additional payload chunk to an existing\ntransaction proposal. Only the original proposer may append, and only while\nno independent approver has signed yet (approvalsCount === 1 means only the\nauto-approval from _newProposal). Each append bumps payloadVersion so any\nsigner that has already approved sees \"payload changed since review\" on their\nnext call and must re-approve the new version.\n\nPrevents appending to expired proposals (blocks extending validity window).", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "AdminChange", "name": "change" }, { "type": "uint64", "name": "expiryRound" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "proposeAdminChange \u2014 create a governance change proposal.\n\nRouting:\n ADM_DISSOLVE_CUSTODIAN \u2014 the proposing group must be the custodian group\n itself. Admins cannot force-dissolve a custodian.\n All other change types \u2014 the proposing group must hold the relevant admin\n privilege (PRIV_GROUP or PRIV_POLICY via _assertPrivilegeForChange).\n\nPayload-level correctness (e.g. guard existence, target group type) is\nintentionally deferred to execution time in _applyAdminChange. This saves\n~700 bytes of compiled binary by not duplicating the check logic at proposal\ntime, at the cost of wasted box storage if an invalid proposal passes approval.\n\nThe cooldown cap is asserted here (before the box is written) so that a\nbad cooldown value cannot be stored and later cause an arithmetic overflow\nin _executeProposalInternal even if the group approves the proposal.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "approveProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "expectedPayloadVersion" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "approveProposal \u2014 add the caller's approval to an open proposal.\n\nexpectedPayloadVersion must match the proposal's live payloadVersion; this\nbinds the approval to the exact payload content the signer reviewed and\nprevents a bait-and-switch attack where the proposer appends a different\nchunk after other signers have already approved.\n\nAlso asserts that the group's membershipEpoch hasn't changed since proposal\ncreation \u2014 removing a compromised member invalidates all pending approvals.", "events": [ { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "executeProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "executeProposal \u2014 execute a READY proposal (threshold met, not expired).", "events": [ { "name": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "cancelProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "cancelProposal \u2014 cancel an open proposal. Either the original proposer\nor any current group member may cancel.", "events": [ { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "pruneProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "pruneProposal \u2014 delete terminal proposal boxes to reclaim MBR.\nOnly callable on EXECUTED or CANCELLED proposals after their expiryRound.\nRemoves the proposal box, all payload chunk boxes, and the admin-change box.", "events": [], "recommendations": {} }, { "name": "getConfig", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,string)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getSignerGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "SignerGroup" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,uint64,uint64)", "struct": "Proposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTransactionGroup", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,byte[])[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,string,address)", "struct": "Member" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "isMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getActivePrivGroupCount", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "getActivePrivGroupCount \u2014 read the M-01 lockout counter (used by off-chain tooling).", "events": [], "recommendations": {} }, { "name": "isRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64)", "struct": "RekeyedAddress" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasAssetGuard", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getAssetGuard", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,uint64)", "struct": "AssetGuard" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdA==" }, "nextGroupId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmdpZA==" }, "nextProposalId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnBpZA==" }, "groupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2NudA==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVy" }, "activePrivGroupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXBnYw==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "groups": { "keyType": "uint64", "valueType": "SignerGroup", "prefix": "Zw==" }, "members": { "keyType": "Object78E87395", "valueType": "Member", "prefix": "bQ==" }, "proposals": { "keyType": "uint64", "valueType": "Proposal", "prefix": "cA==" }, "approvals": { "keyType": "Object9F556C53", "valueType": "Approval", "prefix": "YQ==" }, "transactionGroups": { "keyType": "uint64", "valueType": "(uint64,byte[])[]", "prefix": "dHhn" }, "adminPayloads": { "keyType": "uint64", "valueType": "AdminChange", "prefix": "ZHA=" }, "rekeyedAddresses": { "keyType": "address", "valueType": "RekeyedAddress", "prefix": "cg==" }, "assetGuards": { "keyType": "ObjectAE8BF7D4", "valueType": "AssetGuard", "prefix": "YWc=" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1649, 1855, 2126, 2268, 2458, 2584, 2865, 2909, 2968, 3024, 3272, 3393, 3449, 3483, 3666, 4717, 5987, 6198, 6446, 6568, 6726 ], "errorMessage": "Box must have value" }, { "pc": [ 136 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 4531 ], "errorMessage": "acfg not allowed" }, { "pc": [ 1365 ], "errorMessage": "address required" }, { "pc": [ 6078 ], "errorMessage": "already a member" }, { "pc": [ 2340 ], "errorMessage": "already approved" }, { "pc": [ 522, 912, 1359, 1434 ], "errorMessage": "already bootstrapped" }, { "pc": [ 1376, 6275 ], "errorMessage": "already registered" }, { "pc": [ 4437 ], "errorMessage": "app args total length exceeded" }, { "pc": [ 4277 ], "errorMessage": "app update not supported" }, { "pc": [ 4260 ], "errorMessage": "appId required" }, { "pc": [ 4254 ], "errorMessage": "appl not allowed" }, { "pc": [ 4025 ], "errorMessage": "asset close target required" }, { "pc": [ 4007 ], "errorMessage": "asset receiver required" }, { "pc": [ 3999 ], "errorMessage": "axfer not allowed" }, { "pc": [ 529 ], "errorMessage": "bootstrapGroup already used; cannot mix bootstrap paths" }, { "pc": [ 2171 ], "errorMessage": "can only dissolve own custodian group" }, { "pc": [ 6023 ], "errorMessage": "can only dissolve own group" }, { "pc": [ 1915 ], "errorMessage": "cannot modify payload after independent approval" }, { "pc": [ 6576 ], "errorMessage": "cannot set privileges on custodian groups" }, { "pc": [ 513, 520, 527, 536, 711, 903, 910, 998, 1262, 1286, 1350, 1357, 1425, 1432, 1438, 1602, 1815, 2736, 2741, 2746, 2751, 2756, 2761, 3180, 3547, 6640, 6693, 6798, 6853, 6912, 6920, 7195, 7216, 7777, 7814, 7852, 8094, 8154 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 3797 ], "errorMessage": "close target required" }, { "pc": [ 2142 ], "errorMessage": "cooldown cap" }, { "pc": [ 970 ], "errorMessage": "cooldown too large" }, { "pc": [ 985 ], "errorMessage": "custodian groups cannot have admin privileges" }, { "pc": [ 4649 ], "errorMessage": "custodian groups cannot rekey" }, { "pc": [ 7662 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 1191 ], "errorMessage": "duplicate member" }, { "pc": [ 1837 ], "errorMessage": "empty payload" }, { "pc": [ 1593 ], "errorMessage": "empty tx group" }, { "pc": [ 7449 ], "errorMessage": "exceeds guard allocation" }, { "pc": [ 7204 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 7717 ], "errorMessage": "group admin required" }, { "pc": [ 3584 ], "errorMessage": "group cooldown not elapsed" }, { "pc": [ 1621, 2132, 3490 ], "errorMessage": "group disabled" }, { "pc": [ 2355, 3534 ], "errorMessage": "group membership changed since proposal creation" }, { "pc": [ 3413 ], "errorMessage": "group not found" }, { "pc": [ 7113 ], "errorMessage": "guard not found" }, { "pc": [ 1151, 3738, 3966, 4219, 4398, 4497, 4604, 4790, 4937, 5080, 5203, 5274, 5408, 5559, 5838 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 948 ], "errorMessage": "invalid actions" }, { "pc": [ 824, 1495, 1739 ], "errorMessage": "invalid array encoding" }, { "pc": [ 389, 496, 783, 794, 852, 1333, 1465, 1522, 1657, 1709, 1766, 2051, 2073, 3721, 3949, 4202, 4298, 4317, 4331, 4345, 4480, 4587, 4773, 4920, 5063, 5186, 5252, 5303, 5346, 5391, 5542, 5821, 7492 ], "errorMessage": "invalid array length header" }, { "pc": [ 1562 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 396, 503, 1340 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 873 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1543, 1787 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1327, 2992, 3048, 3111, 3196, 3245 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 881, 1457, 1551, 1574, 1691, 1701, 1795, 2025, 2086, 2095, 2220, 2229, 2238, 2376, 2385, 2416, 2425, 2542, 2551, 2719, 2836, 2845, 2879, 2888, 2923, 2932, 2941, 2982, 3000, 3038, 3056, 3101, 3119, 3164, 3204, 3253, 3286, 3295, 3304, 3350, 3359, 3368 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2078 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 788 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::GroupSeed" }, { "pc": [ 4273 ], "errorMessage": "invalid onCompletion" }, { "pc": [ 959 ], "errorMessage": "invalid privileges" }, { "pc": [ 1834 ], "errorMessage": "invalid slot" }, { "pc": [ 772 ], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1518, 1762 ], "errorMessage": "invalid tail pointer at index 1 of (uint64,(len+uint8[]))" }, { "pc": [ 2043 ], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 848 ], "errorMessage": "invalid tail pointer at index 2 of (uint8[32],uint64,(len+utf8[]))" }, { "pc": [ 2065 ], "errorMessage": "invalid tail pointer at index 5 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1503, 1747 ], "errorMessage": "invalid tail pointer for (len+(uint64,(len+uint8[]))[])" }, { "pc": [ 832 ], "errorMessage": "invalid tail pointer for (len+(uint8[32],uint64,(len+utf8[]))[])" }, { "pc": [ 935 ], "errorMessage": "invalid threshold" }, { "pc": [ 767, 843, 1513, 1757, 2037, 2060 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 4460 ], "errorMessage": "keyreg not allowed" }, { "pc": [ 1175 ], "errorMessage": "member required" }, { "pc": [ 915 ], "errorMessage": "members required" }, { "pc": [ 4561 ], "errorMessage": "metadataHash must be 0 or 32 bytes" }, { "pc": [ 7609 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 6594, 6773 ], "errorMessage": "must keep at least one active group admin" }, { "pc": [ 1439 ], "errorMessage": "need an active group admin" }, { "pc": [ 7861 ], "errorMessage": "new group starts with one member" }, { "pc": [ 7439 ], "errorMessage": "no guard for custodian+asset" }, { "pc": [ 2326, 3424 ], "errorMessage": "not a group member" }, { "pc": [ 6191 ], "errorMessage": "not a member" }, { "pc": [ 1862 ], "errorMessage": "not a tx group" }, { "pc": [ 2287 ], "errorMessage": "not approvable" }, { "pc": [ 2504 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 7198 ], "errorMessage": "not bootstrapped" }, { "pc": [ 2477 ], "errorMessage": "not cancellable" }, { "pc": [ 3455 ], "errorMessage": "not ready to execute" }, { "pc": [ 6356 ], "errorMessage": "not registered" }, { "pc": [ 2617 ], "errorMessage": "not yet expired" }, { "pc": [ 515, 905, 1352, 1427 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 2163 ], "errorMessage": "only custodian groups can propose self-dissolution" }, { "pc": [ 1908 ], "errorMessage": "only proposer can append" }, { "pc": [ 3771 ], "errorMessage": "pay not allowed" }, { "pc": [ 2307 ], "errorMessage": "payload changed since review" }, { "pc": [ 7706 ], "errorMessage": "policy admin required" }, { "pc": [ 1893, 2299, 3464 ], "errorMessage": "proposal expired" }, { "pc": [ 1881 ], "errorMessage": "proposal not pending" }, { "pc": [ 2605 ], "errorMessage": "proposal not terminal" }, { "pc": [ 6013 ], "errorMessage": "proposing group must be custodian" }, { "pc": [ 3779 ], "errorMessage": "receiver required" }, { "pc": [ 4636 ], "errorMessage": "rekey not allowed" }, { "pc": [ 4643 ], "errorMessage": "rekey requires group admin privilege" }, { "pc": [ 4656 ], "errorMessage": "rekey target required" }, { "pc": [ 6905 ], "errorMessage": "remove all guards before dissolving" }, { "pc": [ 1604, 1817, 3549 ], "errorMessage": "safe paused" }, { "pc": [ 4264 ], "errorMessage": "self-call not allowed" }, { "pc": [ 6977, 7096 ], "errorMessage": "target must be a custodian group" }, { "pc": [ 6407 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 3520 ], "errorMessage": "threshold not met" }, { "pc": [ 4357 ], "errorMessage": "too many accounts" }, { "pc": [ 4351 ], "errorMessage": "too many app args" }, { "pc": [ 4362 ], "errorMessage": "too many foreign apps" }, { "pc": [ 4366 ], "errorMessage": "too many foreign assets" }, { "pc": [ 4373 ], "errorMessage": "too many references" }, { "pc": [ 1597 ], "errorMessage": "too many txs" }, { "pc": [ 1957 ], "errorMessage": "too many txs across chunks" }, { "pc": [ 4578 ], "errorMessage": "unknown tx type" }, { "pc": [ 6217 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAxMzAgMTY4IDEwMDAwMDAwCiAgICBieXRlY2Jsb2NrICJnIiAiYXBnYyIgIiIgMHgxNTFmN2M3NSAiZ2NudCIgIm0iICJwIiAiYm9vdCIgIm5naWQiICJwYXVzZWQiICJ0eGciICJjcmVhdG9yIiAiciIgImFnIiAibnBpZCIgMHgwMDEyIDB4ZDA3MDUwN2EgMHgwMCAweDdjNjA1OWU2IDB4MDAyMiAweDBjZDczNTdjIDB4MDAyYSAiZHAiICJhIiAweDA2ODEwMSAibmFtZSIgInZlciIgMHgwMDhhIDB4MDAwYSAweGRlZGQwM2E4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDAyCiAgICAvLyBleHBvcnQgY2xhc3MgQWxnb1NhZmUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjcKICAgIHB1c2hieXRlc3MgMHg5MTRiYTYzMyAweDE0YThmZmJhIDB4ZDU1MTU2ODIgMHgwYjI0M2NhNyAweGFjM2E5YTMyIDB4NDQyNDQ1ZjcgMHgzZjliOGEzMCAweGY0YjQ4NmVlIDB4ZmI3MDg4ZTggMHg3ZjUxZmMyOCAweGRjYWRmZjk2IDB4YjZiN2FlYWQgMHgxOTlkMjE0YSAweDdmZDcyZjUxIDB4ZjljYjRhMzcgMHg2NWFhYTBlZCAweGNiZDczMjQyIDB4NTAzNDE2MTcgMHhmNGZhNTQ0YyAweGIyODU3MmNhIDB4ZDM3ZGZiMjAgMHhiOGU2Yzg5NiAweGY5MDQ4MDM1IC8vIG1ldGhvZCAiYm9vdHN0cmFwKHN0cmluZyl2b2lkIiwgbWV0aG9kICJib290c3RyYXBHcm91cCgoc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLChhZGRyZXNzLHVpbnQ2NCxzdHJpbmcpW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcmVzcyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZmluYWxpemVCb290c3RyYXAoKXZvaWQiLCBtZXRob2QgInByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKHVpbnQ2NCwodWludDY0LGJ5dGVbXSlbXSx1aW50NjQsYm9vbCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCh1aW50NjQsdWludDY0LCh1aW50NjQsYnl0ZVtdKVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJwcm9wb3NlQWRtaW5DaGFuZ2UodWludDY0LCh1aW50NjQsdWludDY0LHN0cmluZyxhZGRyZXNzLHVpbnQ2NCxzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhcHByb3ZlUHJvcG9zYWwodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZXhlY3V0ZVByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJwcnVuZVByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2V0Q29uZmlnKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxzdHJpbmcpIiwgbWV0aG9kICJnZXRTaWduZXJHcm91cCh1aW50NjQsdWludDY0KShzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Hcm91cCh1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LGJ5dGVbXSlbXSIsIG1ldGhvZCAiZ2V0TWVtYmVyKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkodWludDY0LHN0cmluZyxhZGRyZXNzKSIsIG1ldGhvZCAiaXNNZW1iZXIodWludDY0LGFkZHJlc3MsdWludDY0KWJvb2wiLCBtZXRob2QgImhhc0FwcHJvdmVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRBY3RpdmVQcml2R3JvdXBDb3VudCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJpc1Jla2V5ZWRBZGRyZXNzKGFkZHJlc3MsdWludDY0KWJvb2wiLCBtZXRob2QgImdldFJla2V5ZWRBZGRyZXNzKGFkZHJlc3MsdWludDY0KShzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaGFzQXNzZXRHdWFyZCh1aW50NjQsdWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRBc3NldEd1YXJkKHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGJvb3RzdHJhcCBib290c3RyYXBHcm91cCBib290c3RyYXBSZWtleWVkQWRkcmVzcyBmaW5hbGl6ZUJvb3RzdHJhcCBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCBwcm9wb3NlQWRtaW5DaGFuZ2UgYXBwcm92ZVByb3Bvc2FsIGV4ZWN1dGVQcm9wb3NhbCBjYW5jZWxQcm9wb3NhbCBwcnVuZVByb3Bvc2FsIGdldENvbmZpZyBnZXRTaWduZXJHcm91cCBnZXRQcm9wb3NhbCBnZXRUcmFuc2FjdGlvbkdyb3VwIGdldE1lbWJlciBpc01lbWJlciBoYXNBcHByb3ZlZCBnZXRBY3RpdmVQcml2R3JvdXBDb3VudCBpc1Jla2V5ZWRBZGRyZXNzIGdldFJla2V5ZWRBZGRyZXNzIGhhc0Fzc2V0R3VhcmQgZ2V0QXNzZXRHdWFyZAogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29TYWZlIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MTE1NzU2ZGIgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBlcnIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDYKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDQKICAgIC8vIG5hbWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAnbmFtZScgfSkKICAgIGJ5dGVjIDI1IC8vICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1OAogICAgLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyB0aGlzLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA3IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MAogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYxCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyAxNCAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNCAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgOSAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAyNiAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gQ09OVFJBQ1RfVkVSU0lPTgogICAgcHVzaGJ5dGVzICJCSUFURUMtQUxHTy1TQUZFLXYyLjAuMCIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NwogICAgLy8gZW1pdDxTYWZlQ3JlYXRlZD4oeyBuYW1lLCBjcmVhdG9yOiBUeG4uc2VuZGVyIH0pCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjIDE5IC8vIDB4MDAyMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZTI5YzhiNDcgLy8gbWV0aG9kICJTYWZlQ3JlYXRlZChzdHJpbmcsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NQogICAgLy8gcHVibGljIGJvb3RzdHJhcChncm91cE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNQogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEwCiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzgKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwQ291bnQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2Jvb3RzdHJhcEdyb3VwIGFscmVhZHkgdXNlZDsgY2Fubm90IG1peCBib290c3RyYXAgcGF0aHMnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cENvdW50LnZhbHVlID09PSBVaW50NjQoMCksICdib290c3RyYXBHcm91cCBhbHJlYWR5IHVzZWQ7IGNhbm5vdCBtaXggYm9vdHN0cmFwIHBhdGhzJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwR3JvdXAgYWxyZWFkeSB1c2VkOyBjYW5ub3QgbWl4IGJvb3RzdHJhcCBwYXRocwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MAogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MQogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgzLTUwMgogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBQUklWX0FMTCwKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IEFDVF9BTEwsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgLy8gICBkYWlseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogVWludDY0KDApLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gICBncm91cFR5cGU6IEdUX1NUQU5EQVJELAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODMtNTAyCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZTogR1RfU1RBTkRBUkQsCiAgICAvLyAgIGd1YXJkQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODMtNTAyCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZTogR1RfU1RBTkRBUkQsCiAgICAvLyAgIGd1YXJkQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDA4YTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwNzAwMDAwMDAwMDAwMDAwM2YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwMwogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDUKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IFVpbnQ2NCgxKSwgbGFiZWw6ICdjcmVhdG9yJywgYWRkcjogVHhuLnNlbmRlciB9CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxMDAyYQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDA3NjM3MjY1NjE3NDZmNzIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGRpZyAxCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA1IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTA2CiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDgKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA4IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwOAogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDkKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTA5CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNCAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDkKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNyAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjUKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTEzCiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IGdyb3VwTmFtZSwgdGhyZXNob2xkOiBVaW50NjQoMSkgfSkKICAgIGR1cAogICAgYnl0ZWMgMTUgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlYyAyMCAvLyBtZXRob2QgIkdyb3VwQ3JlYXRlZCh1aW50NjQsc3RyaW5nLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogVHhuLnNlbmRlciwgYWNjb3VudFR5cGU6IFVpbnQ2NCgxKSB9KQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc1CiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwKGdyb3VwTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5ib290c3RyYXBHcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcEdyb3VwOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTIzCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA2NiAvLyA2NgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6R3JvdXBTZWVkCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpib290c3RyYXBHcm91cF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTIzCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisodWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSkpW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMiBvZiAodWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0NCAvLyA0NAogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGJvb3RzdHJhcEdyb3VwX2Zvcl9oZWFkZXJAMQoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTIzCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6TWVtYmVyU2VlZD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyNAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTQKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNQogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyNwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEwCiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIGFzc2VydChtZW1iZXJDb3VudCA+PSBVaW50NjQoMSksICdtZW1iZXJzIHJlcXVpcmVkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gbWVtYmVycyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHNlZWQudGhyZXNob2xkID49IFVpbnQ2NCgxKSAmJiBzZWVkLnRocmVzaG9sZCA8PSBtZW1iZXJDb3VudCwgJ2ludmFsaWQgdGhyZXNob2xkJykKICAgIGRpZyA2CiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMwogICAgYnogYm9vdHN0cmFwR3JvdXBfYm9vbF9mYWxzZUAxMAogICAgZGlnIDExCiAgICBkaWcgNQogICAgPD0KICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMSAvLyAxCgpib290c3RyYXBHcm91cF9ib29sX21lcmdlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gYXNzZXJ0KHNlZWQudGhyZXNob2xkID49IFVpbnQ2NCgxKSAmJiBzZWVkLnRocmVzaG9sZCA8PSBtZW1iZXJDb3VudCwgJ2ludmFsaWQgdGhyZXNob2xkJykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gYXNzZXJ0KHNlZWQuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBkaWcgNgogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBwdXNoaW50IDYzIC8vIDYzCiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgYWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMwogICAgLy8gYXNzZXJ0KHNlZWQuYWRtaW5Qcml2aWxlZ2VzIDw9IFBSSVZfQUxMLCAnaW52YWxpZCBwcml2aWxlZ2VzJykKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMgogICAgcHVzaGludCA3IC8vIDcKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBwcml2aWxlZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBhc3NlcnQoc2VlZC5jb29sZG93blJvdW5kcyA8PSBNQVhfQ09PTERPV05fUk9VTkRTLCAnY29vbGRvd24gdG9vIGxhcmdlJykKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMQogICAgaW50YyA2IC8vIDEwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIGNvb2xkb3duIHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzNQogICAgLy8gaWYgKHNlZWQuZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4pIHsKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBib290c3RyYXBHcm91cF9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM3CiAgICAvLyBhc3NlcnQoc2VlZC5hZG1pblByaXZpbGVnZXMgPT09IFVpbnQ2NCgwKSwgJ2N1c3RvZGlhbiBncm91cHMgY2Fubm90IGhhdmUgYWRtaW4gcHJpdmlsZWdlcycpCiAgICBkaWcgOQogICAgIQogICAgYXNzZXJ0IC8vIGN1c3RvZGlhbiBncm91cHMgY2Fubm90IGhhdmUgYWRtaW4gcHJpdmlsZWdlcwoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDAKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA4IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MQogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDE3CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQ0CiAgICAvLyBuYW1lOiBzZWVkLm5hbWUsCiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDkKICAgIC8vIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICBkaWcgOQogICAgZHVwCiAgICBleHRyYWN0IDI2IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTAKICAgIC8vIGRhaWx5TGltaXQ6IHNlZWQuZGFpbHlMaW1pdCwKICAgIGRpZyAxCiAgICBleHRyYWN0IDM0IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTMKICAgIC8vIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgNDIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0My01NjIKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IHNlZWQubmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogc2VlZC5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBzZWVkLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IHNlZWQubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBzZWVkLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gICBncm91cFR5cGU6IHNlZWQuZ3JvdXBUeXBlLAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNQogICAgYnVyeSAyNAogICAgZGlnIDE3CiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMjQKICAgIGJ5dGVjIDI3IC8vIDB4MDA4YQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDE2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTEKICAgIC8vIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQzLTU2MgogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogc2VlZC5uYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IHNlZWQudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBzZWVkLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IHNlZWQuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICAvLyAgIGRhaWx5TGltaXQ6IHNlZWQuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IHNlZWQuY29vbGRvd25Sb3VuZHMsCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZTogc2VlZC5ncm91cFR5cGUsCiAgICAvLyAgIGd1YXJkQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTkKICAgIC8vIGFjdGl2ZTogVWludDY0KDEpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDMtNTYyCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBzZWVkLm5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogc2VlZC50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IHNlZWQuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogc2VlZC5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBzZWVkLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogc2VlZC5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBzZWVkLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogc2VlZC5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vICAgZ3JvdXBUeXBlOiBzZWVkLmdyb3VwVHlwZSwKICAgIC8vICAgZ3VhcmRDb3VudDogVWludDY0KDApLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYzCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBtZW1iZXJDb3VudDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpib290c3RyYXBHcm91cF93aGlsZV90b3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbWVtYmVyQ291bnQ7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBkaWcgMTIKICAgIGRpZyA1CiAgICA8CiAgICBieiBib290c3RyYXBHcm91cF9hZnRlcl93aGlsZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2Ni01NjcKICAgIC8vIGNvbnN0IHNlZWRNZW1iZXIgPSBjbG9uZShtZW1iZXJzW2ldKQogICAgLy8gYXNzZXJ0KHNlZWRNZW1iZXIuYWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGRpZyAxMgogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIGRpZyA3CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY3CiAgICAvLyBhc3NlcnQoc2VlZE1lbWJlci5hZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdtZW1iZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gbWVtYmVyIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogc2VlZE1lbWJlci5hZGRyIH0pLmV4aXN0cywgJ2R1cGxpY2F0ZSBtZW1iZXInKQogICAgZGlnIDE3CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNSAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjgKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkuZXhpc3RzLCAnZHVwbGljYXRlIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGR1cGxpY2F0ZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjkKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IHNlZWRNZW1iZXIuYWNjb3VudFR5cGUsIGxhYmVsOiBzZWVkTWVtYmVyLmxhYmVsLCBhZGRyOiBzZWVkTWVtYmVyLmFkZHIgfQogICAgZGlnIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgNQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgNAogICAgZXh0cmFjdCAzMiA4CiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBieXRlYyAyMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTcxCiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBzZWVkTWVtYmVyLmFkZHIsIGFjY291bnRUeXBlOiBzZWVkTWVtYmVyLmFjY291bnRUeXBlIH0pCiAgICBjb25jYXQKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIGJvb3RzdHJhcEdyb3VwX3doaWxlX3RvcEAxNAoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfd2hpbGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc0CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBkaWcgMTMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzQKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc1CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA0IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3NQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc1CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc2CiAgICAvLyBpZiAoc2VlZC5ncm91cFR5cGUgIT09IEdUX0NVU1RPRElBTiAmJiAoc2VlZC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApKSB7CiAgICBkaWcgNwogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBib290c3RyYXBHcm91cF9hZnRlcl9pZl9lbHNlQDE5CiAgICBkaWcgOQogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzcKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc3CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzcKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODAKICAgIC8vIGVtaXQ8R3JvdXBDcmVhdGVkPih7IGdyb3VwSWQ6IGdpZCwgbmFtZTogc2VlZC5uYW1lLCB0aHJlc2hvbGQ6IHNlZWQudGhyZXNob2xkIH0pCiAgICBkaWcgMTUKICAgIGR1cAogICAgYnl0ZWMgMTUgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIGRpZyAxOAogICAgY29uY2F0CiAgICBkaWcgMTkKICAgIGNvbmNhdAogICAgYnl0ZWMgMjAgLy8gbWV0aG9kICJHcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjMKICAgIC8vIHB1YmxpYyBib290c3RyYXBHcm91cChzZWVkOiBHcm91cFNlZWQsIG1lbWJlcnM6IE1lbWJlclNlZWRbXSwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpib290c3RyYXBHcm91cF9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYm9vdHN0cmFwR3JvdXBfYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYm9vdHN0cmFwUmVrZXllZEFkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXBSZWtleWVkQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODgKICAgIC8vIHB1YmxpYyBib290c3RyYXBSZWtleWVkQWRkcmVzcyhhZGRyOiBBY2NvdW50LCBsYWJlbDogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4OQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgMTEgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTg5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTAKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNyAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTAKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gYXNzZXJ0KGFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2FkZHJlc3MgcmVxdWlyZWQnKQogICAgZGlnIDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhZGRyZXNzIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ0CiAgICAvLyByZWtleWVkQWRkcmVzc2VzID0gQm94TWFwPEFjY291bnQsIFJla2V5ZWRBZGRyZXNzPih7IGtleVByZWZpeDogJ3InIH0pCiAgICBieXRlYyAxMiAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTIKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLmV4aXN0cywgJ2FscmVhZHkgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5MwogICAgLy8gY29uc3QgZW50cnk6IFJla2V5ZWRBZGRyZXNzID0geyBsYWJlbCwgYWRkZWRSb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAyOCAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5NAogICAgLy8gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLnZhbHVlID0gY2xvbmUoZW50cnkpCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTUKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NBZGRlZD4oeyBhZGRyLCBsYWJlbCB9KQogICAgc3dhcAogICAgYnl0ZWMgMTkgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjkgLy8gbWV0aG9kICJSZWtleWVkQWRkcmVzc0FkZGVkKGFkZHJlc3Msc3RyaW5nKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTg4CiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcjogQWNjb3VudCwgbGFiZWw6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZmluYWxpemVCb290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZUJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNQogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDExIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwNAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA1CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEwCiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA1CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFzc2VydCh0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID49IFVpbnQ2NCgxKSwgJ25lZWQgYW4gYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFzc2VydCh0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID49IFVpbnQ2NCgxKSwgJ25lZWQgYW4gYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhc3NlcnQgLy8gbmVlZCBhbiBhY3RpdmUgZ3JvdXAgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNyAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIHB1YmxpYyBmaW5hbGl6ZUJvb3RzdHJhcCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI0LTYzMAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI0LTYzMAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsKGxlbit1aW50OFtdKSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDY0LChsZW4rdWludDhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMQoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI0LTYzMAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMwogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpTYWZlVHhuPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgYnVyeSA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzIKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGRpZyAxMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNAogICAgLy8gYXNzZXJ0KHBheWxvYWQubGVuZ3RoID49IFVpbnQ2NCgxKSwgJ2VtcHR5IHR4IGdyb3VwJykKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBlbXB0eSB0eCBncm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNQogICAgLy8gYXNzZXJ0KHBheWxvYWQubGVuZ3RoIDw9IE1BWF9HUk9VUF9UWE5TLCAndG9vIG1hbnkgdHhzJykKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgdHhzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM2CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgOSAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNhZmUgcGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM3CiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIoZ3JvdXBJZCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzgtNjM5CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGJ0b2kKICAgIGFzc2VydCAvLyBncm91cCBkaXNhYmxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0MAogICAgLy8gY29uc3QgcGlkID0gdGhpcy5fbmV3UHJvcG9zYWwoZ3JvdXBJZCwgUFRfVFJBTlNBQ1RJT05fR1JPVVAsIGV4cGlyeVJvdW5kKQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfbmV3UHJvcG9zYWwKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyB0aGlzLl9zdG9yZVBheWxvYWRHcm91cChwaWQsIFVpbnQ2NCgxKSwgcGF5bG9hZCkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9zdG9yZVBheWxvYWRHcm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0MgogICAgLy8gY29uc3QgcCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUpCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzMKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBjb25zdCBwID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIHAubnVtUGF5bG9hZHMgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0NAogICAgLy8gcC50b3RhbFR4bnMgPSBwYXlsb2FkLmxlbmd0aAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaXRvYgogICAgcmVwbGFjZTIgMTA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ1CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocCkKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDYKICAgIC8vIGlmIChleGVjdXRlKSB7CiAgICBkaWcgOQogICAgYnogcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyB0aGlzLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwaWQpCiAgICBkaWcgNwogICAgY2FsbHN1YiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjQtNjMwCiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2Mi02NjcKICAgIC8vIHB1YmxpYyBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCgKICAgIC8vICAgcHJvcG9zYWxJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYyLTY2NwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCwobGVuK3VpbnQ4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50NjQsKGxlbit1aW50OFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjItNjY3CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2OAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzEKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2FmZSBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIGFzc2VydChwYXlsb2FkSW5kZXggPj0gVWludDY0KDIpICYmIHBheWxvYWRJbmRleCA8PSBVaW50NjQoNiksICdpbnZhbGlkIHNsb3QnKQogICAgZGlnIDYKICAgIGludGNfMyAvLyAyCiAgICA+PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgZGlnIDYKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA8PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcyCiAgICAvLyBhc3NlcnQocGF5bG9hZEluZGV4ID49IFVpbnQ2NCgyKSAmJiBwYXlsb2FkSW5kZXggPD0gVWludDY0KDYpLCAnaW52YWxpZCBzbG90JykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHNsb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzMKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSBwYXlsb2FkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gZW1wdHkgcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3NAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyA4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMzCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc0CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3NQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCwgJ25vdCBhIHR4IGdyb3VwJykKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdCBhIHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfdHJ1ZUAxMwogICAgZGlnIDkKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxNAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIG5vdCBwZW5kaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHByb3Bvc2FsLmV4cGlyeVJvdW5kLCAncHJvcG9zYWwgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAxMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBwcm9wb3NhbCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIocHJvcG9zYWwuZ3JvdXBJZCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBwcm9wb3NhbC5wcm9wb3NlciwgJ29ubHkgcHJvcG9zZXIgY2FuIGFwcGVuZCcpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCA0OCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHByb3Bvc2VyIGNhbiBhcHBlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODAKICAgIC8vIGFzc2VydChwcm9wb3NhbC5hcHByb3ZhbHNDb3VudCA9PT0gVWludDY0KDEpLCAnY2Fubm90IG1vZGlmeSBwYXlsb2FkIGFmdGVyIGluZGVwZW5kZW50IGFwcHJvdmFsJykKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbm5vdCBtb2RpZnkgcGF5bG9hZCBhZnRlciBpbmRlcGVuZGVudCBhcHByb3ZhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4MwogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4CiAgICBkaWcgOQogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGRpZyA4CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg0CiAgICAvLyBsZXQgbmV3VG90YWw6IHVpbnQ2NCA9IHByb3Bvc2FsLnRvdGFsVHhucwogICAgc3dhcAogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4Ni02ODcKICAgIC8vIGNvbnN0IGV4aXN0aW5nID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gbmV3VG90YWwgPSBuZXdUb3RhbCAtIGV4aXN0aW5nLmxlbmd0aAogICAgZGlnIDEzCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg3CiAgICAvLyBuZXdUb3RhbCA9IG5ld1RvdGFsIC0gZXhpc3RpbmcubGVuZ3RoCiAgICAtCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4OQogICAgLy8gbmV3VG90YWwgPSBuZXdUb3RhbCArIHBheWxvYWQubGVuZ3RoCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gYXNzZXJ0KG5ld1RvdGFsIDw9IE1BWF9HUk9VUF9UWE5TLCAndG9vIG1hbnkgdHhzIGFjcm9zcyBjaHVua3MnKQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IHR4cyBhY3Jvc3MgY2h1bmtzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjkyCiAgICAvLyB0aGlzLl9zdG9yZVBheWxvYWRHcm91cChwcm9wb3NhbElkLCBwYXlsb2FkSW5kZXgsIHBheWxvYWQpCiAgICBkaWcgOQogICAgZGlnIDgKICAgIGR1cAogICAgY292ZXIgMwogICAgZGlnIDkKICAgIGNhbGxzdWIgX3N0b3JlUGF5bG9hZEdyb3VwCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTUKICAgIC8vIHVwZGF0ZWQudG90YWxUeG5zID0gbmV3VG90YWwKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDEwNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5NgogICAgLy8gdXBkYXRlZC5wYXlsb2FkVmVyc2lvbiA9IHVwZGF0ZWQucGF5bG9hZFZlcnNpb24gKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCA5NiAvLyA5NgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA5NgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5NwogICAgLy8gaWYgKHBheWxvYWRJbmRleCA+IHByb3Bvc2FsLm51bVBheWxvYWRzKSB7CiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5OAogICAgLy8gdXBkYXRlZC5udW1QYXlsb2FkcyA9IHBheWxvYWRJbmRleAogICAgZGlnIDgKICAgIHJlcGxhY2UyIDgwCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgZGlnIDE0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYyLTY2NwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDE1CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJvcG9zZUFkbWluQ2hhbmdlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvcG9zZUFkbWluQ2hhbmdlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyMS03MjYKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgY2hhbmdlOiBBZG1pbkNoYW5nZSwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTMyIC8vIDEzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAyIG9mICh1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSx1aW50OFszMl0sdWludDY0LChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTM0IC8vIDEzNAogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDUgb2YgKHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFkbWluQ2hhbmdlCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjgKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzAKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMxCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMxCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMxLTczMgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMyCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzYKICAgIC8vIGFzc2VydChjaGFuZ2UuY29vbGRvd25Sb3VuZHMgPD0gTUFYX0NPT0xET1dOX1JPVU5EUywgJ2Nvb2xkb3duIGNhcCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjIDYgLy8gMTAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gY29vbGRvd24gY2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM3CiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9ESVNTT0xWRV9DVVNUT0RJQU4pIHsKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzgKICAgIC8vIGFzc2VydChncm91cC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiwgJ29ubHkgY3VzdG9kaWFuIGdyb3VwcyBjYW4gcHJvcG9zZSBzZWxmLWRpc3NvbHV0aW9uJykKICAgIGRpZyA2CiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gb25seSBjdXN0b2RpYW4gZ3JvdXBzIGNhbiBwcm9wb3NlIHNlbGYtZGlzc29sdXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIGFzc2VydChjaGFuZ2UudGFyZ2V0R3JvdXBJZCA9PT0gZ3JvdXBJZCwgJ2NhbiBvbmx5IGRpc3NvbHZlIG93biBjdXN0b2RpYW4gZ3JvdXAnKQogICAgZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgZGlzc29sdmUgb3duIGN1c3RvZGlhbiBncm91cAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDQKICAgIC8vIGNvbnN0IHBpZCA9IHRoaXMuX25ld1Byb3Bvc2FsKGdyb3VwSWQsIFBUX0FETUlOLCBleHBpcnlSb3VuZCkKICAgIGRpZyAzCiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDMKICAgIGNhbGxzdWIgX25ld1Byb3Bvc2FsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ1CiAgICAvLyB0aGlzLmFkbWluUGF5bG9hZHMocGlkKS52YWx1ZSA9IGNsb25lKGNoYW5nZSkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGFkbWluUGF5bG9hZHMgPSBCb3hNYXA8dWludDY0LCBBZG1pbkNoYW5nZT4oeyBrZXlQcmVmaXg6ICdkcCcgfSkKICAgIGJ5dGVjIDIyIC8vICJkcCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDUKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2FkcyhwaWQpLnZhbHVlID0gY2xvbmUoY2hhbmdlKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyA0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzIxLTcyNgogICAgLy8gcHVibGljIHByb3Bvc2VBZG1pbkNoYW5nZSgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBjaGFuZ2U6IEFkbWluQ2hhbmdlLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDEKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBkaWcgNAogICAgZGlnIDYKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDYKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcHJvdmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcHJvdmVQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjQKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBleHBlY3RlZFBheWxvYWRWZXJzaW9uOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2NQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYXBwcm92ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2NgogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgphcHByb3ZlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2OAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjgKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgYXBwcm92YWJsZScpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJueiBhcHByb3ZlUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGFwcHJvdmVQcm9wb3NhbF9ib29sX2ZhbHNlQDYKCmFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2OQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBhcHByb3ZhYmxlJykKICAgIGFzc2VydCAvLyBub3QgYXBwcm92YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3MAogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBwcm9wb3NhbCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcxCiAgICAvLyBhc3NlcnQocHJvcG9zYWwucGF5bG9hZFZlcnNpb24gPT09IGV4cGVjdGVkUGF5bG9hZFZlcnNpb24sICdwYXlsb2FkIGNoYW5nZWQgc2luY2UgcmV2aWV3JykKICAgIGR1cAogICAgcHVzaGludCA5NiAvLyA5NgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHBheWxvYWQgY2hhbmdlZCBzaW5jZSByZXZpZXcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzIKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA1IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcyCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzczCiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGRpZyA3CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzQKICAgIC8vIGFwcHJvdmFscyA9IEJveE1hcDx7IHByb3Bvc2FsSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBBcHByb3ZhbD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgMjMgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzMKICAgIC8vIGFzc2VydCghdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ2FscmVhZHkgYXBwcm92ZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhcHByb3ZlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDg4IC8vIDg4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzQtNzc3CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgLy8gICAnZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzgKICAgIC8vIHRoaXMuX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQsIHByb3Bvc2FsKQogICAgZGlnIDMKICAgIHN3YXAKICAgIGNhbGxzdWIgX3JlY29yZEFwcHJvdmFsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjQKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBleHBlY3RlZFBheWxvYWRWZXJzaW9uOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcHJvdmVQcm9wb3NhbF9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHByb3ZlUHJvcG9zYWxfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5leGVjdXRlUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpleGVjdXRlUHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzgyCiAgICAvLyBwdWJsaWMgZXhlY3V0ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzgzCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzgyCiAgICAvLyBwdWJsaWMgZXhlY3V0ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuY2FuY2VsUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpjYW5jZWxQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTMKICAgIC8vIHB1YmxpYyBjYW5jZWxQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk1CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmNhbmNlbFByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTcKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzMKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NwogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5OAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBjYW5jZWxsYWJsZScpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJueiBjYW5jZWxQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogY2FuY2VsUHJvcG9zYWxfYm9vbF9mYWxzZUA2CgpjYW5jZWxQcm9wb3NhbF9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpjYW5jZWxQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk4CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGNhbmNlbGxhYmxlJykKICAgIGFzc2VydCAvLyBub3QgY2FuY2VsbGFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTkKICAgIC8vIGNvbnN0IGlzUHJvcG9zZXIgPSBUeG4uc2VuZGVyID09PSBwcm9wb3NhbC5wcm9wb3NlcgogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdCA0OCAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDAKICAgIC8vIGNvbnN0IGlzTWVtYmVyID0gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA4CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA1IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODAwCiAgICAvLyBjb25zdCBpc01lbWJlciA9IHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDEKICAgIC8vIGFzc2VydChpc1Byb3Bvc2VyIHx8IGlzTWVtYmVyLCAnbm90IGF1dGhvcmlzZWQgdG8gY2FuY2VsJykKICAgIHx8CiAgICBhc3NlcnQgLy8gbm90IGF1dGhvcmlzZWQgdG8gY2FuY2VsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODAzCiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfQ0FOQ0VMTEVECiAgICBwdXNoaW50IDQgLy8gNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwMy04MDQKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19DQU5DRUxMRUQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgNgogICAgaW50Y18yIC8vIDgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDUKICAgIC8vIGVtaXQ8UHJvcG9zYWxDYW5jZWxsZWQ+KHsgcHJvcG9zYWxJZCB9KQogICAgcHVzaGJ5dGVzIDB4YWUyYWJjMDYgLy8gbWV0aG9kICJQcm9wb3NhbENhbmNlbGxlZCh1aW50NjQpIgogICAgZGlnIDUKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkzCiAgICAvLyBwdWJsaWMgY2FuY2VsUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjYW5jZWxQcm9wb3NhbF9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjYW5jZWxQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLnBydW5lUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpwcnVuZVByb3Bvc2FsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODEzCiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxNAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMzCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE4CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfRVhFQ1VURUQgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQ0FOQ0VMTEVELCAncHJvcG9zYWwgbm90IHRlcm1pbmFsJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYm56IHBydW5lUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IHBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2CgpwcnVuZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnBydW5lUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxOAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0VYRUNVVEVEIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0NBTkNFTExFRCwgJ3Byb3Bvc2FsIG5vdCB0ZXJtaW5hbCcpCiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgbm90IHRlcm1pbmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE5CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID4gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdub3QgeWV0IGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgYXNzZXJ0IC8vIG5vdCB5ZXQgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMAogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKHByb3Bvc2FsLmdyb3VwSWQpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIyCiAgICAvLyBpZiAocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQKSB7CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBwcnVuZVByb3Bvc2FsX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMwogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDQKCnBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIzCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IHByb3Bvc2FsLm51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgPj0KICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcAogICAgZGlnIDEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBkaWcgNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNQogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI1CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjYKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5kZWxldGUoKQogICAgZGlnIDcKICAgIGJveF9kZWwKICAgIHBvcAoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMwogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIHBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDkKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLmRlbGV0ZSgpCiAgICBkaWcgOAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODEzCiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnBydW5lUHJvcG9zYWxfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMjIgLy8gImRwIgogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjkKICAgIC8vIH0gZWxzZSBpZiAodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzAKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS5kZWxldGUoKQogICAgZGlnIDYKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKCnBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldENvbmZpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldENvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQxCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRDb25maWdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldENvbmZpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ1CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICduYW1lJyB9KQogICAgYnl0ZWMgMjUgLy8gIm5hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ1CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0NgogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ2CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDcKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0OAogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgMTQgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ4CiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ5CiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUwCiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAyNiAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDQtODUxCiAgICAvLyByZXR1cm4gWwogICAgLy8gICB0aGlzLm5hbWUudmFsdWUsCiAgICAvLyAgIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXVzZWQudmFsdWUsCiAgICAvLyAgIHRoaXMudmVyc2lvbi52YWx1ZSwKICAgIC8vIF0KICAgIGRpZyA1CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICsKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAyNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFNpZ25lckdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U2lnbmVyR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1NgogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0U2lnbmVyR3JvdXBfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFNpZ25lckdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTkKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1OQogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0UHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY0CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjUKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0UHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2NwogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzMKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY3CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRUcmFuc2FjdGlvbkdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VHJhbnNhY3Rpb25Hcm91cDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODcyCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MwogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzUKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTAgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3NQogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMocHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHBheWxvYWRJbmRleCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRNZW1iZXJbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRNZW1iZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0TWVtYmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MwogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkudmFsdWUpCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMgogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDUgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODMKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaXNNZW1iZXJbcm91dGluZ10oKSAtPiB2b2lkOgppc01lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg4CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBpc01lbWJlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODkKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaXNNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MQogICAgLy8gcmV0dXJuIHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkuZXhpc3RzCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMgogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDUgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTEKICAgIC8vIHJldHVybiB0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaGFzQXBwcm92ZWRbcm91dGluZ10oKSAtPiB2b2lkOgpoYXNBcHByb3ZlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk2CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBoYXNBcHByb3ZlZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTcKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaGFzQXBwcm92ZWRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5OQogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDIzIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk5CiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBY3RpdmVQcml2R3JvdXBDb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA1CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRBY3RpdmVQcml2R3JvdXBDb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDYKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwOAogICAgLy8gcmV0dXJuIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDgKICAgIC8vIHJldHVybiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5pc1Jla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNSZWtleWVkQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTEzCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBpc1Jla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNAogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgppc1Jla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDEyIC8vICJyIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNgogICAgLy8gcmV0dXJuIHRoaXMucmVrZXllZEFkZHJlc3NlcyhhY2NvdW50KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxMQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyAxNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFJla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0UmVrZXllZEFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0UmVrZXllZEFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTIyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFJla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDEyIC8vICJyIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucmVrZXllZEFkZHJlc3NlcyhhY2NvdW50KS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmhhc0Fzc2V0R3VhcmRbcm91dGluZ10oKSAtPiB2b2lkOgpoYXNBc3NldEd1YXJkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjkKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGhhc0Fzc2V0R3VhcmRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMwCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmhhc0Fzc2V0R3VhcmRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzMgogICAgLy8gcmV0dXJuIHRoaXMuYXNzZXRHdWFyZHMoeyBjdXN0b2RpYW5Hcm91cElkLCBhc3NldElkIH0pLmV4aXN0cwogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIGFzc2V0R3VhcmRzID0gQm94TWFwPHsgY3VzdG9kaWFuR3JvdXBJZDogdWludDY0OyBhc3NldElkOiB1aW50NjQgfSwgQXNzZXRHdWFyZD4oeyBrZXlQcmVmaXg6ICdhZycgfSkKICAgIGJ5dGVjIDEzIC8vICJhZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzMgogICAgLy8gcmV0dXJuIHRoaXMuYXNzZXRHdWFyZHMoeyBjdXN0b2RpYW5Hcm91cElkLCBhc3NldElkIH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTI3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0QXNzZXRHdWFyZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEFzc2V0R3VhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTM1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzNwogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0QXNzZXRHdWFyZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzgKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0QXNzZXRHdWFyZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQwCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5hc3NldEd1YXJkcyh7IGN1c3RvZGlhbkdyb3VwSWQsIGFzc2V0SWQgfSkudmFsdWUpCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gYXNzZXRHdWFyZHMgPSBCb3hNYXA8eyBjdXN0b2RpYW5Hcm91cElkOiB1aW50NjQ7IGFzc2V0SWQ6IHVpbnQ2NCB9LCBBc3NldEd1YXJkPih7IGtleVByZWZpeDogJ2FnJyB9KQogICAgYnl0ZWMgMTMgLy8gImFnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQwCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5hc3NldEd1YXJkcyh7IGN1c3RvZGlhbkdyb3VwSWQsIGFzc2V0SWQgfSkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYXNzZXJ0TWVtYmVyKGdyb3VwSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydE1lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDgKICAgIC8vIHByaXZhdGUgX2Fzc2VydE1lbWJlcihncm91cElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0OQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLmV4aXN0cywgJ2dyb3VwIG5vdCBmb3VuZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0OQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLmV4aXN0cywgJ2dyb3VwIG5vdCBmb3VuZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NTAKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA1IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTUwCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkOiB1aW50NjQpIC0+IHZvaWQ6Cl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjYKICAgIC8vIHByaXZhdGUgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA0MwogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2NwogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMzCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY4CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgcmVhZHkgdG8gZXhlY3V0ZScpCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gbm90IHJlYWR5IHRvIGV4ZWN1dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjkKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdwcm9wb3NhbCBleHBpcmVkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzEKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTcxCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3MS05NzIKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTcyCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzMKICAgIC8vIGNvbnN0IHJlcXVpcmVkVGhyZXNob2xkOiB1aW50NjQgPSBwcm9wb3NhbC50aHJlc2hvbGQgPj0gZ3JvdXAudGhyZXNob2xkID8gcHJvcG9zYWwudGhyZXNob2xkIDogZ3JvdXAudGhyZXNob2xkCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA5MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzQKICAgIC8vIGFzc2VydChwcm9wb3NhbC5hcHByb3ZhbHNDb3VudCA+PSByZXF1aXJlZFRocmVzaG9sZCwgJ3RocmVzaG9sZCBub3QgbWV0JykKICAgIGZyYW1lX2RpZyA4OQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCBub3QgbWV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc1CiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyc2hpcEVwb2NoID09PSBwcm9wb3NhbC5lcG9jaEF0Q3JlYXRpb24sICdncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24nKQogICAgZnJhbWVfZGlnIDkxCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgODggLy8gODgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NwogICAgLy8gaWYgKHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCkgewogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc4CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgOSAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3OAogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNhZmUgcGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyBpZiAoZ3JvdXAuY29vbGRvd25Sb3VuZHMgIT09IFVpbnQ2NCgwKSAmJiBncm91cC5sYXN0RXhlY3V0aW9uUm91bmQgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDkxCiAgICBwdXNoaW50IDkwIC8vIDkwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3NwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANwogICAgZnJhbWVfZGlnIDkxCiAgICBwdXNoaW50IDk4IC8vIDk4CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3OAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4MQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA+PSBncm91cC5sYXN0RXhlY3V0aW9uUm91bmQgKyBncm91cC5jb29sZG93blJvdW5kcywgJ2dyb3VwIGNvb2xkb3duIG5vdCBlbGFwc2VkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZnJhbWVfZGlnIDc4CiAgICBmcmFtZV9kaWcgNzcKICAgICsKICAgID49CiAgICBhc3NlcnQgLy8gZ3JvdXAgY29vbGRvd24gbm90IGVsYXBzZWQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgzCiAgICAvLyB0aGlzLl9leGVjdXRlVHJhbnNhY3Rpb25Hcm91cChwcm9wb3NhbElkLCBwcm9wb3NhbC5ncm91cElkLCBncm91cCwgcHJvcG9zYWwubnVtUGF5bG9hZHMpCiAgICBmcmFtZV9kaWcgODkKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDYzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MQogICAgLy8gY29uc3QgaXNDdXN0b2RpYW4gPSBncm91cEluLmdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOCiAgICBmcmFtZV9kaWcgOTEKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGZyYW1lX2J1cnkgNTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg0CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNjQKICAgIGZyYW1lX2RpZyA5MgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI2CiAgICBmcmFtZV9idXJ5IDI3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDk0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODQKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNjQKICAgIGZyYW1lX2RpZyA2MwogICAgPD0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg1CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNjQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg2CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTAgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NgogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDk2CiAgICBmcmFtZV9kaWcgMjYKICAgIGZyYW1lX2J1cnkgMjgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg0CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2NAogICAgZnJhbWVfZGlnIDI4CiAgICBmcmFtZV9idXJ5IDI2CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAOTQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDk2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODcKICAgIC8vIGNvbnN0IHBheWxvYWQgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTgKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4OAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTUKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfYnVyeSAyOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA5NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg3LTEwODgKICAgIC8vIGNvbnN0IHBheWxvYWQgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg4CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTUKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODktMTA5MAogICAgLy8gY29uc3QgZW50cnkgPSBjbG9uZShwYXlsb2FkW2ldKQogICAgLy8gaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfUEFZTUVOVCkgewogICAgaW50Y18zIC8vIDIKICAgIGZyYW1lX2RpZyA1NQogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAxOAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTAKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3NgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTEKICAgIC8vIGNvbnN0IHR4ID0gZGVjb2RlQXJjNDxQYXltZW50VHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDMyCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU1CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMyOAogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9QQVkpICE9PSBVaW50NjQoMCksICdwYXkgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI3CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBwYXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI5CiAgICAvLyBhc3NlcnQodHgucmVjZWl2ZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3JlY2VpdmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZXh0cmFjdCAzNCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIHJlcXVpcmVkCiAgICBwdXNoaW50IDc0IC8vIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzMAogICAgLy8gaWYgKHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgODAKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI2OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzEKICAgIC8vIGFzc2VydCh0eC5jbG9zZVJlbWFpbmRlclRvICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdjbG9zZSB0YXJnZXQgcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIDYKICAgIGV4dHJhY3QgODIgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBjbG9zZSB0YXJnZXQgcmVxdWlyZWQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI2ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyBpZiAoaXNDdXN0b2RpYW4pIHsKICAgIGZyYW1lX2RpZyA1NwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk1CiAgICAvLyBjb25zdCBzZW5kZXIgPSB0eC5zZW5kZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogdHguc2VuZGVyCiAgICBmcmFtZV9kaWcgNgogICAgZXh0cmFjdCAyIDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTA0CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfYnVyeSAzNAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTYKICAgIC8vIGNvbnN0IGFtb3VudCA9IHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkgPyBvcC5iYWxhbmNlKHNlbmRlcikgOiB0eC5hbW91bnQKICAgIGZyYW1lX2RpZyA4MAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTA3CiAgICBmcmFtZV9kaWcgMzQKICAgIGJhbGFuY2UKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEwODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyB0aGlzLl9kZWR1Y3RGcm9tR3VhcmQoZ3JvdXBJZCwgVWludDY0KDApLCBhbW91bnQpCiAgICBmcmFtZV9kaWcgOTAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX2RlZHVjdEZyb21HdWFyZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE4OgogICAgZnJhbWVfZGlnIDI3CiAgICBmcmFtZV9idXJ5IDI4CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4OAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1NQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDk3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxMDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NgogICAgLy8gY29uc3QgYW1vdW50ID0gdHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSA/IG9wLmJhbGFuY2Uoc2VuZGVyKSA6IHR4LmFtb3VudAogICAgZnJhbWVfZGlnIDYKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEwOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMzQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTA1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEwOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk5CiAgICAvLyBsZXQgYW1vdW50OiB1aW50NjQgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gaWYgKGdyb3VwLmxpbWl0QXNzZXRJZCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgOTIKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMQogICAgLy8gY29uc3Qgc2VuZGVyID0gdHguc2VuZGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyA6IHR4LnNlbmRlcgogICAgZnJhbWVfZGlnIDYKICAgIGV4dHJhY3QgMiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDExMgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2J1cnkgMzUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDExMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTAyCiAgICAvLyBhbW91bnQgPSB0eC5oYXNDbG9zZSAhPT0gVWludDY0KDApID8gb3AuYmFsYW5jZShzZW5kZXIpIDogdHguYW1vdW50CiAgICBmcmFtZV9kaWcgODAKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDExNQogICAgZnJhbWVfZGlnIDM1CiAgICBiYWxhbmNlCiAgICBmcmFtZV9idXJ5IDUxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNAogICAgLy8gZ3JvdXAgPSB0aGlzLl9hY2NvdW50U3BlbmQoZ3JvdXAsIGFtb3VudCkKICAgIGZyYW1lX2RpZyA5MgogICAgZnJhbWVfZGlnIDUxCiAgICBjYWxsc3ViIF9hY2NvdW50U3BlbmQKICAgIHBvcAogICAgZnJhbWVfYnVyeSA5MgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDExNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTAyCiAgICAvLyBhbW91bnQgPSB0eC5oYXNDbG9zZSAhPT0gVWludDY0KDApID8gb3AuYmFsYW5jZShzZW5kZXIpIDogdHguYW1vdW50CiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNTEKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxMTI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAzNQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAxMTMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDYKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZnJhbWVfZGlnIDc2CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNwogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFzc2V0VHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDMyCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU1CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzYKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQVhGRVIpICE9PSBVaW50NjQoMCksICdheGZlciBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjcKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gMgogICAgJgogICAgYXNzZXJ0IC8vIGF4ZmVyIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzNwogICAgLy8gYXNzZXJ0KHR4LmFzc2V0UmVjZWl2ZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Fzc2V0IHJlY2VpdmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZXh0cmFjdCA0MiAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0IHJlY2VpdmVyIHJlcXVpcmVkCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzOAogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4MAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzOQogICAgLy8gYXNzZXJ0KHR4LmFzc2V0Q2xvc2VUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYXNzZXQgY2xvc2UgdGFyZ2V0IHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAxMgogICAgZXh0cmFjdCA5MCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0IGNsb3NlIHRhcmdldCByZXF1aXJlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjY0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDkKICAgIC8vIGlmIChpc0N1c3RvZGlhbikgewogICAgZnJhbWVfZGlnIDU3CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTAKICAgIC8vIGxldCBhbW91bnQ6IHVpbnQ2NCA9IHR4LmFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgMTIKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDUyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDgwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTEzCiAgICAvLyBjb25zdCBzZW5kZXIgPSB0eC5zZW5kZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogdHguc2VuZGVyCiAgICBmcmFtZV9kaWcgMTIKICAgIGV4dHJhY3QgMiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDEyNgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE0CiAgICAvLyBjb25zdCBbYmFsXSA9IG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2Uoc2VuZGVyLCB0eC54ZmVyQXNzZXQpCiAgICBmcmFtZV9kaWcgMTIKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgZnJhbWVfYnVyeSA1MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTcKICAgIC8vIHRoaXMuX2RlZHVjdEZyb21HdWFyZChncm91cElkLCB0eC54ZmVyQXNzZXQsIGFtb3VudCkKICAgIGZyYW1lX2RpZyAxMgogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA5MAogICAgc3dhcAogICAgZnJhbWVfZGlnIDUyCiAgICBjYWxsc3ViIF9kZWR1Y3RGcm9tR3VhcmQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MjoKICAgIGZyYW1lX2RpZyAyNwogICAgZnJhbWVfYnVyeSAyOAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDEyNjoKICAgIGZyYW1lX2RpZyAyCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEyNwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExOQogICAgLy8gY29uc3QgdHJhY2tlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gVWludDY0KDApICYmIHR4LnhmZXJBc3NldCA9PT0gZ3JvdXAubGltaXRBc3NldElkCiAgICBmcmFtZV9kaWcgOTIKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgODEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX2ZhbHNlQDEzMgogICAgZnJhbWVfZGlnIDEyCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDgxCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfZmFsc2VAMTMyCiAgICBpbnRjXzEgLy8gMQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfbWVyZ2VAMTMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjAKICAgIC8vIGxldCBhbW91bnQ6IHVpbnQ2NCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIxCiAgICAvLyBpZiAodHJhY2tlZCkgewogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMgogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDgwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIGNvbnN0IHNlbmRlciA9IHR4LnNlbmRlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiB0eC5zZW5kZXIKICAgIGZyYW1lX2RpZyAxMgogICAgZXh0cmFjdCAyIDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTM3CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTM4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjQKICAgIC8vIGNvbnN0IFtiYWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShzZW5kZXIsIHR4LnhmZXJBc3NldCkKICAgIGZyYW1lX2RpZyAxMgogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBmcmFtZV9idXJ5IDUzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMAogICAgLy8gZ3JvdXAgPSB0aGlzLl9hY2NvdW50U3BlbmQoZ3JvdXAsIGFtb3VudCkKICAgIGZyYW1lX2RpZyA5MgogICAgZnJhbWVfZGlnIDUzCiAgICBjYWxsc3ViIF9hY2NvdW50U3BlbmQKICAgIHBvcAogICAgZnJhbWVfYnVyeSA5MgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDEzNzoKICAgIGZyYW1lX2RpZyAzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDEzOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNwogICAgLy8gYW1vdW50ID0gdHguYXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAxMgogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNTMKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAxMzI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9tZXJnZUAxMzMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzIKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BUFApIHsKICAgIGZyYW1lX2RpZyA3NgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzMKICAgIC8vIGNvbnN0IHR4ID0gZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMzIKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTUKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDQKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQVBQTCkgIT09IFVpbnQ2NCgwKSwgJ2FwcGwgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI3CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgICYKICAgIGFzc2VydCAvLyBhcHBsIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0NQogICAgLy8gYXNzZXJ0KHR4LmFwcElkICE9PSBVaW50NjQoMCksICdhcHBJZCByZXF1aXJlZCcpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGFzc2VydCAvLyBhcHBJZCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDcKICAgIC8vIGFzc2VydCh0eC5hcHBJZCAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkLCAnc2VsZi1jYWxsIG5vdCBhbGxvd2VkJykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgIT0KICAgIGFzc2VydCAvLyBzZWxmLWNhbGwgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQ4CiAgICAvLyBhc3NlcnQodHgub25Db21wbGV0aW9uIDw9IFVpbnQ2NCg1KSwgJ2ludmFsaWQgb25Db21wbGV0aW9uJykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgb25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MAogICAgLy8gYXNzZXJ0KHR4Lm9uQ29tcGxldGlvbiAhPT0gVWludDY0KDQpLCAnYXBwIHVwZGF0ZSBub3Qgc3VwcG9ydGVkJykKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAhPQogICAgYXNzZXJ0IC8vIGFwcCB1cGRhdGUgbm90IHN1cHBvcnRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTEKICAgIC8vIGNvbnN0IG51bUFyZ3MgPSBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgNjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzUyCiAgICAvLyBjb25zdCBudW1BY2NvdW50cyA9IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpCiAgICBkaWcgMQogICAgcHVzaGludCAyMCAvLyAyMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTMKICAgIC8vIGNvbnN0IG51bUFwcHMgPSBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU0CiAgICAvLyBjb25zdCBudW1Bc3NldHMgPSBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpCiAgICBkaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1NQogICAgLy8gYXNzZXJ0KG51bUFyZ3MgPD0gTUFYX0FQUF9BUkdTLCAndG9vIG1hbnkgYXBwIGFyZ3MnKQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGFwcCBhcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1NgogICAgLy8gYXNzZXJ0KG51bUFjY291bnRzIDw9IE1BWF9BUFBfQUNDT1VOVFMsICd0b28gbWFueSBhY2NvdW50cycpCiAgICBkaWcgMgogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgYWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU3CiAgICAvLyBhc3NlcnQobnVtQXBwcyA8PSBNQVhfQVBQX0ZPUkVJR05fQVBQUywgJ3RvbyBtYW55IGZvcmVpZ24gYXBwcycpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgZm9yZWlnbiBhcHBzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1OAogICAgLy8gYXNzZXJ0KG51bUFzc2V0cyA8PSBNQVhfQVBQX0ZPUkVJR05fQVNTRVRTLCAndG9vIG1hbnkgZm9yZWlnbiBhc3NldHMnKQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSBmb3JlaWduIGFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTkKICAgIC8vIGFzc2VydChudW1BY2NvdW50cyArIG51bUFwcHMgKyBudW1Bc3NldHMgPD0gTUFYX0FQUF9UT1RBTF9SRUZTLCAndG9vIG1hbnkgcmVmZXJlbmNlcycpCiAgICBjb3ZlciAyCiAgICArCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSByZWZlcmVuY2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2MAogICAgLy8gbGV0IHRvdGFsQXJnTGVuID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjEKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBudW1BcmdzOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjU4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjEKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBudW1BcmdzOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU2CiAgICBmcmFtZV9kaWcgNjIKICAgIDwKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2NwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDI2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjIKICAgIC8vIHRvdGFsQXJnTGVuID0gdG90YWxBcmdMZW4gKyB0eC5hcHBBcmdzW2ldLmxlbmd0aAogICAgZnJhbWVfZGlnIDE3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDY3CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyA1NgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBmcmFtZV9kaWcgNzMKICAgICsKICAgIGZyYW1lX2J1cnkgNzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYxCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbnVtQXJnczsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU2CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjU4CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMjYwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjQKICAgIC8vIGFzc2VydCh0b3RhbEFyZ0xlbiA8PSBNQVhfQVBQX1RPVEFMX0FSR19MRU4sICdhcHAgYXJncyB0b3RhbCBsZW5ndGggZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDczCiAgICBwdXNoaW50IDIwNDggLy8gMjA0OAogICAgPD0KICAgIGFzc2VydCAvLyBhcHAgYXJncyB0b3RhbCBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2RpZyAyNwogICAgZnJhbWVfYnVyeSAyOAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQ3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzUKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9LRVlSRUcpIHsKICAgIGZyYW1lX2RpZyA3NgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzcKICAgIC8vIGFzc2VydCgoZ3JvdXBJbi5hbGxvd2VkQWN0aW9ucyAmIEFDVF9LRVlSRUcpICE9PSBVaW50NjQoMCksICdrZXlyZWcgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI3CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGFzc2VydCAvLyBrZXlyZWcgbm90IGFsbG93ZWQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTYzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTM4CiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQUNGRykgewogICAgZnJhbWVfZGlnIDc2CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTUzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFzc2V0Q29uZmlnVHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDMyCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU1CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2OAogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BQ0ZHKSAhPT0gVWludDY0KDApLCAnYWNmZyBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjcKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAmCiAgICBhc3NlcnQgLy8gYWNmZyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzAKICAgIC8vIHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgwKSB8fCB0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpLAogICAgZHVwCiAgICBwdXNoaW50IDM4IC8vIDM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjkKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjUzCiAgICBmcmFtZV9kaWcgNjkKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyNTQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjUzOgogICAgaW50Y18xIC8vIDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDI1NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzY5LTEzNzIKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdHgubWV0YWRhdGFIYXNoLmxlbmd0aCA9PT0gVWludDY0KDApIHx8IHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMiksCiAgICAvLyAgICdtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNTk6CiAgICBmcmFtZV9kaWcgMjcKICAgIGZyYW1lX2J1cnkgMjgKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTYzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyNTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9tZXJnZUAyNTUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTUzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDEKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9SRUtFWSkgewogICAgZnJhbWVfZGlnIDc2CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydCAvLyB1bmtub3duIHR4IHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQyCiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8UmVrZXlUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMzIKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTUKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODQKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfUkVLRVkpICE9PSBVaW50NjQoMCksICdyZWtleSBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjcKICAgIGR1cAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICYKICAgIGFzc2VydCAvLyByZWtleSBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODUKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ3Jla2V5IHJlcXVpcmVzIGdyb3VwIGFkbWluIHByaXZpbGVnZScpCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIHJla2V5IHJlcXVpcmVzIGdyb3VwIGFkbWluIHByaXZpbGVnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODYKICAgIC8vIGFzc2VydChncm91cC5ncm91cFR5cGUgIT09IEdUX0NVU1RPRElBTiwgJ2N1c3RvZGlhbiBncm91cHMgY2Fubm90IHJla2V5JykKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYXNzZXJ0IC8vIGN1c3RvZGlhbiBncm91cHMgY2Fubm90IHJla2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NwogICAgLy8gYXNzZXJ0KHR4LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5IHRhcmdldCByZXF1aXJlZCcpCiAgICBleHRyYWN0IDM0IDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gcmVrZXkgdGFyZ2V0IHJlcXVpcmVkCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1OQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE2NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTUxCiAgICAvLyBncm91cC5sYXN0RXhlY3V0aW9uUm91bmQgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgZnJhbWVfZGlnIDkyCiAgICBzd2FwCiAgICByZXBsYWNlMiA5OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTIKICAgIC8vIHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgOTEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NQogICAgLy8gbGV0IHR4SW5kZXggPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NgogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDY1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE2NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU2CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDY1CiAgICBmcmFtZV9kaWcgNjMKICAgIDw9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTkxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NwogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZnJhbWVfZGlnIDY1CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1OAogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTgKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTkKICAgIC8vIGNvbnN0IHBheWxvYWQgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICBmcmFtZV9kaWcgMjEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMzMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2MAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTcwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTktMTE2MAogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAyMQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjAKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1OAogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTkwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2MgogICAgLy8gY29uc3QgZmlyc3QgPSB0eEluZGV4ID09PSBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyA3NAogICAgIQogICAgZnJhbWVfYnVyeSA1NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjMKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGludGNfMyAvLyAyCiAgICBmcmFtZV9kaWcgNTgKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgMjEKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4MwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE3MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjQKICAgIC8vIHRoaXMuX3N0YWdlUGF5bWVudChkZWNvZGVBcmM0PFBheW1lbnRUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1OAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTYKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDU0CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVWludDY0KFRyYW5zYWN0aW9uVHlwZS5QYXltZW50KSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxOQogICAgLy8gdGhpcy5fc2V0U2VuZGVySWZTZXQodHguc2VuZGVyKQogICAgZHVwCiAgICBleHRyYWN0IDIgMzIKICAgIGNhbGxzdWIgX3NldFNlbmRlcklmU2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyMAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRSZWNlaXZlcih0eC5yZWNlaXZlcikKICAgIGR1cAogICAgZXh0cmFjdCAzNCAzMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KHR4LmFtb3VudCkKICAgIGR1cAogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBwdXNoaW50IDc0IC8vIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyMgogICAgLy8gaWYgKHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkpIG9wLklUeG5DcmVhdGUuc2V0Q2xvc2VSZW1haW5kZXJUbyh0eC5jbG9zZVJlbWFpbmRlclRvKQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI0NQogICAgZnJhbWVfZGlnIDcKICAgIGV4dHJhY3QgODIgMzIKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjQ1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjMKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIHB1c2hpbnQgMTEyIC8vIDExMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODgKICAgIGZyYW1lX2RpZyA0MQogICAgaXR4bl9maWVsZCBOb3RlCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE3NgogICAgLy8gdHhJbmRleCA9IHR4SW5kZXggKyBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyA3NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU4CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTcwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE3MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY1CiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVNTRVQpIHsKICAgIGZyYW1lX2RpZyA4MwogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE3NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjYKICAgIC8vIHRoaXMuX3N0YWdlQXNzZXQoZGVjb2RlQXJjNDxBc3NldFR4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDMzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU4CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyNwogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNTQKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjI5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMwCiAgICAvLyB0aGlzLl9zZXRTZW5kZXJJZlNldCh0eC5zZW5kZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfc2V0U2VuZGVySWZTZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFhmZXJBc3NldCh0eC54ZmVyQXNzZXQpCiAgICBkdXAKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRSZWNlaXZlcih0eC5hc3NldFJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDQyIDMyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMzCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0QW1vdW50KHR4LmFzc2V0QW1vdW50KQogICAgZHVwCiAgICBwdXNoaW50IDc0IC8vIDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgcHVzaGludCA4MiAvLyA4MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzQKICAgIC8vIGlmICh0eC5oYXNBc3NldENsb3NlICE9PSBVaW50NjQoMCkpIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRDbG9zZVRvKHR4LmFzc2V0Q2xvc2VUbykKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMzkKICAgIGZyYW1lX2RpZyA4CiAgICBleHRyYWN0IDkwIDMyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzUKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIHB1c2hpbnQgMTIwIC8vIDEyMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODgKICAgIGZyYW1lX2RpZyA0MgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE4OAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxNzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NwogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZnJhbWVfZGlnIDgzCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTc3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2OAogICAgLy8gdGhpcy5fc3RhZ2VBcHBDYWxsKGRlY29kZUFyYzQ8QXBwVHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMzMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTgKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2MgogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNTQKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCkpCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjUKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25JZCh0eC5hcHBJZCkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjY2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldE9uQ29tcGxldGlvbih0eC5vbkNvbXBsZXRpb24pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjY3CiAgICAvLyBpZiAodHgubm90ZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Tm90ZShCeXRlcyh0eC5ub3RlKSkKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSA0NAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzkKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMjMKICAgIGZyYW1lX2RpZyAzOQogICAgaXR4bl9maWVsZCBOb3RlCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1NQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzYKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ1CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1NQogICAgPgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY4CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMjI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OC0xMjY5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbkFyZ3ModHguYXBwQXJnc1tpXSkKICAgIGZyYW1lX2RpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDY4CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyA1NQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbkFyZ3ModHguYXBwQXJnc1tpXSkKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjgKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAyMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3MQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzEKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzNgogICAgZHVwCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ2CiAgICBmcmFtZV9kaWcgNDUKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1OQogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDIyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzEtMTI3MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFjY291bnRzKHR4LmFjY291bnRzW2ldKQogICAgZnJhbWVfZGlnIDEwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDU5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QWNjb3VudHModHguYWNjb3VudHNbaV0pCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3MQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTkKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMjcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAyMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3NAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2MAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3NAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzYKICAgIGR1cAogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NwogICAgZnJhbWVfZGlnIDQ0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNjAKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAyMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc0LTEyNzUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0cyh0eC5mb3JlaWduQXNzZXRzW2ldKQogICAgZnJhbWVfZGlnIDExCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBc3NldHModHguZm9yZWlnbkFzc2V0c1tpXSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzQKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNjAKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMzAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAyMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3NwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNjEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzcKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzNgogICAgZnJhbWVfZGlnIDQ2CiAgICBmcmFtZV9kaWcgNDcKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA2MQogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTg4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3Ny0xMjc4CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25zKHR4LmZvcmVpZ25BcHBzW2ldKQogICAgZnJhbWVfZGlnIDEzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbnModHguZm9yZWlnbkFwcHNbaV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc3CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2MQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDIzMwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxNzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2OQogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0tFWVJFRykgewogICAgZnJhbWVfZGlnIDgzCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTc5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE3MAogICAgLy8gdGhpcy5fc3RhZ2VLZXlSZWcoZGVjb2RlQXJjNDxLZXlSZWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1OAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjgzCiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA1NAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjg0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuS2V5UmVnaXN0cmF0aW9uKSkKICAgIGludGNfMyAvLyAyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODYKICAgIC8vIGlmICh0eC5vbmxpbmUgIT09IFVpbnQ2NCgwKSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE4OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Vm90ZVBrKHR4LnZvdGVLZXkpCiAgICBmcmFtZV9kaWcgMzYKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBWb3RlUEsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjg4CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFNlbGVjdGlvblBrKHR4LnNlbGVjdGlvbktleSkKICAgIGRpZyAxCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIFNlbGVjdGlvblBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRTdGF0ZVByb29mUGsodHguc3RhdGVQcm9vZktleSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIFN0YXRlUHJvb2ZQSwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Vm90ZUZpcnN0KHR4LnZvdGVGaXJzdCkKICAgIGZyYW1lX2RpZyAxNAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlRmlyc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVMYXN0KHR4LnZvdGVMYXN0KQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlTGFzdAogICAgcHVzaGludCAzMiAvLyAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Vm90ZUtleURpbHV0aW9uKHR4LnZvdGVLZXlEaWx1dGlvbikKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFZvdGVLZXlEaWx1dGlvbgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTc5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzEKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BQ0ZHKSB7CiAgICBmcmFtZV9kaWcgODMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxODEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTcyCiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0Q29uZmlnKGRlY29kZUFyYzQ8QXNzZXRDb25maWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1OAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTUKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzAyCiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA1NAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzAzCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzA0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwNQogICAgLy8gaWYgKHR4LmNvbmZpZ0Fzc2V0ID09PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzUKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDIxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRUb3RhbCh0eC50b3RhbCkKICAgIGZyYW1lX2RpZyAxNQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwNwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlY2ltYWxzKHR4LmRlY2ltYWxzKQogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlZmF1bHRGcm96ZW4odHguZGVmYXVsdEZyb3plbiAhPT0gVWludDY0KDApKQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzA5CiAgICAvLyBpZiAodHgudW5pdE5hbWUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VW5pdE5hbWUoQnl0ZXModHgudW5pdE5hbWUpKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0OAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MAogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIwNgogICAgZnJhbWVfZGlnIDQwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIwNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzEwCiAgICAvLyBpZiAodHguYXNzZXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE5hbWUoQnl0ZXModHguYXNzZXROYW1lKSkKICAgIGZyYW1lX2RpZyAzNgogICAgZHVwCiAgICBwdXNoaW50IDM2IC8vIDM2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ5CiAgICBmcmFtZV9kaWcgNDgKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMDgKICAgIGZyYW1lX2RpZyA0MgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIwODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzExCiAgICAvLyBpZiAodHgudXJsICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFVybChCeXRlcyh0eC51cmwpKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIHB1c2hpbnQgMzggLy8gMzgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNTAKICAgIGZyYW1lX2RpZyA0OQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MwogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMAogICAgZnJhbWVfZGlnIDQzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxMgogICAgLy8gaWYgKHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMikpIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRNZXRhZGF0YUhhc2godHgubWV0YWRhdGFIYXNoKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgNTAKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzcKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMwogICAgZnJhbWVfZGlnIDM3CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxNgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE1hbmFnZXIodHgubWFuYWdlcikKICAgIGZyYW1lX2RpZyAxNQogICAgZHVwCiAgICBleHRyYWN0IDQyIDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRSZXNlcnZlKHR4LnJlc2VydmUpCiAgICBkdXAKICAgIGV4dHJhY3QgNzQgMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldEZyZWV6ZSh0eC5mcmVlemUpCiAgICBkdXAKICAgIGV4dHJhY3QgMTA2IDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RnJlZXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldENsYXdiYWNrKHR4LmNsYXdiYWNrKQogICAgZXh0cmFjdCAxMzggMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjAKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZnJhbWVfZGlnIDM2CiAgICBkdXAKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTg4CiAgICBmcmFtZV9kaWcgMzgKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXQodHguY29uZmlnQXNzZXQpCiAgICBmcmFtZV9kaWcgNzUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjEzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE4MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTczCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfUkVLRVkpIHsKICAgIGZyYW1lX2RpZyA4MwogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxODgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc0CiAgICAvLyB0aGlzLl9zdGFnZVJla2V5KGRlY29kZUFyYzQ8UmVrZXlUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1OAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ0CiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA1NAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuUGF5bWVudCkpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDcKICAgIC8vIHRoaXMuX3NldFNlbmRlcklmU2V0KHR4LnNlbmRlcikKICAgIGV4dHJhY3QgMiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGR1cAogICAgY2FsbHN1YiBfc2V0U2VuZGVySWZTZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ4CiAgICAvLyBjb25zdCBzZWxmQWRkciA9IHR4LnNlbmRlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiB0eC5zZW5kZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDE5OAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDE5OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJlY2VpdmVyKHNlbGZBZGRyKQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0UmVrZXlUbyh0eC5yZWtleVRvKQogICAgZnJhbWVfZGlnIDE2CiAgICBleHRyYWN0IDM0IDMyCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjUyCiAgICAvLyBpZiAodHgubm90ZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Tm90ZShCeXRlcyh0eC5ub3RlKSkKICAgIGZyYW1lX2RpZyAzNgogICAgZHVwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MAogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE4OAogICAgZnJhbWVfZGlnIDQwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTg4CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxOTg6CiAgICBmcmFtZV9kaWcgNAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAxOTkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU2CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDY1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2NQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE2NwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE5MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTgxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk3CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfRVhFQ1VURUQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk3LTk5OAogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0VYRUNVVEVECiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZnJhbWVfZGlnIDg4CiAgICBpbnRjXzIgLy8gOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk5OQogICAgLy8gZW1pdDxQcm9wb3NhbEV4ZWN1dGVkPih7IHByb3Bvc2FsSWQgfSkKICAgIHB1c2hieXRlcyAweDM1YzY3ZWZkIC8vIG1ldGhvZCAiUHJvcG9zYWxFeGVjdXRlZCh1aW50NjQpIgogICAgZnJhbWVfZGlnIDg3CiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAyMiAvLyAiZHAiCiAgICBmcmFtZV9kaWcgODcKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg1CiAgICAvLyBjb25zdCBjaGFuZ2UgPSBjbG9uZSh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg4CiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9ESVNTT0xWRV9DVVNUT0RJQU4pIHsKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3OQogICAgcHVzaGludCAxMiAvLyAxMgogICAgPT0KICAgIGR1cAogICAgZnJhbWVfYnVyeSA2NgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4OQogICAgLy8gYXNzZXJ0KGdyb3VwLmdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOLCAncHJvcG9zaW5nIGdyb3VwIG11c3QgYmUgY3VzdG9kaWFuJykKICAgIGZyYW1lX2RpZyA5MQogICAgcHVzaGludCAxMjIgLy8gMTIyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHByb3Bvc2luZyBncm91cCBtdXN0IGJlIGN1c3RvZGlhbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk5MAogICAgLy8gYXNzZXJ0KGNoYW5nZS50YXJnZXRHcm91cElkID09PSBwcm9wb3NhbC5ncm91cElkLCAnY2FuIG9ubHkgZGlzc29sdmUgb3duIGdyb3VwJykKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA5MAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBkaXNzb2x2ZSBvd24gZ3JvdXAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzAKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NSRUFURV9HUk9VUCkgewogICAgZnJhbWVfZGlnIDc5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDcxCiAgICAvLyB0aGlzLl9jcmVhdGVHcm91cChjaGFuZ2UsIEdUX1NUQU5EQVJEKQogICAgZnJhbWVfZGlnIDIzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBfY3JlYXRlR3JvdXAKICAgIHBvcAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDcyCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQUREX01FTUJFUikgewogICAgZnJhbWVfZGlnIDc5CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjQ0CiAgICAvLyBjb25zdCBnaWQgPSBjaGFuZ2UudGFyZ2V0R3JvdXBJZAogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY0NQogICAgLy8gYXNzZXJ0KCF0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ2FscmVhZHkgYSBtZW1iZXInKQogICAgZGlnIDEKICAgIHB1c2hpbnRzIDE4IDMyIC8vIDE4LCAzMgogICAgYm94X2V4dHJhY3QKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMgogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDUgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY0NQogICAgLy8gYXNzZXJ0KCF0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ2FscmVhZHkgYSBtZW1iZXInKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGEgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY0NwogICAgLy8gY29uc3QgbTogTWVtYmVyID0geyBhY2NvdW50VHlwZTogY2hhbmdlLm1lbWJlclR5cGUsIGxhYmVsOiBjaGFuZ2UubWVtYmVyTGFiZWwsIGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyIH0KICAgIHVuY292ZXIgNAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMjMKICAgIGR1cAogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpdG9iCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBieXRlYyAyMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NDgKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY1MC0xNjUxCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50ICsgVWludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NTEKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY1MC0xNjUyCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50ICsgVWludDY0KDEpCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NTQKICAgIC8vIGVtaXQ8TWVtYmVyQWRkZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyLCBhY2NvdW50VHlwZTogY2hhbmdlLm1lbWJlclR5cGUgfSkKICAgIGNvbmNhdAogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJNZW1iZXJBZGRlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3NAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9NRU1CRVIpIHsKICAgIGZyYW1lX2RpZyA3OQogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY2NAogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NjUKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ25vdCBhIG1lbWJlcicpCiAgICBzd2FwCiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNSAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjY1CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdub3QgYSBtZW1iZXInKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjY3CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY2Ny0xNjY4CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NjgKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NjctMTY2OAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY2OAogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIHdvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY3MAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5kZWxldGUoKQogICAgdW5jb3ZlciAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjcxCiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NzIKICAgIC8vIGdyb3VwLm1lbWJlcnNoaXBFcG9jaCA9IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMTA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTY3MwogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2NzUKICAgIC8vIGVtaXQ8TWVtYmVyUmVtb3ZlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIgfSkKICAgIHB1c2hieXRlcyAweDJiMTRjMmMxIC8vIG1ldGhvZCAiTWVtYmVyUmVtb3ZlZCh1aW50NjQsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc2CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQUREX1JFS0VZRURfQUREUikgewogICAgZnJhbWVfZGlnIDc5CiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc3CiAgICAvLyBhc3NlcnQoIXRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnYWxyZWFkeSByZWdpc3RlcmVkJykKICAgIGZyYW1lX2RpZyAyMAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgMTIgLy8gInIiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3NwogICAgLy8gYXNzZXJ0KCF0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ2FscmVhZHkgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzgKICAgIC8vIGNvbnN0IGVudHJ5OiBSZWtleWVkQWRkcmVzcyA9IHsgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkZWRSb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIGZyYW1lX2RpZyAyMwogICAgZHVwCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAyOCAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzkKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikudmFsdWUgPSBjbG9uZShlbnRyeSkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODAKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NBZGRlZD4oeyBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCB9KQogICAgc3dhcAogICAgYnl0ZWMgMTkgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjkgLy8gbWV0aG9kICJSZWtleWVkQWRkcmVzc0FkZGVkKGFkZHJlc3Msc3RyaW5nKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODEKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfUkVLRVlFRF9BRERSKSB7CiAgICBmcmFtZV9kaWcgNzkKICAgIHB1c2hpbnQgOSAvLyA5CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODIKICAgIC8vIGFzc2VydCh0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ25vdCByZWdpc3RlcmVkJykKICAgIGZyYW1lX2RpZyAyMAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgMTIgLy8gInIiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ4MgogICAgLy8gYXNzZXJ0KHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnbm90IHJlZ2lzdGVyZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODMKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODQKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NSZW1vdmVkPih7IGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHhkYjRjYTUyYSAvLyBtZXRob2QgIlJla2V5ZWRBZGRyZXNzUmVtb3ZlZChhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODUKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9DSEFOR0VfVEhSRVNIT0xEKSB7CiAgICBmcmFtZV9kaWcgNzkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODYKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDg3CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODYtMTQ4NwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODcKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IGdyb3VwLm1lbWJlckNvdW50LCAndGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycycpCiAgICBidG9pCiAgICA8PQogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDg4LTE0ODkKICAgIC8vIGdyb3VwLnRocmVzaG9sZCA9IGNoYW5nZS50aHJlc2hvbGQKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgaW50Y18zIC8vIDIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5MAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDkxCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIDc5CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDkyCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5MgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5Mi0xNDkzCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5MwogICAgLy8gY29uc3QgYXNzZXRDaGFuZ2VkID0gZ3JvdXAubGltaXRBc3NldElkICE9PSBjaGFuZ2UubGltaXRBc3NldElkCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk0CiAgICAvLyBncm91cC5hbGxvd2VkQWN0aW9ucyA9IGNoYW5nZS5hbGxvd2VkQWN0aW9ucwogICAgZGlnIDMKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTUKICAgIC8vIGdyb3VwLmxpbWl0QXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTIgMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk2CiAgICAvLyBncm91cC5kYWlseUxpbWl0ID0gY2hhbmdlLmRhaWx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDkyIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIHJlcGxhY2UyIDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5NwogICAgLy8gZ3JvdXAubW9udGhseUxpbWl0ID0gY2hhbmdlLm1vbnRobHlMaW1pdAogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA2NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTgKICAgIC8vIGdyb3VwLmNvb2xkb3duUm91bmRzID0gY2hhbmdlLmNvb2xkb3duUm91bmRzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA5MAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTkKICAgIC8vIGlmIChhc3NldENoYW5nZWQpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwMQogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDIKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDMKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNAogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gVWludDY0KDApCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNQogICAgLy8gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID0gbm93CiAgICBzd2FwCiAgICByZXBsYWNlMiA4MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNwogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMjIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwOAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgMjUKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDkKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZnJhbWVfZGlnIDc5CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTEwCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxMAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxMgogICAgLy8gYXNzZXJ0KGdyb3VwLmdyb3VwVHlwZSA9PT0gR1RfU1RBTkRBUkQsICdjYW5ub3Qgc2V0IHByaXZpbGVnZXMgb24gY3VzdG9kaWFuIGdyb3VwcycpCiAgICBzd2FwCiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIGNhbm5vdCBzZXQgcHJpdmlsZWdlcyBvbiBjdXN0b2RpYW4gZ3JvdXBzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxMwogICAgLy8gYXNzZXJ0KCF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgZ3JvdXApLCAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgZnJhbWVfZGlnIDIzCiAgICBzd2FwCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjkKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyMwogICAgIQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxNAogICAgLy8gY29uc3QgaGFkR3JvdXBQcml2ID0gKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxNQogICAgLy8gY29uc3Qgd2lsbEhhdmVHcm91cFByaXYgPSAoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDY4IDgKICAgIGZyYW1lX2J1cnkgNQogICAgc3dhcAogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDcxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxNgogICAgLy8gaWYgKGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApICYmIGhhZEdyb3VwUHJpdiAmJiAhd2lsbEhhdmVHcm91cFByaXYpIHsKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4MgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0MgogICAgZnJhbWVfZGlnIDcwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQyCiAgICBmcmFtZV9kaWcgNzEKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxNwogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTE3CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTE3CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MjEKICAgIC8vIGdyb3VwLmFkbWluUHJpdmlsZWdlcyA9IGNoYW5nZS5hZG1pblByaXZpbGVnZXMKICAgIGZyYW1lX2RpZyAyOQogICAgZnJhbWVfZGlnIDUKICAgIHJlcGxhY2UyIDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUyMgogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMjMKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTIyCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTIzCiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJHcm91cFVwZGF0ZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTgKICAgIC8vIH0gZWxzZSBpZiAoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCkgJiYgIWhhZEdyb3VwUHJpdiAmJiB3aWxsSGF2ZUdyb3VwUHJpdikgewogICAgZnJhbWVfZGlnIDgyCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NwogICAgZnJhbWVfZGlnIDcwCiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANDcKICAgIGZyYW1lX2RpZyA3MQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTE5CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjUKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTkKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjUKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTkKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI0CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX0FDVElWRSkgewogICAgZnJhbWVfZGlnIDc5CiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAzMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI1LTE1MjYKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgLy8gY29uc3Qgd2FzQWN0aXZlID0gZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI2CiAgICAvLyBjb25zdCB3YXNBY3RpdmUgPSBncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKQogICAgYnRvaQogICAgZnJhbWVfYnVyeSA4NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MjcKICAgIC8vIGNvbnN0IHdpbGxCZUFjdGl2ZSA9IGNoYW5nZS5hY3RpdmVGbGFnICE9PSBVaW50NjQoMCkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgODUKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgZnJhbWVfYnVyeSA4NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MjgKICAgIC8vIGlmIChncm91cC5ncm91cFR5cGUgIT09IEdUX0NVU1RPRElBTikgewogICAgcHVzaGludCAxMjIgLy8gMTIyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTI5CiAgICAvLyBhc3NlcnQoIXRoaXMuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlLCBncm91cCksICdtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbicpCiAgICBmcmFtZV9kaWcgMjMKICAgIGZyYW1lX2RpZyAzMAogICAgY2FsbHN1YiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDMwCiAgICBmcmFtZV9idXJ5IDIzCiAgICAhCiAgICBhc3NlcnQgLy8gbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTMwCiAgICAvLyBjb25zdCBoYXNHcm91cFByaXYgPSAoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTMxCiAgICAvLyBpZiAoaGFzR3JvdXBQcml2ICYmIHdhc0FjdGl2ZSAmJiAhd2lsbEJlQWN0aXZlKSB7CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDU2CiAgICBmcmFtZV9kaWcgODQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANTYKICAgIGZyYW1lX2RpZyA4NQogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTMyCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjUKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzIKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjUKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzIKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzNwogICAgLy8gZ3JvdXAuYWN0aXZlID0gd2lsbEJlQWN0aXZlID8gVWludDY0KDEpIDogVWludDY0KDApCiAgICBmcmFtZV9kaWcgODYKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzMAogICAgc3dhcAogICAgcmVwbGFjZTIgMTE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzOAogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMjMKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTM4CiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTM5CiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJHcm91cFVwZGF0ZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDU2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzMKICAgIC8vIH0gZWxzZSBpZiAoaGFzR3JvdXBQcml2ICYmICF3YXNBY3RpdmUgJiYgd2lsbEJlQWN0aXZlKSB7CiAgICBmcmFtZV9kaWcgNzIKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDYyCiAgICBmcmFtZV9kaWcgODQKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2MgogICAgZnJhbWVfZGlnIDg1CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzQKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDYyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDYzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDAKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9DUkVBVEVfQ1VTVE9ESUFOKSB7CiAgICBmcmFtZV9kaWcgNzkKICAgIHB1c2hpbnQgMTEgLy8gMTEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDY3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU0MQogICAgLy8gdGhpcy5fY3JlYXRlR3JvdXAoY2hhbmdlLCBHVF9DVVNUT0RJQU4pCiAgICBmcmFtZV9kaWcgMjMKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIF9jcmVhdGVHcm91cAogICAgcG9wCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDY3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9ESVNTT0xWRV9DVVNUT0RJQU4pIHsKICAgIGZyYW1lX2RpZyA2NgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA3MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDYKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMjAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU0NwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDctMTU0OAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLmd1YXJkQ291bnQgPT09IFVpbnQ2NCgwKSwgJ3JlbW92ZSBhbGwgZ3VhcmRzIGJlZm9yZSBkaXNzb2x2aW5nJykKICAgIGR1cAogICAgaW50YyA0IC8vIDEzMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU0OAogICAgLy8gYXNzZXJ0KGdyb3VwLmd1YXJkQ291bnQgPT09IFVpbnQ2NCgwKSwgJ3JlbW92ZSBhbGwgZ3VhcmRzIGJlZm9yZSBkaXNzb2x2aW5nJykKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydCAvLyByZW1vdmUgYWxsIGd1YXJkcyBiZWZvcmUgZGlzc29sdmluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDkKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NTAKICAgIC8vIGlmICh0aGlzLmdyb3VwQ291bnQudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA0IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NTAKICAgIC8vIGlmICh0aGlzLmdyb3VwQ291bnQudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NTEKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1MwogICAgLy8gZW1pdDxDdXN0b2RpYW5Hcm91cERpc3NvbHZlZD4oeyBncm91cElkOiBnaWQgfSkKICAgIHB1c2hieXRlcyAweGNjNmNiYTk2IC8vIG1ldGhvZCAiQ3VzdG9kaWFuR3JvdXBEaXNzb2x2ZWQodWludDY0KSIKICAgIGZyYW1lX2RpZyAyNAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1NAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9HVUFSRCkgewogICAgZnJhbWVfZGlnIDc5CiAgICBwdXNoaW50IDEzIC8vIDEzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA3NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NTUKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTU2CiAgICAvLyBjb25zdCBhc3NldElkID0gY2hhbmdlLmxpbWl0QXNzZXRJZCAgLy8gbGltaXRBc3NldElkIGRvdWJsZXMgYXMgZ3VhcmQgYXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1NwogICAgLy8gY29uc3QgdGFyZ2V0ID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1Ny0xNTU4CiAgICAvLyBjb25zdCB0YXJnZXQgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KHRhcmdldC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiwgJ3RhcmdldCBtdXN0IGJlIGEgY3VzdG9kaWFuIGdyb3VwJykKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1OAogICAgLy8gYXNzZXJ0KHRhcmdldC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiwgJ3RhcmdldCBtdXN0IGJlIGEgY3VzdG9kaWFuIGdyb3VwJykKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRhcmdldCBtdXN0IGJlIGEgY3VzdG9kaWFuIGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU1OQogICAgLy8gY29uc3QgZ3VhcmRLZXkgPSB7IGN1c3RvZGlhbkdyb3VwSWQ6IGdpZCwgYXNzZXRJZCB9CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gYXNzZXRHdWFyZHMgPSBCb3hNYXA8eyBjdXN0b2RpYW5Hcm91cElkOiB1aW50NjQ7IGFzc2V0SWQ6IHVpbnQ2NCB9LCBBc3NldEd1YXJkPih7IGtleVByZWZpeDogJ2FnJyB9KQogICAgYnl0ZWMgMTMgLy8gImFnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTYwCiAgICAvLyBpZiAodGhpcy5hc3NldEd1YXJkcyhndWFyZEtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTYzCiAgICAvLyBndWFyZC5sb2NrZWRBbW91bnQgPSBjaGFuZ2UuZ3VhcmRBbW91bnQKICAgIGZyYW1lX2RpZyAyMAogICAgcHVzaGludCAxMjQgLy8gMTI0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTYyLTE1NjQKICAgIC8vIGNvbnN0IGd1YXJkID0gY2xvbmUodGhpcy5hc3NldEd1YXJkcyhndWFyZEtleSkudmFsdWUpCiAgICAvLyBndWFyZC5sb2NrZWRBbW91bnQgPSBjaGFuZ2UuZ3VhcmRBbW91bnQKICAgIC8vIHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLnZhbHVlID0gY2xvbmUoZ3VhcmQpCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDc1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NzIKICAgIC8vIGVtaXQ8QXNzZXRHdWFyZFNldD4oeyBjdXN0b2RpYW5Hcm91cElkOiBnaWQsIGFzc2V0SWQsIGxvY2tlZEFtb3VudDogY2hhbmdlLmd1YXJkQW1vdW50IH0pCiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMTI0IC8vIDEyNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMzEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4YTUxMjkzYWEgLy8gbWV0aG9kICJBc3NldEd1YXJkU2V0KHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDc0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NjcKICAgIC8vIGNvbnN0IGd1YXJkOiBBc3NldEd1YXJkID0geyBjcmVhdGVkUm91bmQ6IEdsb2JhbC5yb3VuZCwgbG9ja2VkQW1vdW50OiBjaGFuZ2UuZ3VhcmRBbW91bnQgfQogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMTI0IC8vIDEyNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTY4CiAgICAvLyB0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS52YWx1ZSA9IGNsb25lKGd1YXJkKQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NjkKICAgIC8vIHRhcmdldC5ndWFyZENvdW50ID0gdGFyZ2V0Lmd1YXJkQ291bnQgKyBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAxOQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTMwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU2OS0xNTcwCiAgICAvLyB0YXJnZXQuZ3VhcmRDb3VudCA9IHRhcmdldC5ndWFyZENvdW50ICsgVWludDY0KDEpCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUodGFyZ2V0KQogICAgaW50YyA0IC8vIDEzMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU3MwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9HVUFSRCkgewogICAgZnJhbWVfZGlnIDc5CiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA3OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NzQKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTc1CiAgICAvLyBjb25zdCBhc3NldElkID0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU3NgogICAgLy8gY29uc3QgdGFyZ2V0ID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NzYtMTU3NwogICAgLy8gY29uc3QgdGFyZ2V0ID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydCh0YXJnZXQuZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4sICd0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU3NwogICAgLy8gYXNzZXJ0KHRhcmdldC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiwgJ3RhcmdldCBtdXN0IGJlIGEgY3VzdG9kaWFuIGdyb3VwJykKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRhcmdldCBtdXN0IGJlIGEgY3VzdG9kaWFuIGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU3OAogICAgLy8gY29uc3QgZ3VhcmRLZXkgPSB7IGN1c3RvZGlhbkdyb3VwSWQ6IGdpZCwgYXNzZXRJZCB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyBhc3NldEd1YXJkcyA9IEJveE1hcDx7IGN1c3RvZGlhbkdyb3VwSWQ6IHVpbnQ2NDsgYXNzZXRJZDogdWludDY0IH0sIEFzc2V0R3VhcmQ+KHsga2V5UHJlZml4OiAnYWcnIH0pCiAgICBieXRlYyAxMyAvLyAiYWciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU3OQogICAgLy8gYXNzZXJ0KHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLmV4aXN0cywgJ2d1YXJkIG5vdCBmb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGd1YXJkIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1ODAKICAgIC8vIHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTgxCiAgICAvLyB0YXJnZXQuZ3VhcmRDb3VudCA9IHRhcmdldC5ndWFyZENvdW50IC0gVWludDY0KDEpCiAgICBkaWcgMQogICAgaW50YyA0IC8vIDEzMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1ODEtMTU4MgogICAgLy8gdGFyZ2V0Lmd1YXJkQ291bnQgPSB0YXJnZXQuZ3VhcmRDb3VudCAtIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKHRhcmdldCkKICAgIHVuY292ZXIgMgogICAgaW50YyA0IC8vIDEzMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1ODMKICAgIC8vIGVtaXQ8QXNzZXRHdWFyZFJlbW92ZWQ+KHsgY3VzdG9kaWFuR3JvdXBJZDogZ2lkLCBhc3NldElkIH0pCiAgICBwdXNoYnl0ZXMgMHhjYWI3MTk4OCAvLyBtZXRob2QgIkFzc2V0R3VhcmRSZW1vdmVkKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU4NwogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApID8gVWludDY0KDEpIDogVWludDY0KDApCiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTU4NwogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApID8gVWludDY0KDEpIDogVWludDY0KDApCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTg4CiAgICAvLyBlbWl0PFNhZmVQYXVzZWQ+KHsgcGF1c2VkOiB0aGlzLnBhdXNlZC52YWx1ZSB9KQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4YzRhNzkyNjMgLy8gbWV0aG9kICJTYWZlUGF1c2VkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTIKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBmcmFtZV9kaWcgNzkKICAgIGZyYW1lX2RpZyA5MgogICAgY2FsbHN1YiBfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlCiAgICBwb3AKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICBmcmFtZV9kaWcgOTQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX25ld1Byb3Bvc2FsKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZFR5cGU6IHVpbnQ2NCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfbmV3UHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwNwogICAgLy8gcHJpdmF0ZSBfbmV3UHJvcG9zYWwoZ3JvdXBJZDogdWludDY0LCBwYXlsb2FkVHlwZTogdWludDY0LCBleHBpcnlSb3VuZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDgKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDEpLCAnbm90IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA3IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDgKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDEpLCAnbm90IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbm90IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDkKICAgIC8vIGFzc2VydChleHBpcnlSb3VuZCA+IEdsb2JhbC5yb3VuZCwgJ2V4cGlyeSBtdXN0IGJlIGluIHRoZSBmdXR1cmUnKQogICAgZnJhbWVfZGlnIC0xCiAgICBnbG9iYWwgUm91bmQKICAgID4KICAgIGFzc2VydCAvLyBleHBpcnkgbXVzdCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMQogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDE0IC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTEKICAgIC8vIGNvbnN0IHBpZDogdWludDY0ID0gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE4CiAgICAvLyB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyMAogICAgLy8gcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyMgogICAgLy8gZXBvY2hBdENyZWF0aW9uOiBncm91cC5tZW1iZXJzaGlwRXBvY2gsCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNQogICAgLy8gc3RhdHVzOiBTVEFUVVNfQUNUSVZFLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDEzLTEwMjUKICAgIC8vIGNvbnN0IHByb3Bvc2FsOiBQcm9wb3NhbCA9IHsKICAgIC8vICAgZ3JvdXBJZCwKICAgIC8vICAgc3RhdHVzOiBTVEFUVVNfQUNUSVZFLAogICAgLy8gICBwYXlsb2FkVHlwZSwKICAgIC8vICAgYXBwcm92YWxzQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgdGhyZXNob2xkOiBncm91cC50aHJlc2hvbGQsCiAgICAvLyAgIGV4cGlyeVJvdW5kLAogICAgLy8gICBwcm9wb3NlcjogVHhuLnNlbmRlciwKICAgIC8vICAgbnVtUGF5bG9hZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgZXBvY2hBdENyZWF0aW9uOiBncm91cC5tZW1iZXJzaGlwRXBvY2gsCiAgICAvLyAgIHBheWxvYWRWZXJzaW9uOiBVaW50NjQoMSksCiAgICAvLyAgIHRvdGFsVHhuczogVWludDY0KDApLAogICAgLy8gfQogICAgaXRvYgogICAgZGlnIDUKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTcKICAgIC8vIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTMtMTAyNQogICAgLy8gY29uc3QgcHJvcG9zYWw6IFByb3Bvc2FsID0gewogICAgLy8gICBncm91cElkLAogICAgLy8gICBzdGF0dXM6IFNUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHBheWxvYWRUeXBlLAogICAgLy8gICBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgLy8gICB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIC8vICAgZXhwaXJ5Um91bmQsCiAgICAvLyAgIHByb3Bvc2VyOiBUeG4uc2VuZGVyLAogICAgLy8gICBudW1QYXlsb2FkczogVWludDY0KDApLAogICAgLy8gICBlcG9jaEF0Q3JlYXRpb246IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCwKICAgIC8vICAgcGF5bG9hZFZlcnNpb246IFVpbnQ2NCgxKSwKICAgIC8vICAgdG90YWxUeG5zOiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjYKICAgIC8vIHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUgPSBjbG9uZShwcm9wb3NhbCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMzCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI2CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjcKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBwaWQgKyBVaW50NjQoMSkKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDE0IC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjcKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBwaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyOQogICAgLy8gZW1pdDxQcm9wb3NhbENyZWF0ZWQ+KHsgcHJvcG9zYWxJZDogcGlkLCBncm91cElkLCBwYXlsb2FkVHlwZSwgcHJvcG9zZXI6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhiMzUxZDg1NyAvLyBtZXRob2QgIlByb3Bvc2FsQ3JlYXRlZCh1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMwogICAgLy8gdGhpcy5fcmVjb3JkQXBwcm92YWwocGlkLCBzdG9yZWQpCiAgICBkaWcgMQogICAgc3dhcAogICAgY2FsbHN1YiBfcmVjb3JkQXBwcm92YWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzQKICAgIC8vIHJldHVybiBwaWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IGJ5dGVzKSAtPiBieXRlczoKX3JlY29yZEFwcHJvdmFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzcKICAgIC8vIHByaXZhdGUgX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IFByb3Bvc2FsKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDM4CiAgICAvLyBjb25zdCByZWNvcmQ6IEFwcHJvdmFsID0geyBzaWduZXI6IFR4bi5zZW5kZXIsIHJvdW5kOiBHbG9iYWwucm91bmQgfQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDM5CiAgICAvLyB0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShyZWNvcmQpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDIzIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOQogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDIKICAgIC8vIHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgPSB1cGRhdGVkLmFwcHJvdmFsc0NvdW50ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MwogICAgLy8gaWYgKHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgPj0gdXBkYXRlZC50aHJlc2hvbGQpIHsKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPj0KICAgIGJ6IF9yZWNvcmRBcHByb3ZhbF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ0CiAgICAvLyB1cGRhdGVkLnN0YXR1cyA9IFNUQVRVU19SRUFEWQogICAgaW50Y18zIC8vIDIKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgKCl9yZWNvcmRBcHByb3ZhbF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMzCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDYKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUodXBkYXRlZCkKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0OAogICAgLy8gZW1pdDxQcm9wb3NhbEFwcHJvdmVkPih7IHByb3Bvc2FsSWQsIHNpZ25lcjogVHhuLnNlbmRlciwgYXBwcm92YWxzQ291bnQ6IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGV4dHJhY3QgMjQgOAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDk4YjNhYzk0IC8vIG1ldGhvZCAiUHJvcG9zYWxBcHByb3ZlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fZGVkdWN0RnJvbUd1YXJkKGN1c3RvZGlhbkdyb3VwSWQ6IHVpbnQ2NCwgYXNzZXRJZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2RlZHVjdEZyb21HdWFyZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTkwCiAgICAvLyBwcml2YXRlIF9kZWR1Y3RGcm9tR3VhcmQoY3VzdG9kaWFuR3JvdXBJZDogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTkxCiAgICAvLyBpZiAoYW1vdW50ID09PSBVaW50NjQoMCkpIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2RlZHVjdEZyb21HdWFyZF9hZnRlcl9pZl9lbHNlQDIKICAgIHJldHN1YgoKX2RlZHVjdEZyb21HdWFyZF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5MgogICAgLy8gY29uc3QgZ3VhcmRLZXkgPSB7IGN1c3RvZGlhbkdyb3VwSWQsIGFzc2V0SWQgfQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gYXNzZXRHdWFyZHMgPSBCb3hNYXA8eyBjdXN0b2RpYW5Hcm91cElkOiB1aW50NjQ7IGFzc2V0SWQ6IHVpbnQ2NCB9LCBBc3NldEd1YXJkPih7IGtleVByZWZpeDogJ2FnJyB9KQogICAgYnl0ZWMgMTMgLy8gImFnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5MwogICAgLy8gYXNzZXJ0KHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLmV4aXN0cywgJ25vIGd1YXJkIGZvciBjdXN0b2RpYW4rYXNzZXQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBubyBndWFyZCBmb3IgY3VzdG9kaWFuK2Fzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5NAogICAgLy8gY29uc3QgZ3VhcmQgPSBjbG9uZSh0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5NQogICAgLy8gYXNzZXJ0KGd1YXJkLmxvY2tlZEFtb3VudCA+PSBhbW91bnQsICdleGNlZWRzIGd1YXJkIGFsbG9jYXRpb24nKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBleGNlZWRzIGd1YXJkIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk2CiAgICAvLyBndWFyZC5sb2NrZWRBbW91bnQgPSBndWFyZC5sb2NrZWRBbW91bnQgLSBhbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTYtMTE5NwogICAgLy8gZ3VhcmQubG9ja2VkQW1vdW50ID0gZ3VhcmQubG9ja2VkQW1vdW50IC0gYW1vdW50CiAgICAvLyB0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS52YWx1ZSA9IGNsb25lKGd1YXJkKQogICAgaW50Y18yIC8vIDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9iZWdpbk9yTmV4dChmaXJzdDogdWludDY0KSAtPiB2b2lkOgpfYmVnaW5Pck5leHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwNQogICAgLy8gcHJpdmF0ZSBfYmVnaW5Pck5leHQoZmlyc3Q6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDYKICAgIC8vIGlmIChmaXJzdCkgb3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IF9iZWdpbk9yTmV4dF9lbHNlX2JvZHlAMgogICAgaXR4bl9iZWdpbgogICAgcmV0c3ViCgpfYmVnaW5Pck5leHRfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwNwogICAgLy8gZWxzZSBvcC5JVHhuQ3JlYXRlLm5leHQoKQogICAgaXR4bl9uZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9zZXRTZW5kZXJJZlNldChzZW5kZXI6IGJ5dGVzKSAtPiB2b2lkOgpfc2V0U2VuZGVySWZTZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMQogICAgLy8gcHJpdmF0ZSBfc2V0U2VuZGVySWZTZXQoc2VuZGVyOiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjEyCiAgICAvLyBpZiAoc2VuZGVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIG9wLklUeG5DcmVhdGUuc2V0U2VuZGVyKHNlbmRlcikKICAgIGZyYW1lX2RpZyAtMQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogX3NldFNlbmRlcklmU2V0X2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgoKX3NldFNlbmRlcklmU2V0X2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlczoKX3N0b3JlUGF5bG9hZEdyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTAKICAgIC8vIHByaXZhdGUgX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5MQogICAgLy8gaWYgKHBheWxvYWQubGVuZ3RoID4gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBieiBfc3RvcmVQYXlsb2FkR3JvdXBfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5MgogICAgLy8gdGhpcy50cmFuc2FjdGlvbkdyb3Vwcyhwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4KS52YWx1ZSA9IGNsb25lKHBheWxvYWQpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkyCiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKCl9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2FjY291bnRTcGVuZChncm91cEluOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKX2FjY291bnRTcGVuZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAxCiAgICAvLyBwcml2YXRlIF9hY2NvdW50U3BlbmQoZ3JvdXBJbjogU2lnbmVyR3JvdXAsIGFtb3VudDogdWludDY0KTogU2lnbmVyR3JvdXAgewogICAgcHJvdG8gMiAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDMKICAgIC8vIGlmIChhbW91bnQgPT09IFVpbnQ2NCgwKSkgcmV0dXJuIGdyb3VwCiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIC0yCiAgICBkdXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDUKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDcKICAgIC8vIGlmIChncm91cC5kYWlseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfYWNjb3VudFNwZW5kX2lmX2JvZHlAMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTYKICAgIC8vIGlmIChncm91cC5tb250aGx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE3CiAgICAvLyBpZiAobm93IC0gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID49IE1PTlRIX1NFQ09ORFMpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgMjU5MjAwMCAvLyAyNTkyMDAwCiAgICA+PQogICAgYnogX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE4CiAgICAvLyBncm91cC5tb250aGx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE5CiAgICAvLyBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDIxCiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBtb250aGx5IGxpbWl0IGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMgogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA3NAogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyNQogICAgLy8gcmV0dXJuIGdyb3VwCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfYWNjb3VudFNwZW5kX2lmX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA4CiAgICAvLyBpZiAobm93IC0gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA+PSBEQVlfU0VDT05EUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBibnogX2FjY291bnRTcGVuZF9pZl9ib2R5QDQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDEyCiAgICAvLyBhc3NlcnQoZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudCA8PSBncm91cC5kYWlseUxpbWl0LCAnZGFpbHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBkYWlseSBsaW1pdCBleGNlZWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTMKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBncm91cC5kYWlseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA1MAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2CgpfYWNjb3VudFNwZW5kX2lmX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA5CiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTAKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA1OAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZVR5cGU6IHVpbnQ2NCwgZ3JvdXA6IGJ5dGVzKSAtPiBieXRlczoKX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMzCiAgICAvLyBwcml2YXRlIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogU2lnbmVyR3JvdXApOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzQKICAgIC8vIGlmIChjaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDM1CiAgICAvLyBhc3NlcnQoKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfUE9MSUNZKSAhPT0gVWludDY0KDApLCAncG9saWN5IGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICAmCiAgICBhc3NlcnQgLy8gcG9saWN5IGFkbWluIHJlcXVpcmVkCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzcKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gZ3JvdXAgYWRtaW4gcmVxdWlyZWQKICAgIGIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZTogYnl0ZXMsIGdyb3VwOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NDcKICAgIC8vIHByaXZhdGUgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlOiBBZG1pbkNoYW5nZSwgZ3JvdXA6IFNpZ25lckdyb3VwKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDQ4CiAgICAvLyBjb25zdCBoYXNHcm91cFByaXYgPSAoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDQ5CiAgICAvLyBpZiAoIWhhc0dyb3VwUHJpdiB8fCBncm91cC5hY3RpdmUgPT09IFVpbnQ2NCgwKSkgewogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5faWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDMKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2lmX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDUwCiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDUyCiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTMKICAgIC8vIGNvbnN0IHdpbGxIYXZlR3JvdXBQcml2ID0gKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTQKICAgIC8vIHJldHVybiAhd2lsbEhhdmVHcm91cFByaXYgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU0CiAgICAvLyByZXR1cm4gIXdpbGxIYXZlR3JvdXBQcml2ICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NAogICAgLy8gcmV0dXJuICF3aWxsSGF2ZUdyb3VwUHJpdiAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDgKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU2CiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NwogICAgLy8gY29uc3Qgd2lsbEJlQWN0aXZlID0gY2hhbmdlLmFjdGl2ZUZsYWcgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1OAogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDEzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1OAogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPD0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTgKICAgIC8vIHJldHVybiAhd2lsbEJlQWN0aXZlICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0Cgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjAKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2NyZWF0ZUdyb3VwKGNoYW5nZTogYnl0ZXMsIGdyb3VwVHlwZTogdWludDY0KSAtPiBieXRlczoKX2NyZWF0ZUdyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1OTgKICAgIC8vIHByaXZhdGUgX2NyZWF0ZUdyb3VwKGNoYW5nZTogQWRtaW5DaGFuZ2UsIGdyb3VwVHlwZTogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTk5CiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwMAogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwMAogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MDEKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IFVpbnQ2NCgxKSwgJ25ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyJykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA2MCAvLyA2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gbmV3IGdyb3VwIHN0YXJ0cyB3aXRoIG9uZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjA0CiAgICAvLyBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwOAogICAgLy8gYWRtaW5Qcml2aWxlZ2VzOiBncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiA/IFVpbnQ2NCgwKSA6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBfY3JlYXRlR3JvdXBfdGVybmFyeV9mYWxzZUAyCiAgICBpbnRjXzAgLy8gMAoKX2NyZWF0ZUdyb3VwX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjA5CiAgICAvLyBhbGxvd2VkQWN0aW9uczogY2hhbmdlLmFsbG93ZWRBY3Rpb25zLAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDc2IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjEwCiAgICAvLyBsaW1pdEFzc2V0SWQ6IGNoYW5nZS5saW1pdEFzc2V0SWQsCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgODQgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MTEKICAgIC8vIGRhaWx5TGltaXQ6IGNoYW5nZS5kYWlseUxpbWl0LAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDkyIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjE0CiAgICAvLyBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjE3CiAgICAvLyBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDEwOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwMy0xNjIzCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIC8vIEZvcmNlIGFkbWluUHJpdmlsZWdlcyB0byAwIGZvciBjdXN0b2RpYW4gZ3JvdXBzIOKAlCB0aGUgY2FsbGVyJ3MgdmFsdWUgaXMgaWdub3JlZC4KICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiA/IFVpbnQ2NCgwKSA6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vICAgZ3JvdXBUeXBlLAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBmcmFtZV9kaWcgOQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgNwogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGJ5dGVjIDI3IC8vIDB4MDA4YQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwNgogICAgLy8gbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwMy0xNjIzCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIC8vIEZvcmNlIGFkbWluUHJpdmlsZWdlcyB0byAwIGZvciBjdXN0b2RpYW4gZ3JvdXBzIOKAlCB0aGUgY2FsbGVyJ3MgdmFsdWUgaXMgaWdub3JlZC4KICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiA/IFVpbnQ2NCgwKSA6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vICAgZ3JvdXBUeXBlLAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MTIKICAgIC8vIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwMy0xNjIzCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIC8vIEZvcmNlIGFkbWluUHJpdmlsZWdlcyB0byAwIGZvciBjdXN0b2RpYW4gZ3JvdXBzIOKAlCB0aGUgY2FsbGVyJ3MgdmFsdWUgaXMgaWdub3JlZC4KICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiA/IFVpbnQ2NCgwKSA6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vICAgZ3JvdXBUeXBlLAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjI0CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MjQKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYyNgogICAgLy8gY29uc3QgbTogTWVtYmVyID0geyBhY2NvdW50VHlwZTogY2hhbmdlLm1lbWJlclR5cGUsIGxhYmVsOiBjaGFuZ2UubWVtYmVyTGFiZWwsIGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyIH0KICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA4CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTggMzIKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCA1MCA4CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDIxIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjI3CiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzIKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA1IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYyNwogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MjkKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjI5CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MzAKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYzMAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDQgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYzMAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MzIKICAgIC8vIGlmIChncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTikgewogICAgZnJhbWVfZGlnIDEwCiAgICBieiBfY3JlYXRlR3JvdXBfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjMzCiAgICAvLyBlbWl0PEN1c3RvZGlhbkdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IGNoYW5nZS5ncm91cE5hbWUsIHRocmVzaG9sZDogY2hhbmdlLnRocmVzaG9sZCB9KQogICAgZnJhbWVfZGlnIDQKICAgIGJ5dGVjIDE1IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0MDQ2MzY0NSAvLyBtZXRob2QgIkN1c3RvZGlhbkdyb3VwQ3JlYXRlZCh1aW50NjQsc3RyaW5nLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwoKX2NyZWF0ZUdyb3VwX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjQwCiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBjaGFuZ2UubWVtYmVyQWRkciwgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlIH0pCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJNZW1iZXJBZGRlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9jcmVhdGVHcm91cF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNjM1CiAgICAvLyBpZiAoKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYnogX2NyZWF0ZUdyb3VwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MzYKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYzNgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYzNgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfY3JlYXRlR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE2MzgKICAgIC8vIGVtaXQ8R3JvdXBDcmVhdGVkPih7IGdyb3VwSWQ6IGdpZCwgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkIH0pCiAgICBmcmFtZV9kaWcgNAogICAgYnl0ZWMgMTUgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBjb25jYXQKICAgIGJ5dGVjIDIwIC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9jcmVhdGVHcm91cF9hZnRlcl9pZl9lbHNlQDgKCl9jcmVhdGVHcm91cF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTYwOAogICAgLy8gYWRtaW5Qcml2aWxlZ2VzOiBncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiA/IFVpbnQ2NCgwKSA6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBiIF9jcmVhdGVHcm91cF90ZXJuYXJ5X21lcmdlQDMK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAHAAEIAoIBqAGAreIEJh4BZwRhcGdjAAQVH3x1BGdjbnQBbQFwBGJvb3QEbmdpZAZwYXVzZWQDdHhnB2NyZWF0b3IBcgJhZwRucGlkAgASBNBwUHoBAAR8YFnmAgAiBAzXNXwCACoCZHABYQMGgQEEbmFtZQN2ZXICAIoCAAoE3t0DqDEZFEQxGEEAqYIXBJFLpjMEFKj/ugTVUVaCBAskPKcErDqaMgREJEX3BD+bijAE9LSG7gT7cIjoBH9R/CgE3K3/lgS2t66tBBmdIUoEf9cvUQT5y0o3BGWqoO0Ey9cyQgRQNBYXBPT6VEwEsoVyygTTffsgBLjmyJYE+QSANTYaAI4XALUBugPxBFUEcAVZBqkHbAgLCC8IrAliCdcKAgouCmkKoQrgCx8LPgtvC5kL2QCABBFXVts2GgCOAQA8AIoCAIv+gQoIiwAyDA1BACqxgQayEIEFshknGLIeJxiyH4v/jQIACwAEs0L/2zIAsgFC//UisgFC/++JNhoBSSJZJQhLARUSRFcCACcZSwFnJwsxAGcnByJnJwgjZycOI2cnBCJnJwkiZycagBdCSUFURUMtQUxHTy1TQUZFLXYyLjAuMGcpImcxAEsBFRZXBgJPAlAnE08CUExQgATinItHTFCwI0M2GgFJIlklCEsBFRJEVwIAMQAiJwtlRBJEIicHZUQURCInBGVEFEQyByInCGVESwIVFlcGAk8DUCMWIhZPBBaAOgCKAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAVBLAlBLAlBMUEsBUEsBUEsBUEsCUEsBUExQSwJQSwMWKEsBUEm8SE8Cv4AKAAAAAAAAAAEAKjEAUIAJAAdjcmVhdG9yUEsBMQBQJwVMUEm8SEy/TwMjCCcITGciJwRlRCMIJwRMZycHI2cpI2dJJw9QSwJQTwNQJxRMULAxAFBMUCcQTFCwI0MiRwIqRwc2GgFHAhVLASJZSYFCEkRPAkxLAlJJTgIiWYFECBJENhoCSSJZSU4CJQtMSRVMVwIAIklLBQxBADNHAiULSwNJTwJZSUsHSU4EEkRLARVSSRVLAYEoWUmBKhJETFIiWYEsCAhFBSMIRQFC/8ZLAyUISwMSRDYaA0kVJBJEF0lFECMNQQAGSw4iiP3EMQAiJwtlRBJEIicHZUQUREsEREsGJVtJRQ1BAYVLC0sFDkEBfSNESwZJgRJbSUUNgT8OREmBCltJRQyBBw5ESYEyW0lFCyEGDkSBOltJRQkjEkEABEsJFEQyByInCGVMSU4DRRFESwdXAgBLCUlXGghLAVciCE8CVyoISwMVFlcGAk8EUElOBUUYSxEWSUUYJxtMUEsLFlBLEBZQSxEWUE8DUE8CUCIWTEsBUE8DFkxLAVBPA1BLAlBMUEsMFlBLAVBLAVAjFlBLCxZQTFBMUEwWSUUSKExQSbxITL8iRQ1LDEsFDEEAeUsMSSULSwNJTgNMWUwjCElFEEsHSwEJSwMVTwIlC0sETFlPAk1SSVcAIEkyAxNESxFLAVAnBUsBUEm9RQEUREsDgShZSwQVSwVOAlJXAgBPBFcgCEsBFRZXBgJPAlBLAScVUE8FUExQSwK8SE8CTL9QJxBMULBC/39LDSMIJwhMZyInBGVEIwgnBExnSwcjE0EAEEsJIxpBAAkiKWVEIwgpTGdLD0knD1BLElBLE1AnFExQsCtMULAjQyJC/oA2GgFJFYEgEkQ2GgJJIlklCEsBFRJEVwIAMQAiJwtlRBJEIicHZUQUREsBMgMTRCcMSwJQSb1FARREMgZLAhUWVwYCTwNQTBYnHExQSwFQSwK8SE8CTL9MJxNQTFAnHUxQsCNDMQAiJwtlRBJEIicHZUQURCIpZUREJwcjZyNDIipHAzYaAUkVJBJEFzYaAkcCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgNJFSQSRBdFCTYaBEkVIxJEIlNFCjYaBUkVJBJEF0lFDCMNQQAGSwoiiPsPSwRJRIEQDkQiJwllRBRESwZJiAb9SRYoTFCBciS6F0QjSwqIFbhJRQlJI0sIiBbYTBZJRQ4nBkxQSb5EIxZcUE8CIlkWXGi/SwlBAAVLB4gG2itLDFCwI0MiRwIqSTYaAUkVJBJEFzYaAkcCFSQSRBc2GgNHAiJZSU4CJQtMSRVMVwIAIklLBQxBADJHAiULSwNJTwJZSUsHSU4EEkRLARVSSRVLASRZSYEKEkRMUiJZgQwICEUFIwhFAUL/x0sDJQhLAxJENhoESRUkEkQXSUUMIw1BAAZLCiKI+jIiJwllRBRESwYlD0EAuksGgQYOQQCyI0RLBERLCBYnBkxQSUUPvkxJTgJFDkRJgRBbIxJEJFtJRQsjEkAAB0sJJRJBAH8jRDIGSwxJTgKBKFsOREkiW4gF3DEASwFXMCASREmBGFsjEkRLCYEHC0sICEyBaFtMFicKTFBJRQ+9RQFBAAdLDSIluhcJSwUISYEQDkRLCUsISU4DSwmIFYxIFksNSU8CXGhJgWBbIwgWXGBOAoFQWw1BAARLCFxQSw5MvyNDIkL/fiJC/0siSSo2GgFJFSQSRBc2GgJHAhVLAYEQWUmBhAESREsCTEsCUiJZgYYBCEsCgTpZSUsCEkRPA0xLA1IiWSUICBJENhoDSRUkEkQXNhoESRUkEkQXSSMNQQAFSSKI+QlLA0mIBQYWKExQSUUISb5MRQhEgXIkuhdESwJJgWxbIQYORCJbSUUGgQwSQQAtSwaBeiS6FyMSREsCJFtLBBJESwOBBUsDiBOPFicWSwFQSbxISwS/K0xQsCNDSwRLBogVakhC/9oiSSo2GgFJFSQSRBc2GgJJFSQSRBc2GgNJFSQSRBdJIw1BAAVJIoj4eksCFklFBycGTFC+TElOAkUHRCRbSUUFIxJAAAdLAyUSQQBPI0QyBksFSU4CgShbDkRJgWBbSwMSRDEASwFXAAhJTwJQJwVMUL1FAURLBzEAUCcXTFC9RQEURChMUIFqJLoXSwGBWFsSREsDTIgTYEgjQyJC/642GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj350sBiAP/I0MiRwIqNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI979LARZJRQYnBkxQSUUHvkxJTgJFBkQkW0lFBCMSQAAHSwIlEkEAMiNEMQBLBElOAlcwIBJMVwAIMQBQJwVMUL1FARFEgQQWSwYkTwK7gASuKrwGSwVQsCNDIkL/yyJHBCpJNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI90FLARZJRQcnBkxQSUUKvkxJTgJFB0QkW0lFBIEDEkAACEsCgQQSQQBoI0QyBksFSU4CgShbDURJIluIAwiBEFsjEkEANyNFBEsEgVBbSwQPQQAjSwGBBwtLBAgWJwpMUElFCb1FAUEABEsHvEhLAyMIRQRC/9JLCLxII0MnFksGUElFCL1FAUH/7EsGvEhC/+UiQv+VNhoBSRUkEkQXSSMNQQAFSSKI9pkiJxllRCInBGVEIicIZUQiJw5lRCInCWVEIicaZURLBRUWVwYCTwZQSRWBJAhPBhaAAgAkTFBPBhZQTwUWUE8EFlBLAxUWVwYCTwRQTwIWVwYCTwJMUE8CUExQK0xQsCNDNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI9htLARYoTFC+RCtMULAjQzYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPXwSwEWJwZMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRUkEkQXNhoDSRUkEkQXSSMNQQAFSSKI9btLAoEHC0sCCBYnCkxQvkQrTFCwI0M2GgFJFSQSRBc2GgJJFYEgEkQ2GgNJFSQSRBdJIw1BAAVJIoj1gEsCFksCUCcFTFC+RCtMULAjQzYaAUkVJBJEFzYaAkkVgSASRDYaA0kVJBJEF0kjDUEABUkiiPVISwIWSwJQJwVMUL1FAScRIk8CVCtMULAjQzYaAUkVJBJEFzYaAkkVgSASRDYaA0kVJBJEF0kjDUEABUkiiPUJSwIWSwJQJxdMUL1FAScRIk8CVCtMULAjQzYaAUkVJBJEF0kjDUEABUkiiPTcIillRBYrTFCwI0M2GgFJFYEgEkQ2GgJJFSQSRBdJIw1BAAVJIoj0tCcMSwJQvUUBJxEiTwJUK0xQsCNDNhoBSRWBIBJENhoCSRUkEkQXSSMNQQAFSSKI9IMnDEsCUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRUkEkQXNhoDSRUkEkQXSSMNQQAFSSKI9FBLAhZLAhZQJw1MUL1FAScRIk8CVCtMULAjQzYaAUkVJBJEFzYaAkkVJBJEFzYaA0kVJBJEF0kjDUEABUkiiPQQSwIWSwIWUCcNTFC+RCtMULAjQ4oBAIv/FihLAVC9RQFEMQBQJwVMUL1FAUSJigEAIkcrKkcqi/8WSScGTFBJvkxJTwJESSRbJRJEMgZLAYEoWw5ESSJbSU4CFihMUElOAkm+TE4DREmBciS6F0RMgSBbSU8CJSS6F0lOAg9BDlqLXYtZSYEYW08CD0SLW4FqJLoXSwGBWFsSRIEQWyMSQQl/IicJZUQURItbgVokuhdJjE1BABaLW4FiJLoXSYxOQQAJMgaLTotNCA9Ei1mBUFuMP4tbgXokuhcjEow5I4xAi1xJjBqMG4tAiz8OQQQPi/+BBwuLQAgWJwpMUEmMEr1FAUAAEYsajByLQCMIjECLHIwaQv/RixK+TIwgRCKMN4sajByLEiIluheLNw1B/9klizcLJQiLEklPAiW6FyUIJLoXSYxMIxJBAN2LIElXAgBMIlmLN0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAaLG4EaWyMaRElXIiAyAxNEgUpbSYxQQQAJiwZXUiAyAxNEizlBAD6LBlcCIEmMADIDEkEAKTIKjCKLUEEAGIsiYItaIk8CiA36ixuMHIs3IwiMN0L/UIsGgUJbQv/jiwCMIkL/1CKMM4tcgSJbQAAciwZXAiBJjAEyAxJBACUyCowji1BBABKLI2CMM4tcizOIDhdIjFxC/7CLBoFCW4wzQv/piwGMI0L/2ItMJRJBAPWLIElXAgBMIlmLN0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAyLG4EaWyUaRElXKiAyAxNEgVJbSYxQQQAJiwxXWiAyAxNEizlBAD+LDIFKW4w0i1BBABqLDFcCIEmMAjIDEkEAIDIKiwyBIltwAEiMNIsMgSJbi1pMizSIDQWLG4wcQv8IiwJC/92LXIEiW0mMUUEATYsMgSJbi1ESQQBCIyKMNUEAH4tQQQAsiwxXAiBJjAMyAxJBABkyCosMgSJbcABIjDWLXIs1iA0dSIxcQv+riwNC/+SLDIFKW4w1Qv/kIkL/u4tMgQMSQQD7iyBJVwIATCJZizdJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSVcCAIsbgRpbgQQaREsBJVtJRDIIE0RMgQpbSYEFDkSBBBNESYEQWUsBgRJZSwJPAksCUkmMESJZSU4DjD5LAYEUWUsCTwJLAlIiWUsCgRZZSwNPA0sCUiJZSwOBGFlPBE8DTwJSIllPA4EQDkRLAoEEDkRLASQOREkkDkROAggIJA5EIoxJIow4iziLPgxJjENBACiLEVcCAItDRIs4SU4CJQtLAUxZSlklCFhXAgAVi0kIjEkjCIw4Qv/Ni0mBgBAORIsbjBxC/aSLTIEEEkEAC4sbgRpbJBpEQv2Ri0yBBRJBAGWLIElXAgBMIlmLN0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJXAgCLG4EaW4EQGkRJgSZZSwEhBVlSVwIAFUmMRUEACItFgSASQQAJI0SLG4wcQv0oIkL/9ItMgQYSRIsgSVcCAEwiWYs3SSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUosbSYEaW4EgGkRJgRJbIxpEgXpbIxNEVyIgMgMTREL/njIGFotcTFxii1tJvEhMvyKMSiOMQYtBiz8OQQTwi/+BBwuLQQgWJwpMUEmMFb1FAUEE0YsVvkyMIUQijDqLFSIluheLOg1BBLuLShSMNiWLOgslCIsVSU8CJboXJQgkuhdJjFMjEkEAjIshSVcCAEwiWYs6SSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMB0lXAgCMJIs2iApHI7IQIrIBSVcCIIgKRklXIiCyB0mBQluyCIFKW0EAB4sHV1IgsgmLJEmBcFlLARVSVwIASYwpKhNBAASLKbIFi0ojCIxKizojCIw6Qv9Ii1MlEkEAh4shSVcCAEwiWYs6SSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMCElXAgCMJIs2iAm0gQSyECKyAUlXAiCICbJJgSJbshFJVyogshRJgUpbshKBUltBAAeLCFdaILIViyRJgXhZSwEVUlcCAEmMKioTQf9qiyqyBUL/Y4tTgQMSQQFAiyFJVwIATCJZizpJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSVcCAElOAowkizaICSWBBrIQIrIBSSVbshiBCluyGUmBGFlJTgKMLEkVTE4CUlcCAEmMJyoTQQAEiyeyBSKMN4skSYEQWUsBgRJZSYwtUkmMCSJZizcNSYxEQQAkiwlXAgCLRESLN0lOAiULSwFMWUpZJQhYVwIAshojCIw3Qv+/Iow7iyRJgRRZSYwuiy1MUkmMCiJZizsNQQAZiwpXAgCLO0lOAoEgC4EgWLIcIwiMO0L/zyKMPIskSYEWWUmML4ssUkmMCyJZizwNQQAWiwtXAgCLPElOAiQLW7IwIwiMPEL/0yKMPYskiy6LL1JJjA0iWYs9DUH+MYsNVwIAiz1JTgIkC1uyMiMIjD1C/9iLU4EEEkEAj4shSVcCAEwiWYs6SSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMDklXAgCMJIs2iAfdJbIQIrIBJVtB/cqLJEkkWUsBgQpZSwJPAksCUlcCALIKSwGBDFlLAk8CSwJSVwIAsgtLARVSVwIAsj+LDkmBEFuyDEmBGFuyDYEgW7IOQv2Ei1OBBRJBAQ+LIUlXAgBMIlmLOkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjA9JVwIAjCSLNogHRoEDshAisgElW0mMS0AAu4sPSYEKW7IiSYESW7IjgRpbIhOyJIskSYEgWUsBgSJZSYwwUlcCAEmMKCoTQQAEiyiyJYskSYEkWUmMMYswTFJXAgBJjCoqE0EABIsqsiaLJEmBJllJjDKLMUxSVwIASYwrKhNBAASLK7IniyRJIQVZizJMUlcCAEmMJRWBIBJBAASLJbIoiw9JVyogsilJV0ogsipJV2ogsitXiiCyLIskSSEFWUsBFVJXAgBJjCYqE0H8e4smsgVC/HSLS7IhQv/Ei1OBBhJB/GWLIUlXAgBMIlmLOkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjBBJVwIAjCSLNogGLyOyECKyAVcCIEmMBEmIBisyAxJBACoyCrIHIrIIixBXIiCyIIskSYFAWUsBFVJXAgBJjCgqE0H77ososgVC++eLBEL/04tBIwiMQUL7CLOBAxaLWCRPAruABDXGfv2LV1CwiScWi1dQSYwUSb5MjBdEIiS6F0mMT4EMEkmMQkEEkItbgXokuhcjEkSLFCRJuheLWhJEi08jEkEACosXIogHC0hC/6mLTyUSQQBrixRJJEm6F0sBgwISILpMFklLAlAnBUsBUEm9RQEURE8EgTIkuheLF0mBOllLARVSVwIATBZLARUWVwYCTwJQSwEnFVBPBlBMUEsCvEhPAky/KE8DUEmBCiS6FyMIFoEKTLtQJxBMULBC/zeLT4EDEkEAWIsUSSRJuhdMgwISILpMFklPAlAnBUsBUEm9RQFEKE8DUEm+REsBgQokuhcjCUsCJSS6F0sBDkRPA7xIFlwKSYFqWyMIFlxqSwG8SL+ABCsUwsFMULBC/teLTyQSQQBKixSDAhIguicMSwFQSb1FARREixdJgTpZSwEVUlcCADIGSwEVFlcGAk8CUEwWJxxMUEsBUEsCvEhPAky/TCcTUExQJx1MULBC/oaLT4EJEkEAH4sUgwISILonDEsBUEm9RQFEvEiABNtMpSpMULBC/l+LT4EEEkEAKIsUSSRJuhcWKEsBUE8CgTwkukkXSwKBCiS6Fw5EJUy7JxJMULBC/i+LT4EFEkEAeYsUSSRJuhcWSYwZKExQSYwWSb5ETIEiJLoXSwKBVCS6SRdPAhNLA4FMJLpPA0xcGk8CXCJLAoFcJLpcKksCgWQkulxCTwKBbCS6XFpMQQAZMgciFk8CSwFcMk8CFkxLAVw6TwJcSkxcUosWSbxITL8nEosZULBC/a6LT4EGEkEAkosUJEm6FxYoTFBJvkRMgXokuhcURIsXTIgEcklOA4wdSU4DjBcUREmBElsjGoxGSwFXRAiMBUyBRFsjGoxHgXJbSYxSQQAwi0ZBACuLR0AAJiIpZUQjCSlMZ4sdiwVcEosXVwgIKEsBUEm8SE8CvycSTFCwQv0vi1JB/96LRkD/2YtHQf/UIillRCMIKUxnQv/Ii0+BBxJBAJiLFEkkSboXFihMUEm+TIweREmBciS6F4xUTIF0JLoXSYxVIhOMVoF6JLoXIxNBAC6LF4seiAO8SU4DjB6MFxREgRJbIxpJjEhBADKLVEEALYtVQAAoIillRCMJKUxni1YWix5MXHKLF1cICChLAVBJvEhPAr8nEkxQsEL8j4tIQf/ci1RA/9eLVUH/0iIpZUQjCClMZ0L/xotPgQsSQQAKixcjiAPESEL8YotCQQA3ixQkSboXFkmMGChMUEkhBCS6FxREvEgiJwRlREEACyInBGVEIwknBExngATMbLqWixhQsEL8JotPgQ0SQQBxixRJJEm6F0yBVCS6F0wWKEsBUEmME4F6JLoXIxJETBZQSYwfJw1MUEm9RQFBACGLFIF8JLokTLuLFIF8JLoXFosfTFCABKUSk6pMULBC+84yBosUgXwkuhdMFkwWUL+LE0khBCS6FyMIFiEETLtC/8eLT4EOEkEATIsUSSRJuhdMgVQkuhdMFihLAVBJgXokuhcjEkRPAhZPAkxQJw1LAVBJvUUBRLxISwEhBCS6FyMJFk8CIQRPAruABMq3GYhMULBC+1mLFIF0JLoXIhMnCUsBZxaABMSnkmNMULBC+z6LT4tciAH9SEL7eYteQvGjigMBIicHZUQjEkSL/zIGDUSL/RYoSwFQIicOZURLASUkuhcxAE8DgWokuhcjFksFSwFQi/4WTEsBUCIWTEsBUE8GFlCL/xZQTwVQSwFQTwQWUE8DUExQSwIWJwZLAVBLAr9LAyMIJw5MZzEATE8FUE8DUExQgASzUdhXTFCwSwFMiAACSImKAgExADIGFlAxAIv+FklOA0xQJxdMUEy/i/+BGFsjCBaL/0xcGEcCgRhbTIEgWw9BAAQlFlwIJwaLAElOAlBPAklOAr8xAExXGAhOAlBMUIAEmLOslExQsIv/TImKAwCL/0AAAYmL/RaL/hZQJw1MUEm9RQFESb5IJFtJi/8PRIv/CRYkTLuJigEAi/9BAAKxibaJigEAi/8yAxNBAASL/7IAiYoDAYv/IllBABOL/YEHC4v+CBYnCkxQSbxIi/+/i/+JigICIiqL/0AACIv+SU8DTwOJMgeMAYv+gSpbQABMi/6MAIsAgUJbQQA3iwCBUluLAUwJgYCangEPQQAOIhaLAExcSosBFlxSjACLAEmBSluL/whLAYFCW0sBD0QWXEqMAIsAi/5PA08DiYv+gTpbiwFMCYGAowUPQAAei/6MAIsASYEyW4v/CEsBgSpbSwEPRBZcMowAQv+JIhaL/kxcMosBFlw6jABC/9WKAgGL/oEFEkEAC4v/gRJbJRpEi/+Ji/+BElsjGkRC//KKAgMqi/+BElsjGkEACIv/gXJbQAAIIov+i/9PA4mL/iJbSYwAgQYSQQAfi/6BRFsjGkAAESIpZUQjDkEACCOL/ov/TwOJIkL/9YsAgQcSQQAdi/6BdFtAABEiKWVEIw5BAAgji/6L/08DiSJC//Uii/6L/08DiYoCASJHBDIHIicIZUSL/oE8W0kjDkSL/oEQWYv+gTpZSU4Ci/5OAlJXAgCL/yMSSUEBICKL/ldMCIv+V1QIi/5XXAiL/ldkCIv+V2wIiwlJFRZXBgJMUElOBowAiwcWSYwCJxtMUCMWTEsBUE8IFlBPBlBPBVBPBFAiFkxLAVCLBRZMSwFQTwVQSwJQTFBPA1BLAVBLAVBPAlCL/xZQTFBMUIsGSU4CFkmMBChLAVBJvEhPAr+L/hWL/osITwJSVwIAi/5XEiCL/lcyCElOAowDSwIVFlcGAk8DUE8CJxVQSwJQTFBOAlBJjAEnBUxQSbxITL8jCCcITGciJwRlRCMIJwRMZ4sKQQAjiwQnD1CLAlCLAFCABEBGNkVMULCLAYsDUCcQTFCwi/6MAImL/oFEWyMaQQAJIillRCMIKUxniwQnD1CLAlCLAFAnFExQsEL/y4v+gURbQv7Z", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }