@akta/sdk 1.3.21-canary → 1.3.22-canary

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/{chunk-BLFSBOWL.mjs → chunk-2BI2TAAG.mjs} +79 -4
  2. package/dist/{chunk-BLFSBOWL.mjs.map → chunk-2BI2TAAG.mjs.map} +1 -1
  3. package/dist/{chunk-3SKDWCEX.js → chunk-HO5ZGGPJ.js} +9 -9
  4. package/dist/{chunk-3SKDWCEX.js.map → chunk-HO5ZGGPJ.js.map} +1 -1
  5. package/dist/chunk-LDPF6M2T.mjs +2285 -0
  6. package/dist/chunk-LDPF6M2T.mjs.map +1 -0
  7. package/dist/chunk-PBSXCDLO.js +2285 -0
  8. package/dist/chunk-PBSXCDLO.js.map +1 -0
  9. package/dist/{chunk-QGWRGXS3.mjs → chunk-W4Y2NMFQ.mjs} +2 -2
  10. package/dist/{chunk-7QSJ5YHV.js → chunk-XAKJQPSA.js} +79 -4
  11. package/dist/chunk-XAKJQPSA.js.map +1 -0
  12. package/dist/dao/index.js +3 -3
  13. package/dist/dao/index.mjs +2 -2
  14. package/dist/generated/AbstractedAccountUpdateStubClient.d.ts +569 -0
  15. package/dist/generated/PollClient.d.ts +272 -19
  16. package/dist/generated/PollFactoryClient.d.ts +85 -0
  17. package/dist/generated/SubscriptionsPluginClient.d.ts +88 -0
  18. package/dist/generated/WalletFactorySunsetContractClient.d.ts +1541 -0
  19. package/dist/index.js +4 -4
  20. package/dist/index.mjs +3 -3
  21. package/dist/poll/factory.d.ts +5 -1
  22. package/dist/poll/index.js +2 -2
  23. package/dist/poll/index.mjs +1 -1
  24. package/dist/poll/types.d.ts +3 -0
  25. package/dist/wallet/index.js +2 -2
  26. package/dist/wallet/index.mjs +1 -1
  27. package/dist/wallet/plugins/subscriptions.d.ts +7 -0
  28. package/package.json +2 -1
  29. package/dist/chunk-7QSJ5YHV.js.map +0 -1
  30. package/dist/chunk-SSRHC4FP.mjs +0 -2113
  31. package/dist/chunk-SSRHC4FP.mjs.map +0 -1
  32. package/dist/chunk-WGNJNLA2.js +0 -2113
  33. package/dist/chunk-WGNJNLA2.js.map +0 -1
  34. /package/dist/{chunk-QGWRGXS3.mjs.map → chunk-W4Y2NMFQ.mjs.map} +0 -0
@@ -29,7 +29,7 @@ import {
29
29
  import { ABIStructType, getStructValueFromTupleValue } from "@algorandfoundation/algokit-utils/abi";
30
30
  import { AppClient as _AppClient } from "@algorandfoundation/algokit-utils/app-client";
31
31
  import { AppFactory as _AppFactory } from "@algorandfoundation/algokit-utils/app-factory";
32
- var APP_SPEC = { "name": "AbstractedAccount", "structs": { "AbstractAccountBoxMBRData": [{ "name": "plugins", "type": "uint64" }, { "name": "namedPlugins", "type": "uint64" }, { "name": "escrows", "type": "uint64" }, { "name": "allowances", "type": "uint64" }, { "name": "executions", "type": "uint64" }, { "name": "domainKeys", "type": "uint64" }, { "name": "escrowExists", "type": "bool" }, { "name": "newEscrowMintCost", "type": "uint64" }], "AllowanceInfo": [{ "name": "type", "type": "uint8" }, { "name": "max", "type": "uint64" }, { "name": "amount", "type": "uint64" }, { "name": "spent", "type": "uint64" }, { "name": "interval", "type": "uint64" }, { "name": "last", "type": "uint64" }, { "name": "start", "type": "uint64" }, { "name": "useRounds", "type": "bool" }], "AllowanceKey": [{ "name": "escrow", "type": "string" }, { "name": "asset", "type": "uint64" }], "EscrowInfo": [{ "name": "id", "type": "uint64" }, { "name": "locked", "type": "bool" }], "ExecutionInfo": [{ "name": "groups", "type": "byte[32][]" }, { "name": "firstValid", "type": "uint64" }, { "name": "lastValid", "type": "uint64" }], "FactoryUpdateSettings": [{ "name": "allowed", "type": "bool" }, { "name": "automatic", "type": "bool" }], "PluginInfo": [{ "name": "escrow", "type": "uint64" }, { "name": "delegationType", "type": "uint8" }, { "name": "lastValid", "type": "uint64" }, { "name": "cooldown", "type": "uint64" }, { "name": "methods", "type": "(byte[4],uint64,uint64)[]" }, { "name": "admin", "type": "bool" }, { "name": "useRounds", "type": "bool" }, { "name": "useExecutionKey", "type": "bool" }, { "name": "coverFees", "type": "bool" }, { "name": "canReclaim", "type": "bool" }, { "name": "lastCalled", "type": "uint64" }, { "name": "start", "type": "uint64" }], "PluginKey": [{ "name": "plugin", "type": "uint64" }, { "name": "caller", "type": "address" }, { "name": "escrow", "type": "string" }] }, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version", "desc": "The version of the abstracted account application" }, { "type": "uint64", "name": "akitaDAO" }, { "type": "address", "name": "controlledAddress", "desc": "The address of the abstracted account. If zeroAddress, then the address of the contract account will be used" }, { "type": "address", "name": "admin", "desc": "The address of the admin for this application" }, { "type": "string", "name": "domain", "desc": "The domain associated with the admin account" }, { "type": "uint64", "name": "escrowFactory", "desc": "The app ID of the escrow factory to use for creating escrows" }, { "type": "uint64", "name": "revocationApp", "desc": "The app ID of the revocation app associated with this abstracted account" }, { "type": "string", "name": "nickname", "desc": "A user-friendly name for this abstracted account" }, { "type": "address", "name": "referrer", "desc": "The address that referred the creation of this wallet" }, { "type": "byte[32]", "name": "salt" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "desc": "Create an abstracted account application.\nThis is not part of ARC58 and implementation specific.", "events": [], "recommendations": {} }, { "name": "register", "args": [{ "type": "string", "name": "escrow", "desc": "The name of the escrow to register, or empty string for the main account" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Register the abstracted account with the escrow factory.\nThis allows apps to correlate the account with the app without needing\nit to be explicitly provided.", "events": [], "recommendations": {} }, { "name": "update", "args": [{ "type": "string", "name": "version", "desc": "the version of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["UpdateApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setDomain", "args": [{ "type": "string", "name": "domain", "desc": "The domain to associate with the admin account" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Set the domain associated with the admin account", "events": [], "recommendations": {} }, { "name": "setRevocationApp", "args": [{ "type": "uint64", "name": "app", "desc": "The app ID of the new revocation app" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the revocation app associated with the contract", "events": [], "recommendations": {} }, { "name": "setAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO", "desc": "The app ID of the new Akita DAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the Akita DAO associated with the contract", "events": [], "recommendations": {} }, { "name": "setNickname", "args": [{ "type": "string", "name": "nickname", "desc": "the new nickname of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the nickname of the wallet", "events": [], "recommendations": {} }, { "name": "setAvatar", "args": [{ "type": "uint64", "name": "avatar", "desc": "the new avatar of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the avatar of the wallet", "events": [], "recommendations": {} }, { "name": "setBanner", "args": [{ "type": "uint64", "name": "banner", "desc": "the new banner of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the banner of the wallet", "events": [], "recommendations": {} }, { "name": "setBio", "args": [{ "type": "string", "name": "bio", "desc": "the new bio of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the bio of the wallet", "events": [], "recommendations": {} }, { "name": "setFactoryUpdateSettings", "args": [{ "type": "bool", "name": "allowed", "desc": "whether the admin can update the wallet from the factory" }, { "type": "bool", "name": "automatic", "desc": "whether the wallet updates from the factory can be triggered automatically" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes permissions on factory pushed contract wallet updates", "events": [], "recommendations": {} }, { "name": "arc58_changeAdmin", "args": [{ "type": "address", "name": "newAdmin", "desc": "The new admin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Attempt to change the admin for this app. Some implementations MAY not support this.", "events": [], "recommendations": {} }, { "name": "arc58_pluginChangeAdmin", "args": [{ "type": "address", "name": "newAdmin", "desc": "The new admin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Attempt to change the admin via plugin.", "events": [], "recommendations": {} }, { "name": "arc58_verifyAuthAddress", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Verify the abstracted account is rekeyed to this app", "events": [], "recommendations": {} }, { "name": "arc58_rekeyTo", "args": [{ "type": "address", "name": "address", "desc": "The address to rekey to" }, { "type": "bool", "name": "flash", "desc": "Whether or not this should be a flash rekey. If true, the rekey back to the app address must done in the same txn group as this call" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Rekey the abstracted account to another address. Primarily useful for rekeying to an EOA.", "events": [], "recommendations": {} }, { "name": "arc58_canCall", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to check" }, { "type": "uint64", "name": "type", "desc": "0 = Other (specific address), 1 = Global (anyone), 2 = Admin (current admin)" }, { "type": "address", "name": "address", "desc": "The address that will trigger the plugin (used when type = Other)" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "byte[4]", "name": "method", "desc": "The method selector being called on the plugin" }], "returns": { "type": "bool", "desc": "Whether the plugin can be called with these parameters" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Check whether the plugin can be used", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToPlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to rekey to" }, { "type": "uint64", "name": "type", "desc": "0 = Other (Txn.sender), 1 = Global (anyone), 2 = Admin (current admin)" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group. If the plugin has method restrictions, these indices must match the methods used on each subsequent call to the plugin within the group" }, { "type": "(uint64,uint64)[]", "name": "fundsRequest", "desc": "If the plugin is using an escrow, this is the list of funds to transfer to the escrow for the plugin to use during execution" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Temporarily rekey to an approved plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The name of the plugin to rekey to" }, { "type": "uint64", "name": "type" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group. If the plugin has method restrictions, these indices must match the methods used on each subsequent call to the plugin within the group" }, { "type": "(uint64,uint64)[]", "name": "fundsRequest", "desc": "If the plugin is using an escrow, this is the list of funds to transfer to the escrow for the plugin to use during execution" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Temporarily rekey to a named plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_addPlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to add" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin, or the global zero address for any address" }, { "type": "string", "name": "escrow", "desc": "The escrow account to use for the plugin, if any. If empty, no escrow will be used, if the named escrow does not exist, it will be created" }, { "type": "bool", "name": "admin", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "uint8", "name": "delegationType", "desc": "The ownership of the delegation for last_interval updates" }, { "type": "uint64", "name": "lastValid", "desc": "The timestamp or round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of seconds or rounds that must pass before the plugin can be called again" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" }, { "type": "bool", "name": "useRounds", "desc": "Whether the plugin uses rounds for cooldowns and lastValid, defaults to timestamp" }, { "type": "bool", "name": "useExecutionKey", "desc": "Whether the plugin requires an execution key to be used" }, { "type": "bool", "name": "coverFees", "desc": "Whether the plugin reimburses the caller for transaction fees" }, { "type": "bool", "name": "canReclaim", "desc": "Whether the plugin is allowed to reclaim funds from escrows via arc58_pluginReclaim" }, { "type": "bool", "name": "defaultToEscrow", "desc": "Whether to use the named escrow as the default escrow (plugin key uses empty string)" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add an app to the list of approved plugins", "events": [], "recommendations": {} }, { "name": "assignDomain", "args": [{ "type": "address", "name": "caller", "desc": "The address of the passkey" }, { "type": "string", "name": "domain", "desc": "The domain to assign to the passkey" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Assign a domain to a passkey", "events": [], "recommendations": {} }, { "name": "arc58_removePlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to remove" }, { "type": "address", "name": "caller", "desc": "The address that was allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an app from the list of approved plugins", "events": [], "recommendations": {} }, { "name": "arc58_addNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The plugin name" }, { "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to add" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin, or the global zero address for any address" }, { "type": "string", "name": "escrow", "desc": "The escrow account to use for the plugin, if any. If empty, no escrow will be used, if the named escrow does not exist, it will be created" }, { "type": "bool", "name": "admin", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "uint8", "name": "delegationType", "desc": "The ownership of the delegation for last_interval updates" }, { "type": "uint64", "name": "lastValid", "desc": "The timestamp or round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of seconds or rounds that must pass before the plugin can be called again" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" }, { "type": "bool", "name": "useRounds", "desc": "Whether the plugin uses rounds for cooldowns and lastValid, defaults to timestamp" }, { "type": "bool", "name": "useExecutionKey", "desc": "Whether the plugin requires an execution key to be used" }, { "type": "bool", "name": "coverFees", "desc": "Whether the plugin reimburses the caller for transaction fees" }, { "type": "bool", "name": "canReclaim", "desc": "Whether the plugin is allowed to reclaim funds from escrows via arc58_pluginReclaim" }, { "type": "bool", "name": "defaultToEscrow", "desc": "Whether to use the named escrow as the default escrow (plugin key uses empty string)" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add a named plugin", "events": [], "recommendations": {} }, { "name": "arc58_removeNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The plugin name" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove a named plugin", "events": [], "recommendations": {} }, { "name": "arc58_newEscrow", "args": [{ "type": "string", "name": "escrow", "desc": "The name of the escrow to create" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Create a new escrow for the controlled address", "events": [], "recommendations": {} }, { "name": "arc58_toggleEscrowLock", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to lock or unlock" }], "returns": { "type": "(uint64,bool)", "struct": "EscrowInfo" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Lock or Unlock an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_reclaim", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to reclaim funds from" }, { "type": "(uint64,uint64,bool)[]", "name": "reclaims", "desc": "The list of reclaims to make from the escrow" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Transfer funds from an escrow back to the controlled address.", "events": [], "recommendations": {} }, { "name": "arc58_pluginReclaim", "args": [{ "type": "uint64", "name": "plugin", "desc": "The plugin app ID" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow to reclaim funds from" }, { "type": "(uint64,uint64,bool)[]", "name": "reclaims", "desc": "The list of reclaims to make from the escrow" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Transfer funds from an escrow back to the controlled address via a plugin / allowed caller.\nThe plugin must have canReclaim set to true. CloseOut on asset transfers is blocked when the escrow is locked.", "events": [], "recommendations": {} }, { "name": "arc58_optInEscrow", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to opt-in to" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to opt-in to" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt-in an escrow account to assets", "events": [], "recommendations": {} }, { "name": "arc58_pluginOptInEscrow", "args": [{ "type": "uint64", "name": "plugin", "desc": "The plugin app ID" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow to opt-in assets for" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to opt-in to" }, { "type": "pay", "name": "mbrPayment", "desc": "The payment txn that is used to pay for the asset opt-in" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt-in an escrow account to assets via a plugin / allowed caller", "events": [], "recommendations": {} }, { "name": "arc58_addAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to add the allowance for" }, { "type": "(uint64,uint8,uint64,uint64,uint64,bool)[]", "name": "allowances", "desc": "The list of allowances to add" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add an allowance for an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_removeAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to remove the allowance for" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to remove the allowance for" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an allowances for an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_addExecutionKey", "args": [{ "type": "byte[32]", "name": "lease", "desc": "The 32-byte lease key that uniquely identifies this execution" }, { "type": "byte[32][]", "name": "groups", "desc": "The list of 32-byte group IDs that are authorized under this key" }, { "type": "uint64", "name": "firstValid", "desc": "The first round or timestamp when this key becomes valid" }, { "type": "uint64", "name": "lastValid", "desc": "The last round or timestamp when this key expires" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add or extend an execution key for pre-authorized plugin usage", "events": [], "recommendations": {} }, { "name": "arc58_removeExecutionKey", "args": [{ "type": "byte[32]", "name": "lease", "desc": "The 32-byte lease key identifying the execution to remove" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an execution key. Can be called by admin at any time, or by anyone after the key has expired.", "events": [], "recommendations": {} }, { "name": "arc58_getAdmin", "args": [], "returns": { "type": "address" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get the admin of this app. This method SHOULD always be used rather than reading directly from state\nbecause different implementations may have different ways of determining the admin.", "events": [], "recommendations": {} }, { "name": "arc58_getPlugins", "args": [{ "type": "(uint64,address,string)[]", "name": "keys", "desc": "The plugin keys to look up" }], "returns": { "type": "(uint64,uint8,uint64,uint64,(byte[4],uint64,uint64)[],bool,bool,bool,bool,bool,uint64,uint64)[]", "desc": "The plugin info for each key, or empty plugin info if the key does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get plugin info for a list of plugin keys", "events": [], "recommendations": {} }, { "name": "arc58_getNamedPlugins", "args": [{ "type": "string[]", "name": "names", "desc": "The plugin names to look up" }], "returns": { "type": "(uint64,uint8,uint64,uint64,(byte[4],uint64,uint64)[],bool,bool,bool,bool,bool,uint64,uint64)[]", "desc": "The plugin info for each name, or empty plugin info if the name does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get plugin info for a list of named plugins", "events": [], "recommendations": {} }, { "name": "arc58_getEscrows", "args": [{ "type": "string[]", "name": "escrows", "desc": "The escrow names to look up" }], "returns": { "type": "(uint64,bool)[]", "desc": "The escrow info for each name, or empty escrow info if the name does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get escrow info for a list of escrow names", "events": [], "recommendations": {} }, { "name": "arc58_getAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to look up allowances for" }, { "type": "uint64[]", "name": "assets", "desc": "The asset IDs to look up allowances for" }], "returns": { "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,bool)[]", "desc": "The allowance info for each asset, or empty allowance info if no allowance exists" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get allowance info for a list of assets on a given escrow", "events": [], "recommendations": {} }, { "name": "arc58_getExecutions", "args": [{ "type": "byte[32][]", "name": "leases", "desc": "The 32-byte lease keys to look up" }], "returns": { "type": "(byte[32][],uint64,uint64)[]", "desc": "The execution info for each lease, or empty execution info if the lease does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get execution key info for a list of leases", "events": [], "recommendations": {} }, { "name": "arc58_getDomainKeys", "args": [{ "type": "address[]", "name": "addresses", "desc": "The addresses to look up domain keys for" }], "returns": { "type": "string[]", "desc": "The domain string for each address, or empty string if no domain is assigned" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get domain key assignments for a list of addresses", "events": [], "recommendations": {} }, { "name": "mbr", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow name to calculate MBR for" }, { "type": "uint64", "name": "methodCount", "desc": "The number of method restrictions on the plugin" }, { "type": "string", "name": "plugin", "desc": "The plugin name to calculate named plugin MBR for" }, { "type": "uint64", "name": "groups", "desc": "The number of execution groups to calculate MBR for" }], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,bool,uint64)", "struct": "AbstractAccountBoxMBRData", "desc": "The MBR costs for plugins, named plugins, escrows, allowances, domain keys, executions, and new escrow creation" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Calculate the minimum balance requirements for various box operations", "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 12, "bytes": 30 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the version of the wallet contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app id of the akita DAO" }, "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=", "desc": "The admin of the abstracted account. This address can add plugins and initiate rekeys" }, "domain": { "keyType": "AVMString", "valueType": "AVMString", "key": "ZG9tYWlu", "desc": "The domain associated with the admin account of the abstracted account" }, "controlledAddress": { "keyType": "AVMString", "valueType": "address", "key": "Y29udHJvbGxlZF9hZGRyZXNz", "desc": "The address this app controls" }, "nickname": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmlja25hbWU=", "desc": "A user defined nickname for their wallet" }, "avatar": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXZhdGFy", "desc": "A user defined NFT to display as their avatar that the user owns" }, "banner": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YmFubmVy", "desc": "A user defined NFT to display as their banner that the user owns" }, "bio": { "keyType": "AVMString", "valueType": "AVMString", "key": "Ymlv", "desc": "A user defined description" }, "lastUserInteraction": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF91c2VyX2ludGVyYWN0aW9u", "desc": "The last time the contract was interacted with in unix time" }, "lastChange": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF9jaGFuZ2U=", "desc": "The last time state has changed on the abstracted account (not including lastCalled for cooldowns) in unix time" }, "spendingAddress": { "keyType": "AVMString", "valueType": "address", "key": "c3BlbmRpbmdfYWRkcmVzcw==", "desc": "[TEMPORARY STATE FIELD] The spending address for the currently active plugin" }, "currentPlugin": { "keyType": "AVMString", "valueType": "PluginKey", "key": "Y3VycmVudF9wbHVnaW4=", "desc": "[TEMPORARY STATE FIELD] The current plugin key being used" }, "rekeyIndex": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVrZXlfaW5kZXg=", "desc": "[TEMPORARY STATE FIELD] The index of the transaction that created the rekey sandwich" }, "escrowFactory": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXNjcm93X2ZhY3Rvcnk=", "desc": "the spending account factory to use for allowances" }, "factoryApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmFjdG9yeV9hcHA=", "desc": "the application ID for the contract that deployed this wallet" }, "revocation": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmV2b2NhdGlvbg==", "desc": "The app that can revoke plugins" }, "referrer": { "keyType": "AVMString", "valueType": "address", "key": "cmVmZXJyZXI=", "desc": "The address that created the wallet" }, "factoryUpdateSettings": { "keyType": "AVMString", "valueType": "FactoryUpdateSettings", "key": "dXBkYXRlX3NldHRpbmdz", "desc": "Factory Update Settings" }, "salt": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "c2FsdA==", "desc": "Pseudo Random Function extension salt" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "plugins": { "keyType": "PluginKey", "valueType": "PluginInfo", "desc": "Plugins that add functionality to the controlledAddress and the account that has permission to use it.", "prefix": "cA==" }, "namedPlugins": { "keyType": "AVMString", "valueType": "PluginKey", "desc": "Plugins that have been given a name for discoverability", "prefix": "bg==" }, "escrows": { "keyType": "AVMString", "valueType": "EscrowInfo", "desc": "the escrows that this wallet has created for specific callers with allowances", "prefix": "ZQ==" }, "allowances": { "keyType": "AllowanceKey", "valueType": "AllowanceInfo", "desc": "The Allowances for plugins installed on the smart contract with useAllowance set to true", "prefix": "YQ==" }, "executions": { "keyType": "AVMBytes", "valueType": "ExecutionInfo", "desc": "execution keys", "prefix": "eA==" }, "domainKeys": { "keyType": "address", "valueType": "AVMString", "desc": "Passkeys on the account and their corresponding domain names\naddress : domain\nIMPORTANT: a passkey attached to the akita domain is a co-admin passkey\nwe explicitly have this feature so that the wallet can be used on multiple devices\nwhere the admin passkey may be incompatible\nwe track this onchain so we can assist with 'sign-in from another device' functionality\nas well as uses like DAO based domain revocation", "prefix": "ZA==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1265, 2905, 3080, 3325, 4434, 4605, 4621, 4812, 4968, 5108, 5232, 5520, 5783, 6040, 6148, 6396, 6467, 6555, 6731, 8128], "errorMessage": "Box must have value" }, { "pc": [5735], "errorMessage": "Bytes has valid prefix" }, { "pc": [1127], "errorMessage": "ERR:ACBC" }, { "pc": [4249, 5449], "errorMessage": "ERR:ADMN" }, { "pc": [6550, 6696, 6726, 6819], "errorMessage": "ERR:ALEX" }, { "pc": [1671], "errorMessage": "ERR:APNE" }, { "pc": [1843], "errorMessage": "ERR:AUAM" }, { "pc": [1107], "errorMessage": "ERR:BDEP" }, { "pc": [7363], "errorMessage": "ERR:CCOR" }, { "pc": [3761], "errorMessage": "ERR:EALW" }, { "pc": [3012], "errorMessage": "ERR:EESC" }, { "pc": [4123], "errorMessage": "ERR:EKFV" }, { "pc": [4147], "errorMessage": "ERR:EKLV" }, { "pc": [3030], "errorMessage": "ERR:ENRQ" }, { "pc": [7776, 7887], "errorMessage": "ERR:EPLG" }, { "pc": [8162], "errorMessage": "ERR:ERSD" }, { "pc": [5538], "errorMessage": "ERR:ESCL" }, { "pc": [6913], "errorMessage": "ERR:EXNR" }, { "pc": [6941], "errorMessage": "ERR:EXXP" }, { "pc": [3068, 3159, 3275, 3315, 3383, 3540], "errorMessage": "ERR:FORB" }, { "pc": [7534], "errorMessage": "ERR:IMSL" }, { "pc": [7382], "errorMessage": "ERR:IOCN" }, { "pc": [3574], "errorMessage": "ERR:IPAY" }, { "pc": [7403], "errorMessage": "ERR:ISAG" }, { "pc": [7427], "errorMessage": "ERR:ISVL" }, { "pc": [7681], "errorMessage": "ERR:MCLD" }, { "pc": [7492], "errorMessage": "ERR:MOFF" }, { "pc": [3971, 6463], "errorMessage": "ERR:NALW" }, { "pc": [5509], "errorMessage": "ERR:NESC" }, { "pc": [4223, 6886], "errorMessage": "ERR:NEXK" }, { "pc": [7016], "errorMessage": "ERR:NGRP" }, { "pc": [2901, 5556, 7042], "errorMessage": "ERR:NPLG" }, { "pc": [1992, 7117], "errorMessage": "ERR:NRKB" }, { "pc": [2605], "errorMessage": "ERR:OAAP" }, { "pc": [1381], "errorMessage": "ERR:OACU" }, { "pc": [3890], "errorMessage": "ERR:OARM" }, { "pc": [5478], "errorMessage": "ERR:OARP" }, { "pc": [7064, 7465], "errorMessage": "ERR:PCLD" }, { "pc": [1762], "errorMessage": "ERR:PDAP" }, { "pc": [1722], "errorMessage": "ERR:PDCW" }, { "pc": [7053, 7456], "errorMessage": "ERR:PEXP" }, { "pc": [1694], "errorMessage": "ERR:SMAP" }, { "pc": [7837], "errorMessage": "ERR:UEKG" }, { "pc": [7808], "errorMessage": "ERR:ZADT" }, { "pc": [7537], "errorMessage": "Length must be 4" }, { "pc": [1701, 1805], "errorMessage": "account funded" }, { "pc": [1279, 1361, 1678, 1706, 3287, 3512, 5685, 5806, 6049, 6153, 6385, 6404, 7164, 7273], "errorMessage": "application exists" }, { "pc": [1275, 1346, 1358, 1639, 1698, 1798, 1809, 1817, 1905, 3548, 4272, 5566, 5577, 5602, 5613, 5669, 5681, 5761, 5788, 5803, 5845, 6054, 6193, 6228, 6255, 6586, 6624, 7157, 7268, 7735], "errorMessage": "check GlobalState exists" }, { "pc": [3681, 3938, 4934, 5091, 5215, 6177, 6430, 7924], "errorMessage": "index access is out of bounds" }, { "pc": [1741, 1772, 2120, 2128, 2140, 2188, 2407, 3099, 3265, 4106, 4128, 4234, 4578, 4785, 5948, 5956, 5964, 5971, 6373, 6566, 6576, 6703, 6742, 6832, 6855, 6894, 6922, 6981, 7128, 7238, 7549, 7570, 7642, 7695], "errorMessage": "index out of bounds" }, { "pc": [4319, 4523, 4730], "errorMessage": "invalid array encoding" }, { "pc": [985, 1028, 1062, 1235, 1325, 1398, 1459, 1532, 2043, 2279, 2295, 2310, 2333, 2358, 2374, 2389, 2441, 2493, 2577, 2654, 2714, 2748, 2800, 2872, 2976, 3048, 3123, 3140, 3202, 3224, 3348, 3365, 3428, 3450, 3598, 3618, 3834, 3851, 4017, 4289, 4347, 4493, 4537, 4700, 4744, 4883, 4900, 5056, 5180, 5284, 5309, 6060, 6158, 6411, 7474, 7902, 7964], "errorMessage": "invalid array length header" }, { "pc": [1562, 1572, 1895, 2459, 2511, 2521, 2531, 2541, 2551, 2766, 2818, 2828, 2838, 2848, 2858], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [5192], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [992, 1035, 1069, 1242, 1332, 1405, 1466, 1539, 2050, 2286, 2340, 2365, 2448, 2584, 2661, 2721, 2755, 2879, 2983, 3055, 3130, 3209, 3355, 3435, 3605, 3841, 4890, 5291, 5316], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [4032, 5068], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes[32]>" }, { "pc": [3632], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::AddAllowanceInfo>" }, { "pc": [3149, 3233], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowReclaim>" }, { "pc": [2320, 2399], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::FundsRequest>" }, { "pc": [2503, 2810], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::MethodRestriction>" }, { "pc": [4368], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::PluginKey>" }, { "pc": [4557, 4764], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [2304, 2383, 3373, 3461, 3862, 4911], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [1013, 1022, 1081, 1090, 1602, 1630, 1887, 2037, 2435, 2571, 2648, 2742, 3196, 3422, 4008, 4208], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [2064], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 4>" }, { "pc": [1003, 1046, 1055, 1425, 1443, 1486, 1510, 2018, 2027, 2263, 2272, 2351, 2425, 2477, 2486, 2638, 2732, 2784, 2793, 3182, 3409, 4040, 4050, 5302, 5327], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [2469, 2776], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [5740], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [4343], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint8[32],(len+utf8[]))" }, { "pc": [4531, 4738], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [4327], "errorMessage": "invalid tail pointer for (len+(uint64,uint8[32],(len+utf8[]))[])" }, { "pc": [4338], "errorMessage": "invalid tuple encoding" }, { "pc": [944], "errorMessage": "overflow" }, { "pc": [3473], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCA0MDAgMTg5MDAgMjc3MDAKICAgIGJ5dGVjYmxvY2sgIiIgImNvbnRyb2xsZWRfYWRkcmVzcyIgInAiICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iICJlIiAweDE1MWY3Yzc1ICJsYXN0X2NoYW5nZSIgMHgwMDAwIDB4MDAgIngiICJzcGVuZGluZ19hZGRyZXNzIiAweDAwMmEgIkVSUjpGT1JCIiAweDAwMDIgImFkbWluIiAibiIgMHgwMSAiZCIgMHgwMDBhICJhIiAiRVJSOkFMRVgiICJyZWtleV9pbmRleCIgImRvbWFpbiIgImVzY3Jvd19mYWN0b3J5IiAicmV2b2NhdGlvbiIgInVwZGF0ZV9zZXR0aW5ncyIgImN1cnJlbnRfcGx1Z2luIiAiRVJSOk5QTEciIDB4NmNjM2Y2MDYgInZlcnNpb24iICJha2l0YV9kYW8iICJuaWNrbmFtZSIgImZhY3RvcnlfYXBwIiAiRVJSOk5SS0IiICJFUlI6TkFMVyIgIkVSUjpORVhLIiAiRVJSOkFETU4iICJFUlI6UEVYUCIgIkVSUjpQQ0xEIiAiRVJSOkVQTEciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gcmVrZXlJbmRleCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVrZXlJbmRleCB9KQogICAgYnl0ZWMgMjEgLy8gInJla2V5X2luZGV4IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyLTExOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogQWJzdHJhY3RBY2NvdW50TnVtR2xvYmFsQnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEFic3RyYWN0QWNjb3VudE51bUdsb2JhbFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHhlYTkxODBkZCAvLyBtZXRob2QgInVwZGF0ZShzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTItMTE4CiAgICAvLyBAY29udHJhY3QoewogICAgLy8gICBzdGF0ZVRvdGFsczogewogICAgLy8gICAgIGdsb2JhbEJ5dGVzOiBBYnN0cmFjdEFjY291bnROdW1HbG9iYWxCeXRlcywKICAgIC8vICAgICBnbG9iYWxVaW50czogQWJzdHJhY3RBY2NvdW50TnVtR2xvYmFsVWludHMKICAgIC8vICAgfQogICAgLy8gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BANDcKICAgIHB1c2hieXRlc3MgMHhiZDYwOTllNSAweDc3ODc4NjdkIDB4MmQ3NzExYjcgMHg0MDFhNmQ4MCAweDlmOTFjY2NkIDB4MTdkOGJjYjQgMHgzODU2NThhYiAweDVlZjBiNDE1IDB4NWM1ODk1M2MgMHhkMjRiNzU1NiAweDE0N2I2Y2Q2IC8vIG1ldGhvZCAicmVnaXN0ZXIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldERvbWFpbihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0UmV2b2NhdGlvbkFwcCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0QWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgInNldE5pY2tuYW1lKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRBdmF0YXIodWludDY0KXZvaWQiLCBtZXRob2QgInNldEJhbm5lcih1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0QmlvKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRGYWN0b3J5VXBkYXRlU2V0dGluZ3MoYm9vbCxib29sKXZvaWQiLCBtZXRob2QgImFyYzU4X2NoYW5nZUFkbWluKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4oYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMjggLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhjOTVhNWQzZCAweGIzNjIzNGE1IDB4NWFkZjMzOGYgMHg0OGE0NDU2NiAweDU2NzI0NjJlIDB4NTdhNTFkODggMHhlZWY0NDhmZCAweDU3MmZkMWVhIDB4ZTM1MGI5ZDQgMHgwYThjYjJjMiAweDI1YjcxM2NhIDB4ZWJhZjE0YTAgMHg2YTIwNWNmYyAweGFlMWE0ZGNhIDB4NjQ0ZDJkZWMgMHhiZjRkN2M1NyAweGQ1ZGQzODJiIDB4NWNlYmVkNDMgMHhkNTg2ODVhZiAweDEzYmM0NGU0IDB4ODlhNzY4MjYgMHgwNTc5NGQ3ZCAweGEyNDAzZGRmIDB4MDJmZTQ1MTUgMHg0MWJkYzY4MCAweDg4MmJiMWMyIDB4MTc2MGM2NTIgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvKGFkZHJlc3MsYm9vbCl2b2lkIiwgbWV0aG9kICJhcmM1OF9jYW5DYWxsKHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsYnl0ZVs0XSlib29sIiwgbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihzdHJpbmcsdWludDY0LHN0cmluZyx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJhcmM1OF9hZGRQbHVnaW4odWludDY0LGFkZHJlc3Msc3RyaW5nLGJvb2wsdWludDgsdWludDY0LHVpbnQ2NCwoYnl0ZVs0XSx1aW50NjQpW10sYm9vbCxib29sLGJvb2wsYm9vbCxib29sKXZvaWQiLCBtZXRob2QgImFzc2lnbkRvbWFpbihhZGRyZXNzLHN0cmluZyl2b2lkIiwgbWV0aG9kICJhcmM1OF9yZW1vdmVQbHVnaW4odWludDY0LGFkZHJlc3Msc3RyaW5nKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZE5hbWVkUGx1Z2luKHN0cmluZyx1aW50NjQsYWRkcmVzcyxzdHJpbmcsYm9vbCx1aW50OCx1aW50NjQsdWludDY0LChieXRlWzRdLHVpbnQ2NClbXSxib29sLGJvb2wsYm9vbCxib29sLGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4oc3RyaW5nKXZvaWQiLCBtZXRob2QgImFyYzU4X25ld0VzY3JvdyhzdHJpbmcpdWludDY0IiwgbWV0aG9kICJhcmM1OF90b2dnbGVFc2Nyb3dMb2NrKHN0cmluZykodWludDY0LGJvb2wpIiwgbWV0aG9kICJhcmM1OF9yZWNsYWltKHN0cmluZywodWludDY0LHVpbnQ2NCxib29sKVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3BsdWdpblJlY2xhaW0odWludDY0LGFkZHJlc3Msc3RyaW5nLCh1aW50NjQsdWludDY0LGJvb2wpW10pdm9pZCIsIG1ldGhvZCAiYXJjNThfb3B0SW5Fc2Nyb3coc3RyaW5nLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3BsdWdpbk9wdEluRXNjcm93KHVpbnQ2NCxhZGRyZXNzLHN0cmluZyx1aW50NjRbXSxwYXkpdm9pZCIsIG1ldGhvZCAiYXJjNThfYWRkQWxsb3dhbmNlcyhzdHJpbmcsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3JlbW92ZUFsbG93YW5jZXMoc3RyaW5nLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZEV4ZWN1dGlvbktleShieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5KGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgImFyYzU4X2dldEFkbWluKClhZGRyZXNzIiwgbWV0aG9kICJhcmM1OF9nZXRQbHVnaW5zKCh1aW50NjQsYWRkcmVzcyxzdHJpbmcpW10pKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LChieXRlWzRdLHVpbnQ2NCx1aW50NjQpW10sYm9vbCxib29sLGJvb2wsYm9vbCxib29sLHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgImFyYzU4X2dldE5hbWVkUGx1Z2lucyhzdHJpbmdbXSkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsKGJ5dGVbNF0sdWludDY0LHVpbnQ2NClbXSxib29sLGJvb2wsYm9vbCxib29sLGJvb2wsdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iLCBtZXRob2QgImFyYzU4X2dldEFsbG93YW5jZXMoc3RyaW5nLHVpbnQ2NFtdKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKVtdIiwgbWV0aG9kICJhcmM1OF9nZXRFeGVjdXRpb25zKGJ5dGVbMzJdW10pKGJ5dGVbMzJdW10sdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXJjNThfZ2V0RG9tYWluS2V5cyhhZGRyZXNzW10pc3RyaW5nW10iLCBtZXRob2QgIm1icihzdHJpbmcsdWludDY0LHN0cmluZyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJlZ2lzdGVyIHNldERvbWFpbiBzZXRSZXZvY2F0aW9uQXBwIHNldEFraXRhREFPIHNldE5pY2tuYW1lIHNldEF2YXRhciBzZXRCYW5uZXIgc2V0QmlvIHNldEZhY3RvcnlVcGRhdGVTZXR0aW5ncyBhcmM1OF9jaGFuZ2VBZG1pbiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcyBhcmM1OF9yZWtleVRvIGFyYzU4X2NhbkNhbGwgYXJjNThfcmVrZXlUb1BsdWdpbiBhcmM1OF9yZWtleVRvTmFtZWRQbHVnaW4gYXJjNThfYWRkUGx1Z2luIGFzc2lnbkRvbWFpbiBhcmM1OF9yZW1vdmVQbHVnaW4gYXJjNThfYWRkTmFtZWRQbHVnaW4gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4gYXJjNThfbmV3RXNjcm93IGFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2sgYXJjNThfcmVjbGFpbSBhcmM1OF9wbHVnaW5SZWNsYWltIGFyYzU4X29wdEluRXNjcm93IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93IGFyYzU4X2FkZEFsbG93YW5jZXMgYXJjNThfcmVtb3ZlQWxsb3dhbmNlcyBhcmM1OF9hZGRFeGVjdXRpb25LZXkgYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5IGFyYzU4X2dldEFkbWluIGFyYzU4X2dldFBsdWdpbnMgYXJjNThfZ2V0TmFtZWRQbHVnaW5zIGFyYzU4X2dldEVzY3Jvd3MgYXJjNThfZ2V0QWxsb3dhbmNlcyBhcmM1OF9nZXRFeGVjdXRpb25zIGFyYzU4X2dldERvbWFpbktleXMgbWJyCiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BANDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMi0xMTgKICAgIC8vIEBjb250cmFjdCh7CiAgICAvLyAgIHN0YXRlVG90YWxzOiB7CiAgICAvLyAgICAgZ2xvYmFsQnl0ZXM6IEFic3RyYWN0QWNjb3VudE51bUdsb2JhbEJ5dGVzLAogICAgLy8gICAgIGdsb2JhbFVpbnRzOiBBYnN0cmFjdEFjY291bnROdW1HbG9iYWxVaW50cwogICAgLy8gICB9CiAgICAvLyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZTllZDJlNmYgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCx1aW50NjQsc3RyaW5nLGFkZHJlc3MsYnl0ZVszMl0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NTYKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQoYXJyYXk6IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQ6CiAgICBwcm90byAyIDEKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzLCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBieXRlY18wIC8vICIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMgogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjp1aW50OCh2OiB1aW50NjQpIC0+IGJ5dGVzOgp1aW50ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiB1aW50OCh2OiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2Jhc2UudHM6NAogICAgLy8gcmV0dXJuIG5ldyBhcmM0LlVpbnQ4KHYpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjplbXB0eVBsdWdpbkluZm8oKSAtPiBieXRlczoKZW1wdHlQbHVnaW5JbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdXRpbHMudHM6NwogICAgLy8gZGVsZWdhdGlvblR5cGU6IHVpbnQ4KDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdWludDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjEwCiAgICAvLyBtZXRob2RzOiBbXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czo1LTE4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBlc2Nyb3c6IDAsCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiB1aW50OCgwKSwKICAgIC8vICAgbGFzdFZhbGlkOiAwLAogICAgLy8gICBjb29sZG93bjogMCwKICAgIC8vICAgbWV0aG9kczogW10sCiAgICAvLyAgIGFkbWluOiBmYWxzZSwKICAgIC8vICAgdXNlUm91bmRzOiBmYWxzZSwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBmYWxzZSwKICAgIC8vICAgY292ZXJGZWVzOiBmYWxzZSwKICAgIC8vICAgY2FuUmVjbGFpbTogZmFsc2UsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IDAsCiAgICAvLyAgIHN0YXJ0OiAwLAogICAgLy8gfTsKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmMwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjEwCiAgICAvLyBtZXRob2RzOiBbXSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czo1LTE4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBlc2Nyb3c6IDAsCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiB1aW50OCgwKSwKICAgIC8vICAgbGFzdFZhbGlkOiAwLAogICAgLy8gICBjb29sZG93bjogMCwKICAgIC8vICAgbWV0aG9kczogW10sCiAgICAvLyAgIGFkbWluOiBmYWxzZSwKICAgIC8vICAgdXNlUm91bmRzOiBmYWxzZSwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBmYWxzZSwKICAgIC8vICAgY292ZXJGZWVzOiBmYWxzZSwKICAgIC8vICAgY2FuUmVjbGFpbTogZmFsc2UsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IDAsCiAgICAvLyAgIHN0YXJ0OiAwLAogICAgLy8gfTsKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2OTMKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MDYKICAgIC8vIGxvZ2dlZEFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCAhPT0gMCwgRVJSX0JBRF9ERVBMT1lFUikKICAgIGdsb2JhbCBDYWxsZXJBcHBsaWNhdGlvbklECiAgICBibnogY3JlYXRlX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpCREVQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkJERVAKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzA3CiAgICAvLyBsb2dnZWRBc3NlcnQoYWRtaW4gIT09IGNvbnRyb2xsZWRBZGRyZXNzLCBFUlJfQURNSU5fQ0FOTk9UX0JFX0NPTlRST0xMRUQpCiAgICBkaWcgNgogICAgZGlnIDgKICAgICE9CiAgICBibnogY3JlYXRlX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpBQ0JDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFDQkMKCmNyZWF0ZV9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIzCiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBieXRlYyAyOSAvLyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzA5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDMwIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxMAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQWRtaW4gfSkKICAgIGJ5dGVjIDE0IC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzExCiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gYWRtaW4KICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGRvbWFpbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0RvbWFpbiB9KTsKICAgIGJ5dGVjIDIyIC8vICJkb21haW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxMgogICAgLy8gdGhpcy5kb21haW4udmFsdWUgPSBkb21haW4KICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MTQKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGRpZyA3CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxNC03MTYKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIC8vICAgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICA6IGNvbnRyb2xsZWRBZGRyZXNzCiAgICBieiBjcmVhdGVfdGVybmFyeV9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxNQogICAgLy8gPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCmNyZWF0ZV90ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxMy03MTYKICAgIC8vIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgPQogICAgLy8gICBjb250cm9sbGVkQWRkcmVzcyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICAvLyAgICAgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICAgIDogY29udHJvbGxlZEFkZHJlc3MKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gZXNjcm93RmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzRXNjcm93RmFjdG9yeSB9KQogICAgYnl0ZWMgMjMgLy8gImVzY3Jvd19mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MTcKICAgIC8vIHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSA9IEFwcGxpY2F0aW9uKGVzY3Jvd0ZhY3RvcnkpCiAgICBkaWcgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBzcGVuZGluZ0FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzIH0pCiAgICBieXRlYyAxMCAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzE4CiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9IEdsb2JhbC56ZXJvQWRkcmVzczsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1CiAgICAvLyByZXZvY2F0aW9uID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVJldm9jYXRpb24gfSkKICAgIGJ5dGVjIDI0IC8vICJyZXZvY2F0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIHRoaXMucmV2b2NhdGlvbi52YWx1ZSA9IEFwcGxpY2F0aW9uKHJldm9jYXRpb25BcHApCiAgICBkaWcgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBuaWNrbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c05pY2tuYW1lIH0pCiAgICBieXRlYyAzMSAvLyAibmlja25hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyMAogICAgLy8gdGhpcy5uaWNrbmFtZS52YWx1ZSA9IG5pY2tuYW1lCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyBmYWN0b3J5QXBwID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNGYWN0b3J5QXBwIH0pCiAgICBieXRlYyAzMiAvLyAiZmFjdG9yeV9hcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyMQogICAgLy8gdGhpcy5mYWN0b3J5QXBwLnZhbHVlID0gQXBwbGljYXRpb24oR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyByZWZlcnJlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlciB9KQogICAgcHVzaGJ5dGVzICJyZWZlcnJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzIyCiAgICAvLyB0aGlzLnJlZmVycmVyLnZhbHVlID0gcmVmZXJyZXIKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGZhY3RvcnlVcGRhdGVTZXR0aW5ncyA9IEdsb2JhbFN0YXRlPEZhY3RvcnlVcGRhdGVTZXR0aW5ncz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1VwZGF0ZVNldHRpbmdzIH0pCiAgICBieXRlYyAyNSAvLyAidXBkYXRlX3NldHRpbmdzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MjMKICAgIC8vIHRoaXMuZmFjdG9yeVVwZGF0ZVNldHRpbmdzLnZhbHVlID0geyBhbGxvd2VkOiB0cnVlLCBhdXRvbWF0aWM6IHRydWUgfQogICAgcHVzaGJ5dGVzIDB4YzAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MQogICAgLy8gc2FsdCA9IEdsb2JhbFN0YXRlPGJ5dGVzPDMyPj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NhbHQgfSkKICAgIHB1c2hieXRlcyAic2FsdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzI0CiAgICAvLyB0aGlzLnNhbHQudmFsdWUgPSBzYWx0CiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY5MwogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDc6CiAgICBkaWcgNwogICAgYiBjcmVhdGVfdGVybmFyeV9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucmVnaXN0ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzM2CiAgICAvLyByZWdpc3Rlcihlc2Nyb3c6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGxldCBhcHA6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjczOAogICAgLy8gaWYgKGVzY3JvdyAhPT0gJycpIHsKICAgIGJ5dGVjXzAgLy8gIiIKICAgICE9CiAgICBieiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzM5CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3JvdykKICAgIGRpZyAxCiAgICBkdXAKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQwCiAgICAvLyBhcHAgPSB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxCgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc0My03NTIKICAgIC8vIGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLnJlZ2lzdGVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhcHAKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQ3CiAgICAvLyByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGVzY3Jvd0ZhY3RvcnkgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0VzY3Jvd0ZhY3RvcnkgfSkKICAgIGJ5dGVjIDIzIC8vICJlc2Nyb3dfZmFjdG9yeSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQ3CiAgICAvLyByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc0OAogICAgLy8gYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIHB1c2hpbnQgMTIxMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc0Ni03NDkKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NDMtNzUyCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5yZWdpc3Rlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogQVJDNThXYWxsZXRJRHNCeUFjY291bnRzTWJyCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgYXBwCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzUwCiAgICAvLyBhcHAKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQzLTc1MgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUucmVnaXN0ZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEFSQzU4V2FsbGV0SURzQnlBY2NvdW50c01icgogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFwcAogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NjA3ZTcwNDYgLy8gbWV0aG9kICJyZWdpc3RlcihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjczNgogICAgLy8gcmVnaXN0ZXIoZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc1NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjAKICAgIC8vIHRoaXMuaXNBZG1pbigpIHx8CiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzYwLTc2MQogICAgLy8gdGhpcy5pc0FkbWluKCkgfHwKICAgIC8vICh0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZS5hbGxvd2VkICYmIFR4bi5zZW5kZXIgPT09IHRoaXMuZmFjdG9yeUFwcC52YWx1ZS5hZGRyZXNzKQogICAgYm56IHVwZGF0ZV9ib29sX3RydWVANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vICh0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZS5hbGxvd2VkICYmIFR4bi5zZW5kZXIgPT09IHRoaXMuZmFjdG9yeUFwcC52YWx1ZS5hZGRyZXNzKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5CiAgICAvLyBmYWN0b3J5VXBkYXRlU2V0dGluZ3MgPSBHbG9iYWxTdGF0ZTxGYWN0b3J5VXBkYXRlU2V0dGluZ3M+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNVcGRhdGVTZXR0aW5ncyB9KQogICAgYnl0ZWMgMjUgLy8gInVwZGF0ZV9zZXR0aW5ncyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzYxCiAgICAvLyAodGhpcy5mYWN0b3J5VXBkYXRlU2V0dGluZ3MudmFsdWUuYWxsb3dlZCAmJiBUeG4uc2VuZGVyID09PSB0aGlzLmZhY3RvcnlBcHAudmFsdWUuYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieiB1cGRhdGVfYm9vbF9mYWxzZUA1CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGZhY3RvcnlBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0ZhY3RvcnlBcHAgfSkKICAgIGJ5dGVjIDMyIC8vICJmYWN0b3J5X2FwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzYxCiAgICAvLyAodGhpcy5mYWN0b3J5VXBkYXRlU2V0dGluZ3MudmFsdWUuYWxsb3dlZCAmJiBUeG4uc2VuZGVyID09PSB0aGlzLmZhY3RvcnlBcHAudmFsdWUuYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYnogdXBkYXRlX2Jvb2xfZmFsc2VANQoKdXBkYXRlX2Jvb2xfdHJ1ZUA0OgogICAgaW50Y18xIC8vIDEKCnVwZGF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc1OC03NjQKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgKAogICAgLy8gICAgIHRoaXMuaXNBZG1pbigpIHx8CiAgICAvLyAgICAgKHRoaXMuZmFjdG9yeVVwZGF0ZVNldHRpbmdzLnZhbHVlLmFsbG93ZWQgJiYgVHhuLnNlbmRlciA9PT0gdGhpcy5mYWN0b3J5QXBwLnZhbHVlLmFkZHJlc3MpCiAgICAvLyAgICksCiAgICAvLyAgIEVSUl9PTkxZX0FETUlOX0NBTl9VUERBVEUKICAgIC8vICkKICAgIGJueiB1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDgKICAgIHB1c2hieXRlcyAiRVJSOk9BQ1UiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T0FDVQoKdXBkYXRlX2FmdGVyX2Fzc2VydEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDI5IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjUKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NTYKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdXBkYXRlX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHVwZGF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXREb21haW5bcm91dGluZ10oKSAtPiB2b2lkOgpzZXREb21haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc3NQogICAgLy8gc2V0RG9tYWluKGRvbWFpbjogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NzYKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBkb21haW4gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNEb21haW4gfSk7CiAgICBieXRlYyAyMiAvLyAiZG9tYWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIHRoaXMuZG9tYWluLnZhbHVlID0gZG9tYWluCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIHNldERvbWFpbihkb21haW46IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnNldFJldm9jYXRpb25BcHBbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRSZXZvY2F0aW9uQXBwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHNldFJldm9jYXRpb25BcHAoYXBwOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKQogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gcmV2b2NhdGlvbiA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlSZXZvY2F0aW9uIH0pCiAgICBieXRlYyAyNCAvLyAicmV2b2NhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Nzg3CiAgICAvLyB0aGlzLnJldm9jYXRpb24udmFsdWUgPSBBcHBsaWNhdGlvbihhcHApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHNldFJldm9jYXRpb25BcHAoYXBwOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXRBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3OTUKICAgIC8vIHNldEFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3OTYKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Nzk3CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc5NQogICAgLy8gc2V0QWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0Tmlja25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXROaWNrbmFtZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODA1CiAgICAvLyBzZXROaWNrbmFtZShuaWNrbmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBuaWNrbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c05pY2tuYW1lIH0pCiAgICBieXRlYyAzMSAvLyAibmlja25hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgwNwogICAgLy8gdGhpcy5uaWNrbmFtZS52YWx1ZSA9IG5pY2tuYW1lCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MDUKICAgIC8vIHNldE5pY2tuYW1lKG5pY2tuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXRBdmF0YXJbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRBdmF0YXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgxNQogICAgLy8gc2V0QXZhdGFyKGF2YXRhcjogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCkKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIGF2YXRhciA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQXZhdGFyIH0pCiAgICBwdXNoYnl0ZXMgImF2YXRhciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODE3CiAgICAvLyB0aGlzLmF2YXRhci52YWx1ZSA9IEFzc2V0KGF2YXRhcikKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgxNQogICAgLy8gc2V0QXZhdGFyKGF2YXRhcjogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0QmFubmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0QmFubmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MjUKICAgIC8vIHNldEJhbm5lcihiYW5uZXI6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MjYKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyBiYW5uZXIgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0Jhbm5lciB9KQogICAgcHVzaGJ5dGVzICJiYW5uZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgyNwogICAgLy8gdGhpcy5iYW5uZXIudmFsdWUgPSBBc3NldChiYW5uZXIpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MjUKICAgIC8vIHNldEJhbm5lcihiYW5uZXI6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnNldEJpb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEJpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODM1CiAgICAvLyBzZXRCaW8oYmlvOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgzNgogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCkKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIGJpbyA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0JpbyB9KQogICAgcHVzaGJ5dGVzICJiaW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gdGhpcy5iaW8udmFsdWUgPSBiaW8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgzNQogICAgLy8gc2V0QmlvKGJpbzogc3RyaW5nKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NDYKICAgIC8vIHNldEZhY3RvcnlVcGRhdGVTZXR0aW5ncyhhbGxvd2VkOiBib29sZWFuLCBhdXRvbWF0aWM6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NDcKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODQ4CiAgICAvLyB0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZSA9IHsgYWxsb3dlZCwgYXV0b21hdGljIH0KICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5CiAgICAvLyBmYWN0b3J5VXBkYXRlU2V0dGluZ3MgPSBHbG9iYWxTdGF0ZTxGYWN0b3J5VXBkYXRlU2V0dGluZ3M+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNVcGRhdGVTZXR0aW5ncyB9KQogICAgYnl0ZWMgMjUgLy8gInVwZGF0ZV9zZXR0aW5ncyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODQ4CiAgICAvLyB0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZSA9IHsgYWxsb3dlZCwgYXV0b21hdGljIH0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg0NgogICAgLy8gc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzKGFsbG93ZWQ6IGJvb2xlYW4sIGF1dG9tYXRpYzogYm9vbGVhbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2NoYW5nZUFkbWluW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfY2hhbmdlQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg1NgogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0FkbWluIH0pCiAgICBieXRlYyAxNCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg1OAogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg1NgogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODY4CiAgICAvLyBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbihuZXdBZG1pbjogQWNjb3VudCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NjkKICAgIC8vIGNvbnN0IGtleSA9IGNsb25lKHRoaXMuY3VycmVudFBsdWdpbi52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3VycmVudFBsdWdpbiA9IEdsb2JhbFN0YXRlPFBsdWdpbktleT4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0N1cnJlbnRQbHVnaW4gfSkKICAgIGJ5dGVjIDI2IC8vICJjdXJyZW50X3BsdWdpbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyBjb25zdCBrZXkgPSBjbG9uZSh0aGlzLmN1cnJlbnRQbHVnaW4udmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBjb25zdCB7IHBsdWdpbiwgZXNjcm93IH0gPSBrZXkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NzIKICAgIC8vIGxvZ2dlZEFzc2VydChlc2Nyb3cgPT09ICcnLCBFUlJfQURNSU5fUExVR0lOU19DQU5OT1RfVVNFX0VTQ1JPV1MpOwogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgIGJueiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6QVBORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBUE5FCgphcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODczCiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLCBFUlJfU0VOREVSX01VU1RfQkVfQURNSU5fUExVR0lOKTsKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpTTUFQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlNNQVAKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NzUKICAgIC8vIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUuYXV0aEFkZHJlc3MgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg3NQogICAgLy8gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg3NC04NzcKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLAogICAgLy8gICBFUlJfUExVR0lOX0RPRVNfTk9UX0NPTlRST0xfV0FMTEVUCiAgICAvLyApOwogICAgYm56IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpQRENXIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBEQ1cKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4ODAKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cyAmJiB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5hZG1pbiwKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9mYWxzZUAxMAogICAgZGlnIDMKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg3OS04ODIKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzICYmIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmFkbWluLAogICAgLy8gICBFUlJfUExVR0lOX0RPRVNfTk9UX0hBVkVfQURNSU5fUFJJVklMRUdFUwogICAgLy8gKTsKICAgIGJueiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMTMKICAgIHB1c2hieXRlcyAiRVJSOlBEQVAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UERBUAoKYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0FkbWluIH0pCiAgICBieXRlYyAxNCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg4NAogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluOwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg4NQogICAgLy8gaWYgKHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmRlbGVnYXRpb25UeXBlID09PSBEZWxlZ2F0aW9uVHlwZVNlbGYpIHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBieXRlYyAxNiAvLyAweDAxCiAgICA9PQogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg2OAogICAgLy8gYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODk1CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUuYXV0aEFkZHJlc3MgPT09IHRoaXMuZ2V0QXV0aEFkZHJlc3MoKSwgRVJSX0FVVEhfQUREUl9NSVNNQVRDSCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHNwZW5kaW5nQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MgfSkKICAgIGJ5dGVjIDEwIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4OTUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gdGhpcy5nZXRBdXRoQWRkcmVzcygpLCBFUlJfQVVUSF9BRERSX01JU01BVENIKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NzMKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NzMKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjczLTY3NAogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPT09IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUKICAgIC8vICYmIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBieiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Njc0CiAgICAvLyAmJiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Njc0CiAgICAvLyAmJiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NzMtNjc0CiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9PT0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZQogICAgLy8gJiYgdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGJ6IGFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzX3Rlcm5hcnlfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NzUKICAgIC8vICkgPyBHbG9iYWwuemVyb0FkZHJlc3MgOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLmF1dGhBZGRyZXNzID09PSB0aGlzLmdldEF1dGhBZGRyZXNzKCksIEVSUl9BVVRIX0FERFJfTUlTTUFUQ0gpOwogICAgZGlnIDEKICAgID09CiAgICBibnogYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3NfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOkFVQU0iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QVVBTQoKYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3NfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gc3BlbmRpbmdBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcyB9KQogICAgYnl0ZWMgMTAgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5NgogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODk3CiAgICAvLyB0aGlzLmN1cnJlbnRQbHVnaW4udmFsdWUgPSB7IHBsdWdpbjogMCwgY2FsbGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgZXNjcm93OiAnJyB9CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAyYTAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGN1cnJlbnRQbHVnaW4gPSBHbG9iYWxTdGF0ZTxQbHVnaW5LZXk+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDdXJyZW50UGx1Z2luIH0pCiAgICBieXRlYyAyNiAvLyAiY3VycmVudF9wbHVnaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5NwogICAgLy8gdGhpcy5jdXJyZW50UGx1Z2luLnZhbHVlID0geyBwbHVnaW46IDAsIGNhbGxlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGVzY3JvdzogJycgfQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyByZWtleUluZGV4ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWtleUluZGV4IH0pCiAgICBieXRlYyAyMSAvLyAicmVrZXlfaW5kZXgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5OAogICAgLy8gdGhpcy5yZWtleUluZGV4LnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5NAogICAgLy8gYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X2ZhbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY3NQogICAgLy8gKSA/IEdsb2JhbC56ZXJvQWRkcmVzcyA6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVrZXlUbzoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MDcKICAgIC8vIGFyYzU4X3Jla2V5VG8oYWRkcmVzczogQWNjb3VudCwgZmxhc2g6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwOAogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTEwLTkxNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkxMgogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTE1CiAgICAvLyBub3RlOiAncmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50JwogICAgcHVzaGJ5dGVzICJyZWtleWluZyBhYnN0cmFjdGVkIGFjY291bnQiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTEwLTkxNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTEwLTkxNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTE5CiAgICAvLyBpZiAoZmxhc2gpIHRoaXMuYXNzZXJ0UmVrZXlzQmFjaygpOwogICAgYnogYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBsZXQgcmVrZXlzQmFjayA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKYXJjNThfcmVrZXlUb193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzg3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgZGlnIDEKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIDwKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYmxvY2tAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzkwCiAgICAvLyBpZiAodGhpcy50eG5SZWtleXNCYWNrKHR4bikpIHsKICAgIGRpZyAxCiAgICBjYWxsc3ViIHR4blJla2V5c0JhY2sKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gcmVrZXlzQmFjayA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxCgphcmM1OF9yZWtleVRvX2Jsb2NrQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozOTYKICAgIC8vIGxvZ2dlZEFzc2VydChyZWtleXNCYWNrLCBFUlJfTUlTU0lOR19SRUtFWV9CQUNLKTsKICAgIGR1cAogICAgYm56IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAzMyAvLyAiRVJSOk5SS0IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TlJLQgoKYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MDcKICAgIC8vIGFyYzU4X3Jla2V5VG8oYWRkcmVzczogQWNjb3VudCwgZmxhc2g6IGJvb2xlYW4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBhcmM1OF9yZWtleVRvX3doaWxlX3RvcEA2CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfY2FuQ2FsbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2NhbkNhbGw6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGxlbgogICAgcHVzaGludCA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCA0PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5NDIKICAgIC8vIGNvbnN0IGNhbGxlciA9IHRoaXMucmVzb2x2ZUNhbGxlclR5cGUodHlwZSwgYWRkcmVzcykKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgcmVzb2x2ZUNhbGxlclR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXIsIGVzY3JvdyB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAxMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gaWYgKCF0aGlzLnBsdWdpbnMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gcmV0dXJuIGZhbHNlOwogICAgaW50Y18wIC8vIDAKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5wbHVnaW5DYWxsQWxsb3dlZEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBjb25zdCB7IG1ldGhvZHMsIHVzZVJvdW5kcywgbGFzdENhbGxlZCwgY29vbGRvd24sIHVzZUV4ZWN1dGlvbktleSB9ID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUgYXMgUmVhZG9ubHk8UGx1Z2luSW5mbz4KICAgIGR1cG4gMgogICAgcHVzaGludCAxNwogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDkKICAgIGR1cAogICAgcHVzaGludCAyNwogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIGJ1cnkgNQogICAgaW50Y18yIC8vIDIKICAgIGdldGJpdAogICAgc3dhcAogICAgcHVzaGludCAyOAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBpZiAodXNlRXhlY3V0aW9uS2V5KSB7CiAgICBieiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTQzCiAgICAvLyByZXR1cm4gdGhpcy5wbHVnaW5DYWxsQWxsb3dlZChwbHVnaW4sIGNhbGxlciwgZXNjcm93LCBtZXRob2QpOwogICAgYiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucGx1Z2luQ2FsbEFsbG93ZWRAMTkKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGxldCBtZXRob2RBbGxvd2VkID0gbWV0aG9kcy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlOwogICAgZHVwCiAgICBwdXNoaW50IDQ0CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgICEKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CgphcmM1OF9jYW5DYWxsX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgNDQKICAgIGludGNfMiAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDYKICAgID4KICAgIGJ6IGFyYzU4X2NhbkNhbGxfYmxvY2tAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBpZiAobWV0aG9kc1tpXS5zZWxlY3RvciA9PT0gbWV0aG9kKSB7CiAgICBkaWcgNQogICAgcHVzaGludCAyMAogICAgKgogICAgcHVzaGludCA0NgogICAgKwogICAgZGlnIDEKICAgIHN3YXAKICAgIHB1c2hpbnQgMjAKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgNAogICAgZGlnIDIKICAgID09CiAgICBieiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIG1ldGhvZEFsbG93ZWQgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGJ1cnkgNAoKYXJjNThfY2FuQ2FsbF9ibG9ja0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBkaWcgMgogICAgYnogYXJjNThfY2FuQ2FsbF90ZXJuYXJ5X2ZhbHNlQDEzCiAgICBnbG9iYWwgUm91bmQKICAgIGJ1cnkgNwoKYXJjNThfY2FuQ2FsbF90ZXJuYXJ5X21lcmdlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGxhc3RDYWxsZWQgPj0gZXBvY2hSZWYgJiYKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzYxLTM2MgogICAgLy8gbGFzdENhbGxlZCA+PSBlcG9jaFJlZiAmJgogICAgLy8gKGVwb2NoUmVmIC0gbGFzdENhbGxlZCkgPj0gY29vbGRvd24gJiYKICAgIGJ6IGFyYzU4X2NhbkNhbGxfYm9vbF9mYWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIChlcG9jaFJlZiAtIGxhc3RDYWxsZWQpID49IGNvb2xkb3duICYmCiAgICBkaWcgNgogICAgZGlnIDUKICAgIC0KICAgIGRpZyA4CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjEtMzYyCiAgICAvLyBsYXN0Q2FsbGVkID49IGVwb2NoUmVmICYmCiAgICAvLyAoZXBvY2hSZWYgLSBsYXN0Q2FsbGVkKSA+PSBjb29sZG93biAmJgogICAgYnogYXJjNThfY2FuQ2FsbF9ib29sX2ZhbHNlQDE3CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfY2FuQ2FsbF9ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjEtMzYzCiAgICAvLyBsYXN0Q2FsbGVkID49IGVwb2NoUmVmICYmCiAgICAvLyAoZXBvY2hSZWYgLSBsYXN0Q2FsbGVkKSA+PSBjb29sZG93biAmJgogICAgLy8gbWV0aG9kQWxsb3dlZAogICAgZGlnIDQKICAgICYmCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk0MwogICAgLy8gcmV0dXJuIHRoaXMucGx1Z2luQ2FsbEFsbG93ZWQocGx1Z2luLCBjYWxsZXIsIGVzY3JvdywgbWV0aG9kKTsKICAgIGIgYXJjNThfY2FuQ2FsbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnBsdWdpbkNhbGxBbGxvd2VkQDE5CgphcmM1OF9jYW5DYWxsX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9jYW5DYWxsX2Jvb2xfbWVyZ2VAMTgKCmFyYzU4X2NhbkNhbGxfdGVybmFyeV9mYWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBidXJ5IDcKICAgIGIgYXJjNThfY2FuQ2FsbF90ZXJuYXJ5X21lcmdlQDE0CgphcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzUxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGIgYXJjNThfY2FuQ2FsbF93aGlsZV90b3BANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9yZWtleVRvUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5NTUtOTYxCiAgICAvLyBhcmM1OF9yZWtleVRvUGx1Z2luKAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgdHlwZTogdWludDY0LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgbWV0aG9kT2Zmc2V0czogdWludDY0W10sCiAgICAvLyAgIGZ1bmRzUmVxdWVzdDogRnVuZHNSZXF1ZXN0W10KICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdHlwZXMudHM6OkZ1bmRzUmVxdWVzdD4KICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbgogICAgcG9wbiAyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDI4LTEwMzMKICAgIC8vIGFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbigKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICB0eXBlOiB1aW50NjQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBtZXRob2RPZmZzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgZnVuZHNSZXF1ZXN0OiBGdW5kc1JlcXVlc3RbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpGdW5kc1JlcXVlc3Q+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gbmFtZWRQbHVnaW5zID0gQm94TWFwPHN0cmluZywgUGx1Z2luS2V5Pih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4TmFtZWRQbHVnaW5zIH0pOwogICAgYnl0ZWMgMTUgLy8gIm4iCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDM1CiAgICAvLyB0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS52YWx1ZS5wbHVnaW4sCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMzQtMTA0MAogICAgLy8gdGhpcy5hcmM1OF9yZWtleVRvUGx1Z2luKAogICAgLy8gICB0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS52YWx1ZS5wbHVnaW4sCiAgICAvLyAgIHR5cGUsCiAgICAvLyAgIGVzY3JvdywKICAgIC8vICAgbWV0aG9kT2Zmc2V0cywKICAgIC8vICAgZnVuZHNSZXF1ZXN0CiAgICAvLyApOwogICAgY292ZXIgNAogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAyOC0xMDMzCiAgICAvLyBhcmM1OF9yZWtleVRvTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgdHlwZTogdWludDY0LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgbWV0aG9kT2Zmc2V0czogdWludDY0W10sCiAgICAvLyAgIGZ1bmRzUmVxdWVzdDogRnVuZHNSZXF1ZXN0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9hZGRQbHVnaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9hZGRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExNjItMTE3NgogICAgLy8gYXJjNThfYWRkUGx1Z2luKAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgYWRtaW46IGJvb2xlYW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiBVaW50OCwKICAgIC8vICAgbGFzdFZhbGlkOiB1aW50NjQsCiAgICAvLyAgIGNvb2xkb3duOiB1aW50NjQsCiAgICAvLyAgIG1ldGhvZHM6IE1ldGhvZFJlc3RyaWN0aW9uW10sCiAgICAvLyAgIHVzZVJvdW5kczogYm9vbGVhbiwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBib29sZWFuLAogICAgLy8gICBjb3ZlckZlZXM6IGJvb2xlYW4sCiAgICAvLyAgIGNhblJlY2xhaW06IGJvb2xlYW4sCiAgICAvLyAgIGRlZmF1bHRUb0VzY3JvdzogYm9vbGVhbgogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6TWV0aG9kUmVzdHJpY3Rpb24+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExNzgKICAgIC8vICcnLAogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTc3LTExOTIKICAgIC8vIHRoaXMuX2FkZFBsdWdpbigKICAgIC8vICAgJycsCiAgICAvLyAgIHBsdWdpbiwKICAgIC8vICAgY2FsbGVyLAogICAgLy8gICBlc2Nyb3csCiAgICAvLyAgIGFkbWluLAogICAgLy8gICBkZWxlZ2F0aW9uVHlwZSwKICAgIC8vICAgbGFzdFZhbGlkLAogICAgLy8gICBjb29sZG93biwKICAgIC8vICAgbWV0aG9kcywKICAgIC8vICAgdXNlUm91bmRzLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXksCiAgICAvLyAgIGNvdmVyRmVlcywKICAgIC8vICAgY2FuUmVjbGFpbSwKICAgIC8vICAgZGVmYXVsdFRvRXNjcm93CiAgICAvLyApCiAgICBjb3ZlciAxMwogICAgY2FsbHN1YiBfYWRkUGx1Z2luCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTE2Mi0xMTc2CiAgICAvLyBhcmM1OF9hZGRQbHVnaW4oCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICBjYWxsZXI6IEFjY291bnQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBhZG1pbjogYm9vbGVhbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGU6IFVpbnQ4LAogICAgLy8gICBsYXN0VmFsaWQ6IHVpbnQ2NCwKICAgIC8vICAgY29vbGRvd246IHVpbnQ2NCwKICAgIC8vICAgbWV0aG9kczogTWV0aG9kUmVzdHJpY3Rpb25bXSwKICAgIC8vICAgdXNlUm91bmRzOiBib29sZWFuLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXk6IGJvb2xlYW4sCiAgICAvLyAgIGNvdmVyRmVlczogYm9vbGVhbiwKICAgIC8vICAgY2FuUmVjbGFpbTogYm9vbGVhbiwKICAgIC8vICAgZGVmYXVsdFRvRXNjcm93OiBib29sZWFuCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hc3NpZ25Eb21haW5bcm91dGluZ10oKSAtPiB2b2lkOgphc3NpZ25Eb21haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMDEKICAgIC8vIGFzc2lnbkRvbWFpbihjYWxsZXI6IEFjY291bnQsIGRvbWFpbjogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjAyCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCksIEVSUl9PTkxZX0FETUlOX0NBTl9BRERfUExVR0lOKQogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogYXNzaWduRG9tYWluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpPQUFQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk9BQVAKCmFzc2lnbkRvbWFpbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gTWluRG9tYWluS2V5c01CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGRvbWFpbikubGVuZ3RoKQogICAgZHVwbiAyCiAgICBsZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyByZXR1cm4gQm94Q29zdFBlckJ5dGUgKiBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gTWluRG9tYWluS2V5c01CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGRvbWFpbikubGVuZ3RoKQogICAgcHVzaGludCAxNTcwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjA0CiAgICAvLyB0aGlzLl9wYXlNYnJGcm9tQ29udHJvbGxlZCh0aGlzLmRvbWFpbktleXNNYnIoZG9tYWluKSkKICAgIGNhbGxzdWIgX3BheU1ickZyb21Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gZG9tYWluS2V5cyA9IEJveE1hcDxBY2NvdW50LCBzdHJpbmc+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhEb21haW5LZXlzIH0pCiAgICBieXRlYyAxNyAvLyAiZCIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIwNgogICAgLy8gdGhpcy5kb21haW5LZXlzKGNhbGxlcikudmFsdWUgPSBkb21haW4KICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMDEKICAgIC8vIGFzc2lnbkRvbWFpbihjYWxsZXI6IEFjY291bnQsIGRvbWFpbjogc3RyaW5nKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVtb3ZlUGx1Z2luW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVtb3ZlUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjE2CiAgICAvLyBhcmM1OF9yZW1vdmVQbHVnaW4ocGx1Z2luOiB1aW50NjQsIGNhbGxlcjogQWNjb3VudCwgZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMTcKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbk9yUmV2b2tlKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW5PclJldm9rZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjE5CiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXI6IGNhbGxlciwgZXNjcm93IH0KICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMTEgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjIwCiAgICAvLyB0aGlzLl9yZXF1aXJlUGx1Z2luKGtleSkKICAgIGNhbGxzdWIgX3JlcXVpcmVQbHVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMjIKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjE2CiAgICAvLyBhcmM1OF9yZW1vdmVQbHVnaW4ocGx1Z2luOiB1aW50NjQsIGNhbGxlcjogQWNjb3VudCwgZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9hZGROYW1lZFBsdWdpbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2FkZE5hbWVkUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjQ0LTEyNTkKICAgIC8vIGFyYzU4X2FkZE5hbWVkUGx1Z2luKAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICBjYWxsZXI6IEFjY291bnQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBhZG1pbjogYm9vbGVhbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGU6IFVpbnQ4LAogICAgLy8gICBsYXN0VmFsaWQ6IHVpbnQ2NCwKICAgIC8vICAgY29vbGRvd246IHVpbnQ2NCwKICAgIC8vICAgbWV0aG9kczogTWV0aG9kUmVzdHJpY3Rpb25bXSwKICAgIC8vICAgdXNlUm91bmRzOiBib29sZWFuLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXk6IGJvb2xlYW4sCiAgICAvLyAgIGNvdmVyRmVlczogYm9vbGVhbiwKICAgIC8vICAgY2FuUmVjbGFpbTogYm9vbGVhbiwKICAgIC8vICAgZGVmYXVsdFRvRXNjcm93OiBib29sZWFuCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6TWV0aG9kUmVzdHJpY3Rpb24+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjYwLTEyNzUKICAgIC8vIHRoaXMuX2FkZFBsdWdpbigKICAgIC8vICAgbmFtZSwKICAgIC8vICAgcGx1Z2luLAogICAgLy8gICBjYWxsZXIsCiAgICAvLyAgIGVzY3JvdywKICAgIC8vICAgYWRtaW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlLAogICAgLy8gICBsYXN0VmFsaWQsCiAgICAvLyAgIGNvb2xkb3duLAogICAgLy8gICBtZXRob2RzLAogICAgLy8gICB1c2VSb3VuZHMsCiAgICAvLyAgIHVzZUV4ZWN1dGlvbktleSwKICAgIC8vICAgY292ZXJGZWVzLAogICAgLy8gICBjYW5SZWNsYWltLAogICAgLy8gICBkZWZhdWx0VG9Fc2Nyb3cKICAgIC8vICkKICAgIGNhbGxzdWIgX2FkZFBsdWdpbgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNDQtMTI1OQogICAgLy8gYXJjNThfYWRkTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIGFkbWluOiBib29sZWFuLAogICAgLy8gICBkZWxlZ2F0aW9uVHlwZTogVWludDgsCiAgICAvLyAgIGxhc3RWYWxpZDogdWludDY0LAogICAgLy8gICBjb29sZG93bjogdWludDY0LAogICAgLy8gICBtZXRob2RzOiBNZXRob2RSZXN0cmljdGlvbltdLAogICAgLy8gICB1c2VSb3VuZHM6IGJvb2xlYW4sCiAgICAvLyAgIHVzZUV4ZWN1dGlvbktleTogYm9vbGVhbiwKICAgIC8vICAgY292ZXJGZWVzOiBib29sZWFuLAogICAgLy8gICBjYW5SZWNsYWltOiBib29sZWFuLAogICAgLy8gICBkZWZhdWx0VG9Fc2Nyb3c6IGJvb2xlYW4KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyODMKICAgIC8vIGFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjg0CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW5PclJldm9rZSgpOwogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluT3JSZXZva2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBuYW1lZFBsdWdpbnMgPSBCb3hNYXA8c3RyaW5nLCBQbHVnaW5LZXk+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhOYW1lZFBsdWdpbnMgfSk7CiAgICBieXRlYyAxNSAvLyAibiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyODUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS5leGlzdHMsIEVSUl9QTFVHSU5fRE9FU19OT1RfRVhJU1QpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW5fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDI3IC8vICJFUlI6TlBMRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOUExHCgphcmM1OF9yZW1vdmVOYW1lZFBsdWdpbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI4NgogICAgLy8gY29uc3QgYXBwID0gY2xvbmUodGhpcy5uYW1lZFBsdWdpbnMobmFtZSkudmFsdWUpCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyODcKICAgIC8vIHRoaXMuX3JlcXVpcmVQbHVnaW4oYXBwKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVQbHVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjg5CiAgICAvLyBjb25zdCBtZXRob2RzTGVuZ3RoOiB1aW50NjQgPSB0aGlzLnBsdWdpbnMoYXBwKS52YWx1ZS5tZXRob2RzLmxlbmd0aAogICAgZHVwCiAgICBwdXNoaW50IDQ0CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5MQogICAgLy8gdGhpcy5uYW1lZFBsdWdpbnMobmFtZSkuZGVsZXRlKCk7CiAgICB1bmNvdmVyIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjkyCiAgICAvLyB0aGlzLnBsdWdpbnMoYXBwKS5kZWxldGUoKTsKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIHJldHVybiBNaW5OYW1lZFBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKG5hbWUpLmxlbmd0aCkKICAgIGRpZyAzCiAgICBsZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyByZXR1cm4gQm94Q29zdFBlckJ5dGUgKiBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyByZXR1cm4gTWluTmFtZWRQbHVnaW5NQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhuYW1lKS5sZW5ndGgpCiAgICBpbnRjIDUgLy8gMTg5MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5NAogICAgLy8gdGhpcy5fcmVmdW5kTWJyVG9Db250cm9sbGVkKHRoaXMubmFtZWRQbHVnaW5zTWJyKG5hbWUpICsgdGhpcy5wbHVnaW5zTWJyKGFwcC5lc2Nyb3csIG1ldGhvZHNMZW5ndGgpKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgcGx1Z2luc01icgogICAgKwogICAgY2FsbHN1YiBfcmVmdW5kTWJyVG9Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjgzCiAgICAvLyBhcmM1OF9yZW1vdmVOYW1lZFBsdWdpbihuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9uZXdFc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9uZXdFc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMDQKICAgIC8vIGFyYzU4X25ld0VzY3Jvdyhlc2Nyb3c6IHN0cmluZyk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMDUKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpOwogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMDYKICAgIC8vIGxvZ2dlZEFzc2VydCghdGhpcy5lc2Nyb3dzKGVzY3JvdykuZXhpc3RzLCBFUlJfRVNDUk9XX0FMUkVBRFlfRVhJU1RTKTsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfbmV3RXNjcm93X2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpFRVNDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVFU0MKCmFyYzU4X25ld0VzY3Jvd19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMwNwogICAgLy8gbG9nZ2VkQXNzZXJ0KGVzY3JvdyAhPT0gJycsIEVSUl9FU0NST1dfTkFNRV9SRVFVSVJFRCk7CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgICE9CiAgICBibnogYXJjNThfbmV3RXNjcm93X2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpFTlJRIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVOUlEKCmFyYzU4X25ld0VzY3Jvd19hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMwOAogICAgLy8gcmV0dXJuIHRoaXMubmV3RXNjcm93KGVzY3Jvdyk7CiAgICBkdXAKICAgIGNhbGxzdWIgbmV3RXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMDQKICAgIC8vIGFyYzU4X25ld0VzY3Jvdyhlc2Nyb3c6IHN0cmluZyk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfdG9nZ2xlRXNjcm93TG9ja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMTYKICAgIC8vIGFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2soZXNjcm93OiBzdHJpbmcpOiBFc2Nyb3dJbmZvIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMTcKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSwgRVJSX0ZPUkJJRERFTik7CiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBhcmM1OF90b2dnbGVFc2Nyb3dMb2NrX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxMiAvLyAiRVJSOkZPUkIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Rk9SQgoKYXJjNThfdG9nZ2xlRXNjcm93TG9ja19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxOAogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpOwogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9yZXF1aXJlRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMjAKICAgIC8vIHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmxvY2tlZCA9ICF0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5sb2NrZWQ7CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgICEKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMyNAogICAgLy8gcmV0dXJuIHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlOwogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMTYKICAgIC8vIGFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2soZXNjcm93OiBzdHJpbmcpOiBFc2Nyb3dJbmZvIHsKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWNsYWltW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVjbGFpbToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzMwogICAgLy8gYXJjNThfcmVjbGFpbShlc2Nyb3c6IHN0cmluZywgcmVjbGFpbXM6IEVzY3Jvd1JlY2xhaW1bXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTcKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6RXNjcm93UmVjbGFpbT4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzNAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpLCBFUlJfRk9SQklEREVOKTsKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IGFyYzU4X3JlY2xhaW1fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF9yZWNsYWltX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzM1CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3Jvdyk7CiAgICBkaWcgMQogICAgZHVwCiAgICBjYWxsc3ViIF9yZXF1aXJlRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMzYKICAgIC8vIHRoaXMucmVjbGFpbShlc2Nyb3csIHJlY2xhaW1zLCB0cnVlKTsKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiByZWNsYWltCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzMwogICAgLy8gYXJjNThfcmVjbGFpbShlc2Nyb3c6IHN0cmluZywgcmVjbGFpbXM6IEVzY3Jvd1JlY2xhaW1bXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3BsdWdpblJlY2xhaW1bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9wbHVnaW5SZWNsYWltOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzQ4LTEzNTMKICAgIC8vIGFyYzU4X3BsdWdpblJlY2xhaW0oCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICBjYWxsZXI6IEFjY291bnQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICByZWNsYWltczogRXNjcm93UmVjbGFpbVtdCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTcKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6RXNjcm93UmVjbGFpbT4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM1NAogICAgLy8gY29uc3Qga2V5OiBQbHVnaW5LZXkgPSB7IHBsdWdpbiwgY2FsbGVyOiBjYWxsZXIsIGVzY3JvdyB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDExIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM1NgogICAgLy8gdGhpcy5fcmVxdWlyZVBsdWdpbihrZXkpCiAgICBjYWxsc3ViIF9yZXF1aXJlUGx1Z2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzU3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5wbHVnaW5zKGtleSkudmFsdWUuY2FuUmVjbGFpbSwgRVJSX0ZPUkJJRERFTikKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCA0CiAgICBnZXRiaXQKICAgIGJueiBhcmM1OF9wbHVnaW5SZWNsYWltX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxMiAvLyAiRVJSOkZPUkIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Rk9SQgoKYXJjNThfcGx1Z2luUmVjbGFpbV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM1OAogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfcmVxdWlyZUVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYxCiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYxLTEzNjIKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgLy8gVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICBibnogYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX3RydWVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYyCiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYxLTEzNjIKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgLy8gVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICBibnogYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX3RydWVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYzCiAgICAvLyBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGRpZyAyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNjEtMTM2MwogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIC8vIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgYnogYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX2ZhbHNlQDcKCmFyYzU4X3BsdWdpblJlY2xhaW1fYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNjAtMTM2NQogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICAvLyAgIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICBFUlJfRk9SQklEREVOCiAgICAvLyApCiAgICBibnogYXJjNThfcGx1Z2luUmVjbGFpbV9hZnRlcl9hc3NlcnRAMTAKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF9wbHVnaW5SZWNsYWltX2FmdGVyX2Fzc2VydEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM2NwogICAgLy8gdGhpcy5yZWNsYWltKGVzY3JvdywgcmVjbGFpbXMsICF0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5sb2NrZWQpOwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgNjQKICAgIGdldGJpdAogICAgIQogICAgZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgcmVjbGFpbQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNDgtMTM1MwogICAgLy8gYXJjNThfcGx1Z2luUmVjbGFpbSgKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIHJlY2xhaW1zOiBFc2Nyb3dSZWNsYWltW10KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X29wdEluRXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfb3B0SW5Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzYKICAgIC8vIGFyYzU4X29wdEluRXNjcm93KGVzY3Jvdzogc3RyaW5nLCBhc3NldHM6IHVpbnQ2NFtdKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzcKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSwgRVJSX0ZPUkJJRERFTikKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IGFyYzU4X29wdEluRXNjcm93X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxMiAvLyAiRVJSOkZPUkIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Rk9SQgoKYXJjNThfb3B0SW5Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzgKICAgIC8vIHRoaXMuX3JlcXVpcmVFc2Nyb3coZXNjcm93KQogICAgZGlnIDEKICAgIGR1cAogICAgY2FsbHN1YiBfcmVxdWlyZUVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzc5CiAgICAvLyB0aGlzLl9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93KQogICAgZHVwCiAgICBjYWxsc3ViIF9yZXF1aXJlVW5sb2NrZWRFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM4MAogICAgLy8gdGhpcy5vcHRJbkVzY3Jvdyhlc2Nyb3csIGFzc2V0cyk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBvcHRJbkVzY3JvdwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzYKICAgIC8vIGFyYzU4X29wdEluRXNjcm93KGVzY3Jvdzogc3RyaW5nLCBhc3NldHM6IHVpbnQ2NFtdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9wbHVnaW5PcHRJbkVzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM5Mi0xMzk4CiAgICAvLyBhcmM1OF9wbHVnaW5PcHRJbkVzY3JvdygKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIGFzc2V0czogdWludDY0W10sCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bgogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA1CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBjb3ZlciA0CiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzk5CiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXI6IGNhbGxlciwgZXNjcm93IH0KICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDExIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQwMQogICAgLy8gdGhpcy5fcmVxdWlyZVBsdWdpbihrZXkpCiAgICBjYWxsc3ViIF9yZXF1aXJlUGx1Z2luCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQwMgogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpCiAgICBkdXAKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQwMwogICAgLy8gdGhpcy5fcmVxdWlyZVVubG9ja2VkRXNjcm93KGVzY3JvdykKICAgIGNhbGxzdWIgX3JlcXVpcmVVbmxvY2tlZEVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDA2CiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MDYtMTQwNwogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIGJueiBhcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX3RydWVANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDA3CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIHR4biBTZW5kZXIKICAgIGRpZyA1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDA2LTE0MDcKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgLy8gVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICBibnogYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYm9vbF90cnVlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQwOAogICAgLy8gY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICBkaWcgNAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDA2LTE0MDgKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgLy8gVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICAvLyBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGJ6IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2Jvb2xfZmFsc2VANQoKYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDA1LTE0MTAKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IGNhbGxlciB8fAogICAgLy8gICBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgRVJSX0ZPUkJJRERFTgogICAgLy8gKQogICAgYm56IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2FmdGVyX2Fzc2VydEA4CiAgICBieXRlYyAxMiAvLyAiRVJSOkZPUkIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Rk9SQgoKYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTMtMTQxOQogICAgLy8gbWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIC8vICAgfQogICAgLy8gKSwKICAgIGR1cG4gMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxNgogICAgLy8gcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDE2CiAgICAvLyByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTMtMTQxOQogICAgLy8gbWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIC8vICAgfQogICAgLy8gKSwKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxNwogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGRpZyA0CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTMtMTQxOQogICAgLy8gbWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIC8vICAgfQogICAgLy8gKSwKICAgID09CiAgICAmJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEyLTE0MjEKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgbWF0Y2goCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICB7CiAgICAvLyAgICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICAgIH0KICAgIC8vICAgKSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgYm56IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2FmdGVyX2Fzc2VydEAxMAogICAgcHVzaGJ5dGVzICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgphcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19hZnRlcl9hc3NlcnRAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MjMKICAgIC8vIHRoaXMub3B0SW5Fc2Nyb3coZXNjcm93LCBhc3NldHMpOwogICAgZGlnIDMKICAgIGRpZyAzCiAgICBjYWxsc3ViIG9wdEluRXNjcm93CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM5Mi0xMzk4CiAgICAvLyBhcmM1OF9wbHVnaW5PcHRJbkVzY3JvdygKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIGFzc2V0czogdWludDY0W10sCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bgogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9hZGRBbGxvd2FuY2VzW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfYWRkQWxsb3dhbmNlczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzMgogICAgLy8gYXJjNThfYWRkQWxsb3dhbmNlcyhlc2Nyb3c6IHN0cmluZywgYWxsb3dhbmNlczogQWRkQWxsb3dhbmNlSW5mb1tdKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDM0CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6QWRkQWxsb3dhbmNlSW5mbz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzMwogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzNAogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpOwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzNQogICAgLy8gdGhpcy5fcmVxdWlyZVVubG9ja2VkRXNjcm93KGVzY3Jvdyk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBfcmVxdWlyZVVubG9ja2VkRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcmV0dXJuIE1pbkFsbG93YW5jZU1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgc3dhcAogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyByZXR1cm4gQm94Q29zdFBlckJ5dGUgKiBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXR1cm4gTWluQWxsb3dhbmNlTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBpbnRjIDYgLy8gMjc3MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzNwogICAgLy8gdGhpcy5fcGF5TWJyRnJvbUNvbnRyb2xsZWQodGhpcy5hbGxvd2FuY2VzTWJyKGVzY3JvdykgKiBhbGxvd2FuY2VzLmxlbmd0aCkKICAgICoKICAgIGNhbGxzdWIgX3BheU1ickZyb21Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MzkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvd2FuY2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYXJjNThfYWRkQWxsb3dhbmNlc193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG93YW5jZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGFyYzU4X2FkZEFsbG93YW5jZXNfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQwCiAgICAvLyBjb25zdCB7IGFzc2V0LCB0eXBlLCBhbW91bnQsIG1heCwgaW50ZXJ2YWwsIHVzZVJvdW5kcyB9ID0gYWxsb3dhbmNlc1tpXTsKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMzQKICAgICoKICAgIHB1c2hpbnQgMzQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBidXJ5IDkKICAgIGRpZyAxCiAgICBleHRyYWN0IDkgOAogICAgYnVyeSAxMwogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMjUgOAogICAgYnVyeSAxMQogICAgc3dhcAogICAgcHVzaGludCAyNjQKICAgIGdldGJpdAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NDEKICAgIC8vIGNvbnN0IGtleTogQWxsb3dhbmNlS2V5ID0geyBlc2Nyb3csIGFzc2V0IH0KICAgIGRpZyAyCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDYKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gMHgwMDBhCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gYWxsb3dhbmNlcyA9IEJveE1hcDxBbGxvd2FuY2VLZXksIEFsbG93YW5jZUluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhBbGxvd2FuY2VzIH0pIC8vIDM4XzUwMAogICAgYnl0ZWMgMTkgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NDIKICAgIC8vIGxvZ2dlZEFzc2VydCghdGhpcy5hbGxvd2FuY2VzKGtleSkuZXhpc3RzLCBFUlJfQUxMT1dBTkNFX0FMUkVBRFlfRVhJU1RTKTsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfYWRkQWxsb3dhbmNlc19hZnRlcl9hc3NlcnRANQogICAgcHVzaGJ5dGVzICJFUlI6RUFMVyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFQUxXCgphcmM1OF9hZGRBbGxvd2FuY2VzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQzCiAgICAvLyBjb25zdCBzdGFydCA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBkaWcgNQogICAgYnogYXJjNThfYWRkQWxsb3dhbmNlc190ZXJuYXJ5X2ZhbHNlQDcKICAgIGdsb2JhbCBSb3VuZAoKYXJjNThfYWRkQWxsb3dhbmNlc190ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NDUtMTQ1NAogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUgPSB7CiAgICAvLyAgIHR5cGUsCiAgICAvLyAgIHNwZW50OiAwLAogICAgLy8gICBhbW91bnQsCiAgICAvLyAgIGxhc3Q6IDAsCiAgICAvLyAgIG1heCwKICAgIC8vICAgaW50ZXJ2YWwsCiAgICAvLyAgIHN0YXJ0LAogICAgLy8gICB1c2VSb3VuZHMKICAgIC8vIH0KICAgIGRpZyA3CiAgICBkaWcgMTEKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ0NwogICAgLy8gc3BlbnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQ1LTE0NTQKICAgIC8vIHRoaXMuYWxsb3dhbmNlcyhrZXkpLnZhbHVlID0gewogICAgLy8gICB0eXBlLAogICAgLy8gICBzcGVudDogMCwKICAgIC8vICAgYW1vdW50LAogICAgLy8gICBsYXN0OiAwLAogICAgLy8gICBtYXgsCiAgICAvLyAgIGludGVydmFsLAogICAgLy8gICBzdGFydCwKICAgIC8vICAgdXNlUm91bmRzCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGRpZyA4CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG93YW5jZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9hZGRBbGxvd2FuY2VzX3doaWxlX3RvcEAyCgphcmM1OF9hZGRBbGxvd2FuY2VzX3Rlcm5hcnlfZmFsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ0MwogICAgLy8gY29uc3Qgc3RhcnQgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBhcmM1OF9hZGRBbGxvd2FuY2VzX3Rlcm5hcnlfbWVyZ2VAOAoKYXJjNThfYWRkQWxsb3dhbmNlc19hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzMgogICAgLy8gYXJjNThfYWRkQWxsb3dhbmNlcyhlc2Nyb3c6IHN0cmluZywgYWxsb3dhbmNlczogQWRkQWxsb3dhbmNlSW5mb1tdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVtb3ZlQWxsb3dhbmNlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3JlbW92ZUFsbG93YW5jZXM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NjYKICAgIC8vIGFyYzU4X3JlbW92ZUFsbG93YW5jZXMoZXNjcm93OiBzdHJpbmcsIGFzc2V0czogdWludDY0W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDY3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCkgfHwgdGhpcy5jYW5SZXZva2UoKSwgRVJSX09OTFlfQURNSU5fT1JfUkVWT0NBVElPTl9BUFBfQ0FOX1JFTU9WRV9NRVRIT0RfUkVTVFJJQ1RJT04pOwogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19ib29sX3RydWVAMwogICAgY2FsbHN1YiBjYW5SZXZva2UKICAgIGJ6IGFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYm9vbF9mYWxzZUA0CgphcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDY3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCkgfHwgdGhpcy5jYW5SZXZva2UoKSwgRVJSX09OTFlfQURNSU5fT1JfUkVWT0NBVElPTl9BUFBfQ0FOX1JFTU9WRV9NRVRIT0RfUkVTVFJJQ1RJT04pOwogICAgYm56IGFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOk9BUk0iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T0FSTQoKYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ2OAogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpOwogICAgZGlnIDIKICAgIGR1cAogICAgY2FsbHN1YiBfcmVxdWlyZUVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDY5CiAgICAvLyB0aGlzLl9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93KTsKICAgIGR1cAogICAgY2FsbHN1YiBfcmVxdWlyZVVubG9ja2VkRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcmV0dXJuIE1pbkFsbG93YW5jZU1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHJldHVybiBNaW5BbGxvd2FuY2VNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIGludGMgNiAvLyAyNzcwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDcxCiAgICAvLyB0aGlzLl9yZWZ1bmRNYnJUb0NvbnRyb2xsZWQodGhpcy5hbGxvd2FuY2VzTWJyKGVzY3JvdykgKiBhc3NldHMubGVuZ3RoKQogICAgZGlnIDEKICAgICoKICAgIGNhbGxzdWIgX3JlZnVuZE1iclRvQ29udHJvbGxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDczCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CgphcmM1OF9yZW1vdmVBbGxvd2FuY2VzX3doaWxlX3RvcEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDczCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IGFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYWZ0ZXJfd2hpbGVAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3NgogICAgLy8gYXNzZXQ6IGFzc2V0c1tpXQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3NC0xNDc3CiAgICAvLyBjb25zdCBrZXk6IEFsbG93YW5jZUtleSA9IHsKICAgIC8vICAgZXNjcm93LAogICAgLy8gICBhc3NldDogYXNzZXRzW2ldCiAgICAvLyB9CiAgICBkaWcgNAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIDB4MDAwYQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzIKICAgIC8vIGFsbG93YW5jZXMgPSBCb3hNYXA8QWxsb3dhbmNlS2V5LCBBbGxvd2FuY2VJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4QWxsb3dhbmNlcyB9KSAvLyAzOF81MDAKICAgIGJ5dGVjIDE5IC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDc4CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5hbGxvd2FuY2VzKGtleSkuZXhpc3RzLCBFUlJfQUxMT1dBTkNFX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19hZnRlcl9hc3NlcnRAMTEKICAgIGJ5dGVjIDM0IC8vICJFUlI6TkFMVyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOQUxXCgphcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3OQogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkuZGVsZXRlKCkKICAgIGRpZyA1CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgYXJjNThfcmVtb3ZlQWxsb3dhbmNlc193aGlsZV90b3BAOAoKYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NjYKICAgIC8vIGFyYzU4X3JlbW92ZUFsbG93YW5jZXMoZXNjcm93OiBzdHJpbmcsIGFzc2V0czogdWludDY0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9hZGRFeGVjdXRpb25LZXlbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9hZGRFeGVjdXRpb25LZXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0OTMKICAgIC8vIGFyYzU4X2FkZEV4ZWN1dGlvbktleShsZWFzZTogYnl0ZXM8MzI+LCBncm91cHM6IGJ5dGVzPDMyPltdLCBmaXJzdFZhbGlkOiB1aW50NjQsIGxhc3RWYWxpZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCAzMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8Ynl0ZXNbMzJdPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDk0CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKQogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ5NQogICAgLy8gaWYgKCF0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjNThfYWRkRXhlY3V0aW9uS2V5X2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0OTYtMTUwMAogICAgLy8gdGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZSA9IHsKICAgIC8vICAgZ3JvdXBzOiBjbG9uZShncm91cHMpLAogICAgLy8gICBmaXJzdFZhbGlkLAogICAgLy8gICBsYXN0VmFsaWQKICAgIC8vIH0KICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CgphcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ5MwogICAgLy8gYXJjNThfYWRkRXhlY3V0aW9uS2V5KGxlYXNlOiBieXRlczwzMj4sIGdyb3VwczogYnl0ZXM8MzI+W10sIGZpcnN0VmFsaWQ6IHVpbnQ2NCwgbGFzdFZhbGlkOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X2FkZEV4ZWN1dGlvbktleV9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUwMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZmlyc3RWYWxpZCA9PT0gZmlyc3RWYWxpZCwgRVJSX0VYRUNVVElPTl9LRVlfVVBEQVRFX01VU1RfTUFUQ0hfRklSU1RfVkFMSUQpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgPT0KICAgIGJueiBhcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOkVLRlYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RUtGVgoKYXJjNThfYWRkRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTAzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5sYXN0VmFsaWQgPT09IGxhc3RWYWxpZCwgRVJSX0VYRUNVVElPTl9LRVlfVVBEQVRFX01VU1RfTUFUQ0hfTEFTVF9WQUxJRCkKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgPT0KICAgIGJueiBhcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOkVLTFYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RUtMVgoKYXJjNThfYWRkRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTA1CiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyA9IFsuLi5jbG9uZSh0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyksIC4uLmNsb25lKGdyb3VwcyldCiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUwNQogICAgLy8gdGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5ncm91cHMgPSBbLi4uY2xvbmUodGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5ncm91cHMpLCAuLi5jbG9uZShncm91cHMpXQogICAgcHVzaGludCAxOAogICAgaW50Y18yIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGJveF9yZXNpemUKICAgIGR1cAogICAgZGlnIDcKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTA1CiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyA9IFsuLi5jbG9uZSh0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyksIC4uLmNsb25lKGdyb3VwcyldCiAgICBwdXNoaW50IDE4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MDUKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzID0gWy4uLmNsb25lKHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzKSwgLi4uY2xvbmUoZ3JvdXBzKV0KICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMjAKICAgICsKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGJveF9zcGxpY2UKICAgIGIgYXJjNThfYWRkRXhlY3V0aW9uS2V5X2FmdGVyX2lmX2Vsc2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUxNgogICAgLy8gYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5KGxlYXNlOiBieXRlczwzMj4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGJ5dGVjIDkgLy8gIngiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTE3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKGxlYXNlKS5leGlzdHMsIEVSUl9FWEVDVVRJT05fS0VZX05PVF9GT1VORCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMzUgLy8gIkVSUjpORVhLIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5FWEsKCmFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUxOAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpIHx8IHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUubGFzdFZhbGlkIDwgR2xvYmFsLnJvdW5kLCBFUlJfQURNSU5fT05MWSkKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IGFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9ib29sX3RydWVANQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGdsb2JhbCBSb3VuZAogICAgPAogICAgYnogYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2Jvb2xfZmFsc2VANgoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MTgKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSB8fCB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmxhc3RWYWxpZCA8IEdsb2JhbC5yb3VuZCwgRVJSX0FETUlOX09OTFkpCiAgICBibnogYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEA5CiAgICBieXRlYyAzNiAvLyAiRVJSOkFETU4iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QURNTgoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTIwCiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLmRlbGV0ZSgpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUxNgogICAgLy8gYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5KGxlYXNlOiBieXRlczwzMj4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9yZW1vdmVFeGVjdXRpb25LZXlfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0QWRtaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9nZXRBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUzMwogICAgLy8gcmV0dXJuIHRoaXMuYWRtaW4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQWRtaW4gfSkKICAgIGJ5dGVjIDE0IC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUzMwogICAgLy8gcmV0dXJuIHRoaXMuYWRtaW4udmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MzEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2dldFBsdWdpbnNbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9nZXRQbHVnaW5zOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKYXJjNThfZ2V0UGx1Z2luc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogYXJjNThfZ2V0UGx1Z2luc19hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsdWludDhbMzJdLChsZW4rdXRmOFtdKSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAyIG9mICh1aW50NjQsdWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQ0CiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXJjNThfZ2V0UGx1Z2luc19mb3JfaGVhZGVyQDEKCmFyYzU4X2dldFBsdWdpbnNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpQbHVnaW5LZXk+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NDQKICAgIC8vIGxldCBwbHVnaW5zOiBQbHVnaW5JbmZvW10gPSBbXQogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTQ1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwoKYXJjNThfZ2V0UGx1Z2luc193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU0NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA2CiAgICBkaWcgNQogICAgPAogICAgYnogYXJjNThfZ2V0UGx1Z2luc19hZnRlcl93aGlsZUAxMQogICAgZGlnIDYKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgYnVyeSAxMAogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICAtCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU0NgogICAgLy8gaWYgKHRoaXMucGx1Z2lucyhrZXlzW2ldKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfZ2V0UGx1Z2luc19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU0NwogICAgLy8gcGx1Z2lucy5wdXNoKHRoaXMucGx1Z2lucyhrZXlzW2ldKS52YWx1ZSkKICAgIGRpZyA4CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnl0ZWMgMTMgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgOAoKYXJjNThfZ2V0UGx1Z2luc19ibG9ja0AxMDoKICAgIGRpZyA1CiAgICBidXJ5IDcKICAgIGIgYXJjNThfZ2V0UGx1Z2luc193aGlsZV90b3BANgoKYXJjNThfZ2V0UGx1Z2luc19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NTAKICAgIC8vIHBsdWdpbnMucHVzaChlbXB0eVBsdWdpbkluZm8oKSkKICAgIGNhbGxzdWIgZW1wdHlQbHVnaW5JbmZvCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSA4CiAgICBiIGFyYzU4X2dldFBsdWdpbnNfYmxvY2tAMTAKCmFyYzU4X2dldFBsdWdpbnNfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgOAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9nZXROYW1lZFBsdWdpbnNbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9nZXROYW1lZFBsdWdpbnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXROYW1lZFBsdWdpbnNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFyYzU4X2dldE5hbWVkUGx1Z2luc19hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdXRmOFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2Zvcl9oZWFkZXJAMQoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzdHJpbmc+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NjMKICAgIC8vIGxldCBwbHVnaW5zOiBQbHVnaW5JbmZvW10gPSBbXQogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTY0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKCmFyYzU4X2dldE5hbWVkUGx1Z2luc193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgZGlnIDUKICAgIDwKICAgIGR1cAogICAgYnVyeSA4CiAgICBieiBhcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfd2hpbGVAMTMKICAgIGRpZyA2CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTY1CiAgICAvLyBpZiAodGhpcy5uYW1lZFBsdWdpbnMobmFtZXNbaV0pLmV4aXN0cykgewogICAgZGlnIDUKICAgIGRpZyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIG5hbWVkUGx1Z2lucyA9IEJveE1hcDxzdHJpbmcsIFBsdWdpbktleT4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeE5hbWVkUGx1Z2lucyB9KTsKICAgIGJ5dGVjIDE1IC8vICJuIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2NQogICAgLy8gaWYgKHRoaXMubmFtZWRQbHVnaW5zKG5hbWVzW2ldKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2NgogICAgLy8gY29uc3QgbmFtZUtleSA9IGNsb25lKHRoaXMubmFtZWRQbHVnaW5zKG5hbWVzW2ldKS52YWx1ZSkKICAgIGRpZyAxMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2NwogICAgLy8gaWYgKHRoaXMucGx1Z2lucyhuYW1lS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU2OAogICAgLy8gcGx1Z2lucy5wdXNoKHRoaXMucGx1Z2lucyhuYW1lS2V5KS52YWx1ZSkKICAgIGRpZyA5CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnl0ZWMgMTMgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgOQoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2Jsb2NrQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTY0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA4CiAgICBiIGFyYzU4X2dldE5hbWVkUGx1Z2luc193aGlsZV90b3BANgoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzEKICAgIC8vIHBsdWdpbnMucHVzaChlbXB0eVBsdWdpbkluZm8oKSkKICAgIGNhbGxzdWIgZW1wdHlQbHVnaW5JbmZvCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzIKICAgIC8vIGNvbnRpbnVlCiAgICBiIGFyYzU4X2dldE5hbWVkUGx1Z2luc19ibG9ja0AxMgoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzQKICAgIC8vIHBsdWdpbnMucHVzaChlbXB0eVBsdWdpbkluZm8oKSkKICAgIGNhbGxzdWIgZW1wdHlQbHVnaW5JbmZvCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSA5CiAgICBiIGFyYzU4X2dldE5hbWVkUGx1Z2luc19ibG9ja0AxMgoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX3doaWxlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgZGlnIDkKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0RXNjcm93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldEVzY3Jvd3M6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXRFc2Nyb3dzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBhcmM1OF9nZXRFc2Nyb3dzX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1dGY4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXRFc2Nyb3dzX2Zvcl9oZWFkZXJAMQoKYXJjNThfZ2V0RXNjcm93c19hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c3RyaW5nPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTg3CiAgICAvLyBsZXQgcmVzdWx0OiBFc2Nyb3dJbmZvW10gPSBbXQogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTg4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZXNjcm93cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKYXJjNThfZ2V0RXNjcm93c193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVzY3Jvd3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBkaWcgNQogICAgPAogICAgZHVwCiAgICBidXJ5IDgKICAgIGJ6IGFyYzU4X2dldEVzY3Jvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIGRpZyA2CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTg5CiAgICAvLyBpZiAodGhpcy5lc2Nyb3dzKGVzY3Jvd3NbaV0pLmV4aXN0cykgewogICAgZGlnIDUKICAgIGRpZyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1ODkKICAgIC8vIGlmICh0aGlzLmVzY3Jvd3MoZXNjcm93c1tpXSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzU4X2dldEVzY3Jvd3NfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTAKICAgIC8vIHJlc3VsdC5wdXNoKHRoaXMuZXNjcm93cyhlc2Nyb3dzW2ldKS52YWx1ZSkKICAgIGRpZyA5CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZGlnIDkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTAKICAgIC8vIHJlc3VsdC5wdXNoKHRoaXMuZXNjcm93cyhlc2Nyb3dzW2ldKS52YWx1ZSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgcmVwbGFjZTIgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBidXJ5IDkKCmFyYzU4X2dldEVzY3Jvd3NfYmxvY2tAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1ODgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBlc2Nyb3dzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgOAogICAgYiBhcmM1OF9nZXRFc2Nyb3dzX3doaWxlX3RvcEA2CgphcmM1OF9nZXRFc2Nyb3dzX2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTkzCiAgICAvLyByZXN1bHQucHVzaChlbXB0eUVzY3Jvd0luZm8oKSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgcmVwbGFjZTIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdXRpbHMudHM6MjItMjUKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGlkOiAwLAogICAgLy8gICBsb2NrZWQ6IGZhbHNlCiAgICAvLyB9OwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIGJ1cnkgOQogICAgYiBhcmM1OF9nZXRFc2Nyb3dzX2Jsb2NrQDEwCgphcmM1OF9nZXRFc2Nyb3dzX2FmdGVyX3doaWxlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTg1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgZGlnIDkKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0QWxsb3dhbmNlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldEFsbG93YW5jZXM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjA1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjA3CiAgICAvLyBsZXQgcmVzdWx0OiBBbGxvd2FuY2VJbmZvW10gPSBbXQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MDgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXRBbGxvd2FuY2VzX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjA4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBhcmM1OF9nZXRBbGxvd2FuY2VzX2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYwOQogICAgLy8gY29uc3Qga2V5OiBBbGxvd2FuY2VLZXkgPSB7IGVzY3JvdywgYXNzZXQ6IGFzc2V0c1tpXSB9CiAgICBkaWcgNAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDYKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyAweDAwMGEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhbGxvd2FuY2VzID0gQm94TWFwPEFsbG93YW5jZUtleSwgQWxsb3dhbmNlSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEFsbG93YW5jZXMgfSkgLy8gMzhfNTAwCiAgICBieXRlYyAxOSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYxMAogICAgLy8gaWYgKHRoaXMuYWxsb3dhbmNlcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXRBbGxvd2FuY2VzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjExCiAgICAvLyByZXN1bHQucHVzaCh0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZSkKICAgIGRpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTEKICAgIC8vIHJlc3VsdC5wdXNoKHRoaXMuYWxsb3dhbmNlcyhrZXkpLnZhbHVlKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICByZXBsYWNlMiAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMgoKYXJjNThfZ2V0QWxsb3dhbmNlc19ibG9ja0A2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjA4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXJjNThfZ2V0QWxsb3dhbmNlc193aGlsZV90b3BAMgoKYXJjNThfZ2V0QWxsb3dhbmNlc19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czozMAogICAgLy8gdHlwZTogdWludDgoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1aW50OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdXRpbHMudHM6MjktMzgKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHR5cGU6IHVpbnQ4KDApLAogICAgLy8gICBtYXg6IDAsCiAgICAvLyAgIGFtb3VudDogMCwKICAgIC8vICAgc3BlbnQ6IDAsCiAgICAvLyAgIGludGVydmFsOiAwLAogICAgLy8gICBsYXN0OiAwLAogICAgLy8gICBzdGFydDogMCwKICAgIC8vICAgdXNlUm91bmRzOiBmYWxzZQogICAgLy8gfTsKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTQKICAgIC8vIHJlc3VsdC5wdXNoKGVtcHR5QWxsb3dhbmNlSW5mbygpKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICByZXBsYWNlMiAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgYiBhcmM1OF9nZXRBbGxvd2FuY2VzX2Jsb2NrQDYKCmFyYzU4X2dldEFsbG93YW5jZXNfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYwNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2dldEV4ZWN1dGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9nZXRFeGVjdXRpb25zOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlc1szMl0+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MjcKICAgIC8vIGxldCByZXN1bHQ6IEV4ZWN1dGlvbkluZm9bXSA9IFtdCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjI4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVhc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYXJjNThfZ2V0RXhlY3V0aW9uc193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlYXNlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogYXJjNThfZ2V0RXhlY3V0aW9uc19hZnRlcl93aGlsZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MjkKICAgIC8vIGlmICh0aGlzLmV4ZWN1dGlvbnMobGVhc2VzW2ldKS5leGlzdHMpIHsKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgYnl0ZWMgOSAvLyAieCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyOQogICAgLy8gaWYgKHRoaXMuZXhlY3V0aW9ucyhsZWFzZXNbaV0pLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXRFeGVjdXRpb25zX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjMwCiAgICAvLyByZXN1bHQucHVzaCh0aGlzLmV4ZWN1dGlvbnMobGVhc2VzW2ldKS52YWx1ZSkKICAgIGRpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnl0ZWMgMTMgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgoKYXJjNThfZ2V0RXhlY3V0aW9uc19ibG9ja0A2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjI4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVhc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXJjNThfZ2V0RXhlY3V0aW9uc193aGlsZV90b3BAMgoKYXJjNThfZ2V0RXhlY3V0aW9uc19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MzMKICAgIC8vIHJlc3VsdC5wdXNoKGVtcHR5RXhlY3V0aW9uSW5mbygpKQogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgYiBhcmM1OF9nZXRFeGVjdXRpb25zX2Jsb2NrQDYKCmFyYzU4X2dldEV4ZWN1dGlvbnNfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2dldERvbWFpbktleXNbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9nZXREb21haW5LZXlzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY0NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjQ2CiAgICAvLyBsZXQgcmVzdWx0OiBzdHJpbmdbXSA9IFtdCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjQ3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYXJjNThfZ2V0RG9tYWluS2V5c193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY0NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogYXJjNThfZ2V0RG9tYWluS2V5c19hZnRlcl93aGlsZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NDgKICAgIC8vIGlmICh0aGlzLmRvbWFpbktleXMoYWRkcmVzc2VzW2ldKS5leGlzdHMpIHsKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGRvbWFpbktleXMgPSBCb3hNYXA8QWNjb3VudCwgc3RyaW5nPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RG9tYWluS2V5cyB9KQogICAgYnl0ZWMgMTcgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NDgKICAgIC8vIGlmICh0aGlzLmRvbWFpbktleXMoYWRkcmVzc2VzW2ldKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfZ2V0RG9tYWluS2V5c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY0OQogICAgLy8gcmVzdWx0LnB1c2godGhpcy5kb21haW5LZXlzKGFkZHJlc3Nlc1tpXSkudmFsdWUpCiAgICBkaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgYnVyeSAyCgphcmM1OF9nZXREb21haW5LZXlzX2Jsb2NrQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NDcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXREb21haW5LZXlzX3doaWxlX3RvcEAyCgphcmM1OF9nZXREb21haW5LZXlzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY1MgogICAgLy8gcmVzdWx0LnB1c2goIiIpCiAgICBkaWcgMQogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGJ1cnkgMgogICAgYiBhcmM1OF9nZXREb21haW5LZXlzX2Jsb2NrQDYKCmFyYzU4X2dldERvbWFpbktleXNfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY0NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Lm1icltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyByZXR1cm4gTWluRXNjcm93c01CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgZGlnIDMKICAgIGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIHJldHVybiBNaW5Fc2Nyb3dzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBwdXNoaW50IDY1MDAKICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NzYKICAgIC8vIHBsdWdpbnM6IHRoaXMucGx1Z2luc01icihlc2Nyb3csIG1ldGhvZENvdW50KSwKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgcGx1Z2luc01icgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIHJldHVybiBNaW5OYW1lZFBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKG5hbWUpLmxlbmd0aCkKICAgIHVuY292ZXIgNAogICAgbGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICBpbnRjIDQgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gcmV0dXJuIE1pbk5hbWVkUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMobmFtZSkubGVuZ3RoKQogICAgaW50YyA1IC8vIDE4OTAwCiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHJldHVybiBNaW5BbGxvd2FuY2VNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIGludGMgNiAvLyAyNzcwMAogICAgdW5jb3ZlciA1CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gcmV0dXJuIE1pbkRvbWFpbktleXNNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhkb21haW4pLmxlbmd0aCkKICAgIHB1c2hpbnQgMTU3MDAKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgdW5jb3ZlciA1CiAgICBwdXNoaW50IDEyODAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gcmV0dXJuIE1pbkV4ZWN1dGlvbnNNQlIgKyB0aGlzLl9jYWxjQkNQQihncm91cHMgKiAzMikKICAgIHB1c2hpbnQgMjA1MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjgyCiAgICAvLyBlc2Nyb3dFeGlzdHM6IHRoaXMuZXNjcm93cyhlc2Nyb3cpLmV4aXN0cywKICAgIGJveF9sZW4KICAgIGNvdmVyIDYKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjg1CiAgICAvLyBHbG9iYWwubWluQmFsYW5jZSArCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjg0LTE2ODYKICAgIC8vIE5ld0Nvc3RGb3JBUkM1OCArCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZSArCiAgICAvLyBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIgKwogICAgcHVzaGludCAxNjIxMDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4NC0xNjg3CiAgICAvLyBOZXdDb3N0Rm9yQVJDNTggKwogICAgLy8gR2xvYmFsLm1pbkJhbGFuY2UgKwogICAgLy8gQVJDNThXYWxsZXRJRHNCeUFjY291bnRzTWJyICsKICAgIC8vIGVzY3Jvd3MKICAgIGRpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NzUtMTY4OQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgcGx1Z2luczogdGhpcy5wbHVnaW5zTWJyKGVzY3JvdywgbWV0aG9kQ291bnQpLAogICAgLy8gICBuYW1lZFBsdWdpbnM6IHRoaXMubmFtZWRQbHVnaW5zTWJyKHBsdWdpbiksCiAgICAvLyAgIGVzY3Jvd3MsCiAgICAvLyAgIGFsbG93YW5jZXM6IHRoaXMuYWxsb3dhbmNlc01icihlc2Nyb3cpLAogICAgLy8gICBkb21haW5LZXlzOiB0aGlzLmRvbWFpbktleXNNYnIocGx1Z2luKSwKICAgIC8vICAgZXhlY3V0aW9uczogdGhpcy5leGVjdXRpb25zTWJyKGdyb3VwcyksCiAgICAvLyAgIGVzY3Jvd0V4aXN0czogdGhpcy5lc2Nyb3dzKGVzY3JvdykuZXhpc3RzLAogICAgLy8gICBuZXdFc2Nyb3dNaW50Q29zdDogKAogICAgLy8gICAgIE5ld0Nvc3RGb3JBUkM1OCArCiAgICAvLyAgICAgR2xvYmFsLm1pbkJhbGFuY2UgKwogICAgLy8gICAgIEFSQzU4V2FsbGV0SURzQnlBY2NvdW50c01iciArCiAgICAvLyAgICAgZXNjcm93cwogICAgLy8gICApCiAgICAvLyB9CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NjYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9yZXF1aXJlQWRtaW4oKSAtPiB2b2lkOgpfcmVxdWlyZUFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSwgRVJSX0FETUlOX09OTFkpCiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBfcmVxdWlyZUFkbWluX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlYyAzNiAvLyAiRVJSOkFETU4iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QURNTgoKX3JlcXVpcmVBZG1pbl9hZnRlcl9hc3NlcnRAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9yZXF1aXJlQWRtaW5PclJldm9rZSgpIC0+IHZvaWQ6Cl9yZXF1aXJlQWRtaW5PclJldm9rZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCkgfHwgdGhpcy5jYW5SZXZva2UoKSwgRVJSX09OTFlfQURNSU5fT1JfUkVWT0NBVElPTl9BUFBfQ0FOX1JFTU9WRV9QTFVHSU4pCiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBfcmVxdWlyZUFkbWluT3JSZXZva2VfYm9vbF90cnVlQDIKICAgIGNhbGxzdWIgY2FuUmV2b2tlCiAgICBieiBfcmVxdWlyZUFkbWluT3JSZXZva2VfYm9vbF9mYWxzZUAzCgpfcmVxdWlyZUFkbWluT3JSZXZva2VfYm9vbF90cnVlQDI6CiAgICBpbnRjXzEgLy8gMQoKX3JlcXVpcmVBZG1pbk9yUmV2b2tlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCkgfHwgdGhpcy5jYW5SZXZva2UoKSwgRVJSX09OTFlfQURNSU5fT1JfUkVWT0NBVElPTl9BUFBfQ0FOX1JFTU9WRV9QTFVHSU4pCiAgICBibnogX3JlcXVpcmVBZG1pbk9yUmV2b2tlX2FmdGVyX2Fzc2VydEA2CiAgICBwdXNoYnl0ZXMgIkVSUjpPQVJQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk9BUlAKCl9yZXF1aXJlQWRtaW5PclJldm9rZV9hZnRlcl9hc3NlcnRANjoKICAgIHJldHN1YgoKX3JlcXVpcmVBZG1pbk9yUmV2b2tlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9yZXF1aXJlQWRtaW5PclJldm9rZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3c6IGJ5dGVzKSAtPiB2b2lkOgpfcmVxdWlyZUVzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBwcml2YXRlIF9yZXF1aXJlRXNjcm93KGVzY3Jvdzogc3RyaW5nKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMjEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmVzY3Jvd3MoZXNjcm93KS5leGlzdHMsIEVSUl9FU0NST1dfRE9FU19OT1RfRVhJU1QpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfcmVxdWlyZUVzY3Jvd19hZnRlcl9hc3NlcnRAMgogICAgcHVzaGJ5dGVzICJFUlI6TkVTQyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpORVNDCgpfcmVxdWlyZUVzY3Jvd19hZnRlcl9hc3NlcnRAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93OiBieXRlcykgLT4gdm9pZDoKX3JlcXVpcmVVbmxvY2tlZEVzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBwcml2YXRlIF9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5sb2NrZWQsIEVSUl9FU0NST1dfTE9DS0VEKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgNjQKICAgIGdldGJpdAogICAgYnogX3JlcXVpcmVVbmxvY2tlZEVzY3Jvd19hZnRlcl9hc3NlcnRAMgogICAgcHVzaGJ5dGVzICJFUlI6RVNDTCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFU0NMCgpfcmVxdWlyZVVubG9ja2VkRXNjcm93X2FmdGVyX2Fzc2VydEAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuX3JlcXVpcmVQbHVnaW4oa2V5OiBieXRlcykgLT4gYnl0ZXM6Cl9yZXF1aXJlUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIHByaXZhdGUgX3JlcXVpcmVQbHVnaW4oa2V5OiBQbHVnaW5LZXkpOiB2b2lkIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnBsdWdpbnMoa2V5KS5leGlzdHMsIEVSUl9QTFVHSU5fRE9FU19OT1RfRVhJU1QpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfcmVxdWlyZVBsdWdpbl9hZnRlcl9hc3NlcnRAMgogICAgYnl0ZWMgMjcgLy8gIkVSUjpOUExHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5QTEcKCl9yZXF1aXJlUGx1Z2luX2FmdGVyX2Fzc2VydEAyOgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5fcGF5TWJyRnJvbUNvbnRyb2xsZWQoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6Cl9wYXlNYnJGcm9tQ29udHJvbGxlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBwcml2YXRlIF9wYXlNYnJGcm9tQ29udHJvbGxlZChhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gaWYgKHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgIT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzYKICAgIC8vIGlmICh0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICE9PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAhPQogICAgYnogX3BheU1ickZyb21Db250cm9sbGVkX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzctMjQzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50CiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCl9wYXlNYnJGcm9tQ29udHJvbGxlZF9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5fcmVmdW5kTWJyVG9Db250cm9sbGVkKGFtb3VudDogdWludDY0KSAtPiB2b2lkOgpfcmVmdW5kTWJyVG9Db250cm9sbGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNDgKICAgIC8vIHByaXZhdGUgX3JlZnVuZE1iclRvQ29udHJvbGxlZChhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gaWYgKHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgIT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNDkKICAgIC8vIGlmICh0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICE9PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAhPQogICAgYnogX3JlZnVuZE1iclRvQ29udHJvbGxlZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjUwLTI1NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYW1vdW50CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI1MC0yNTQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNTAtMjU1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKX3JlZnVuZE1iclRvQ29udHJvbGxlZF9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5wbHVnaW5zTWJyKGVzY3JvdzogYnl0ZXMsIG1ldGhvZENvdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKcGx1Z2luc01icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYzCiAgICAvLyBwcml2YXRlIHBsdWdpbnNNYnIoZXNjcm93OiBzdHJpbmcsIG1ldGhvZENvdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gcmV0dXJuIE1pblBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKChNZXRob2RSZXN0cmljdGlvbkJ5dGVMZW5ndGggKiBtZXRob2RDb3VudCkgKyBCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIHB1c2hpbnQgMjAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyByZXR1cm4gQm94Q29zdFBlckJ5dGUgKiBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjY0CiAgICAvLyByZXR1cm4gTWluUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoKE1ldGhvZFJlc3RyaWN0aW9uQnl0ZUxlbmd0aCAqIG1ldGhvZENvdW50KSArIEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgcHVzaGludCAzODkwMAogICAgKwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQubmV3RXNjcm93KGVzY3JvdzogYnl0ZXMpIC0+IHVpbnQ2NDoKbmV3RXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIHByaXZhdGUgbmV3RXNjcm93KGVzY3Jvdzogc3RyaW5nKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIHJldHVybiBNaW5Fc2Nyb3dzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIHJldHVybiBNaW5Fc2Nyb3dzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBwdXNoaW50IDY1MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyB0aGlzLl9wYXlNYnJGcm9tQ29udHJvbGxlZCh0aGlzLmVzY3Jvd3NNYnIoZXNjcm93KSkKICAgIGNhbGxzdWIgX3BheU1ickZyb21Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwMC0zMTAKICAgIC8vIGNvbnN0IGlkID0gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgICBhbW91bnQ6IE5ld0Nvc3RGb3JBUkM1OCArIEdsb2JhbC5taW5CYWxhbmNlLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzCiAgICAvLyAgICAgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwNQogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMDYKICAgIC8vIGFtb3VudDogTmV3Q29zdEZvckFSQzU4ICsgR2xvYmFsLm1pbkJhbGFuY2UsCiAgICBwdXNoaW50IDE1MDAwMAogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gZXNjcm93RmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzRXNjcm93RmFjdG9yeSB9KQogICAgYnl0ZWMgMjMgLy8gImVzY3Jvd19mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMDQtMzA4CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgIGFtb3VudDogTmV3Q29zdEZvckFSQzU4ICsgR2xvYmFsLm1pbkJhbGFuY2UsCiAgICAvLyAgIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcwogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwMC0zMTAKICAgIC8vIGNvbnN0IGlkID0gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgICBhbW91bnQ6IE5ld0Nvc3RGb3JBUkM1OCArIEdsb2JhbC5taW5CYWxhbmNlLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzCiAgICAvLyAgICAgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX25leHQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweGQ4NWNmMTg0IC8vIG1ldGhvZCAibmV3KHBheSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlID0geyBpZCwgbG9ja2VkOiBmYWxzZSB9CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzEyCiAgICAvLyB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZSA9IHsgaWQsIGxvY2tlZDogZmFsc2UgfQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHJldHVybiBpZDsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmlzQWRtaW4oKSAtPiB1aW50NjQ6CmlzQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSB8fAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNBZG1pbiB9KQogICAgYnl0ZWMgMTQgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUgfHwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjAtMzIxCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlIHx8CiAgICAvLyAodGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLmV4aXN0cyAmJiB0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikudmFsdWUgPT09IHRoaXMuZG9tYWluLnZhbHVlKQogICAgYm56IGlzQWRtaW5fYm9vbF90cnVlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyBkb21haW5LZXlzID0gQm94TWFwPEFjY291bnQsIHN0cmluZz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeERvbWFpbktleXMgfSkKICAgIGJ5dGVjIDE3IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gZG9tYWluS2V5cyA9IEJveE1hcDxBY2NvdW50LCBzdHJpbmc+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhEb21haW5LZXlzIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzIxCiAgICAvLyAodGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLmV4aXN0cyAmJiB0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikudmFsdWUgPT09IHRoaXMuZG9tYWluLnZhbHVlKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBpc0FkbWluX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGRvbWFpbktleXMgPSBCb3hNYXA8QWNjb3VudCwgc3RyaW5nPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RG9tYWluS2V5cyB9KQogICAgYnl0ZWMgMTcgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gKHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS5leGlzdHMgJiYgdGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLnZhbHVlID09PSB0aGlzLmRvbWFpbi52YWx1ZSkKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyBkb21haW5LZXlzID0gQm94TWFwPEFjY291bnQsIHN0cmluZz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeERvbWFpbktleXMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBkb21haW4gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNEb21haW4gfSk7CiAgICBieXRlYyAyMiAvLyAiZG9tYWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGJ6IGlzQWRtaW5fYm9vbF9mYWxzZUA0Cgppc0FkbWluX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzE5LTMyMgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSB8fAogICAgLy8gICAodGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLmV4aXN0cyAmJiB0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikudmFsdWUgPT09IHRoaXMuZG9tYWluLnZhbHVlKQogICAgLy8gKQogICAgcmV0c3ViCgppc0FkbWluX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMxOS0zMjIKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUgfHwKICAgIC8vICAgKHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS5leGlzdHMgJiYgdGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLnZhbHVlID09PSB0aGlzLmRvbWFpbi52YWx1ZSkKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmNhblJldm9rZSgpIC0+IHVpbnQ2NDoKY2FuUmV2b2tlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyID09PSB0aGlzLnJldm9jYXRpb24udmFsdWUuYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1CiAgICAvLyByZXZvY2F0aW9uID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVJldm9jYXRpb24gfSkKICAgIGJ5dGVjIDI0IC8vICJyZXZvY2F0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyID09PSB0aGlzLnJldm9jYXRpb24udmFsdWUuYWRkcmVzcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5yZXNvbHZlQ2FsbGVyVHlwZSh0eXBlOiB1aW50NjQsIGFkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKcmVzb2x2ZUNhbGxlclR5cGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gcHJpdmF0ZSByZXNvbHZlQ2FsbGVyVHlwZSh0eXBlOiB1aW50NjQsIGFkZHJlc3M6IEFjY291bnQpOiBBY2NvdW50IHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGlmICh0eXBlID09PSBDYWxsZXJUeXBlR2xvYmFsKSByZXR1cm4gR2xvYmFsLnplcm9BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogcmVzb2x2ZUNhbGxlclR5cGVfYWZ0ZXJfaWZfZWxzZUAyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIHJldHN1YgoKcmVzb2x2ZUNhbGxlclR5cGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIGlmICh0eXBlID09PSBDYWxsZXJUeXBlQWRtaW4pIHJldHVybiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGJ6IHJlc29sdmVDYWxsZXJUeXBlX2FmdGVyX2lmX2Vsc2VANAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHJldHN1YgoKcmVzb2x2ZUNhbGxlclR5cGVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHJldHVybiBhZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnR4blJla2V5c0JhY2sodHhuOiB1aW50NjQpIC0+IHVpbnQ2NDoKdHhuUmVrZXlzQmFjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwcml2YXRlIHR4blJla2V5c0JhY2sodHhuOiBndHhuLlRyYW5zYWN0aW9uKTogYm9vbGVhbiB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyB0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyB0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzcwLTM3MQogICAgLy8gdHhuLnNlbmRlciA9PT0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSAmJgogICAgLy8gdHhuLnJla2V5VG8gPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBieiB0eG5SZWtleXNCYWNrX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIHR4bi5yZWtleVRvID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzcwLTM3MQogICAgLy8gdHhuLnNlbmRlciA9PT0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSAmJgogICAgLy8gdHhuLnJla2V5VG8gPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBieiB0eG5SZWtleXNCYWNrX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIHJldHVybiB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKdHhuUmVrZXlzQmFja19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM3OAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM3OAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzkKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzctMzc5CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICBieiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODAKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM4MAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBibnogdHhuUmVrZXlzQmFja19ib29sX2ZhbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IoJ2FyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkJykKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAyOCAvLyBtZXRob2QgImFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM4MQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IoJ2FyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkJykKICAgIGJ6IHR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzYtMzgyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKCdhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCcpCiAgICAvLyApCiAgICByZXRzdWIKCnR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc2LTM4MgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICAgJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICAgJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIC8vICAgJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAgICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQnKQogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucGx1Z2luQ2hlY2soa2V5OiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpwbHVnaW5DaGVjazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzk5CiAgICAvLyBwcml2YXRlIHBsdWdpbkNoZWNrKGtleTogUGx1Z2luS2V5KTogUGx1Z2luVmFsaWRhdGlvbiB7CiAgICBwcm90byAxIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gY29uc3QgZXhpc3RzID0gdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzOwogICAgYm94X2xlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGlmICghZXhpc3RzKSB7CiAgICBibnogcGx1Z2luQ2hlY2tfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQwMy00MDgKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGV4aXN0czogZmFsc2UsCiAgICAvLyAgIGV4cGlyZWQ6IHRydWUsCiAgICAvLyAgIG9uQ29vbGRvd246IHRydWUsCiAgICAvLyAgIGhhc01ldGhvZFJlc3RyaWN0aW9uczogZmFsc2UsCiAgICAvLyB9CiAgICBwdXNoYnl0ZXMgMHg2MAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwbHVnaW5DaGVja19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQxMQogICAgLy8gY29uc3QgeyB1c2VSb3VuZHMsIGxhc3RWYWxpZCwgY29vbGRvd24sIGxhc3RDYWxsZWQsIG1ldGhvZHMgfSA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlIGFzIFJlYWRvbmx5PFBsdWdpbkluZm8+CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDkKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgc3dhcAogICAgcHVzaGludCAyOAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBieiBwbHVnaW5DaGVja190ZXJuYXJ5X2ZhbHNlQDQKICAgIGdsb2JhbCBSb3VuZAoKcGx1Z2luQ2hlY2tfdGVybmFyeV9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIGV4cGlyZWQ6IGVwb2NoUmVmID4gbGFzdFZhbGlkLAogICAgZHVwCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIG9uQ29vbGRvd246IChlcG9jaFJlZiAtIGxhc3RDYWxsZWQpIDwgY29vbGRvd24sCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDE4CiAgICAvLyBoYXNNZXRob2RSZXN0cmljdGlvbnM6IG1ldGhvZHMubGVuZ3RoID4gMCwKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDQ0CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMCAvLyAwCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQxNC00MTkKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGV4aXN0cywKICAgIC8vICAgZXhwaXJlZDogZXBvY2hSZWYgPiBsYXN0VmFsaWQsCiAgICAvLyAgIG9uQ29vbGRvd246IChlcG9jaFJlZiAtIGxhc3RDYWxsZWQpIDwgY29vbGRvd24sCiAgICAvLyAgIGhhc01ldGhvZFJlc3RyaWN0aW9uczogbWV0aG9kcy5sZW5ndGggPiAwLAogICAgLy8gfQogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIDQKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGx1Z2luQ2hlY2tfdGVybmFyeV9mYWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIGNvbnN0IGVwb2NoUmVmID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcDsKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGIgcGx1Z2luQ2hlY2tfdGVybmFyeV9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQub3B0SW5Fc2Nyb3coZXNjcm93OiBieXRlcywgYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6Cm9wdEluRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NDAKICAgIC8vIHByaXZhdGUgb3B0SW5Fc2Nyb3coZXNjcm93OiBzdHJpbmcsIGFzc2V0czogdWludDY0W10pOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU0MQogICAgLy8gY29uc3QgZXNjcm93QWRkcmVzcyA9IEFwcGxpY2F0aW9uKHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmlkKS5hZGRyZXNzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NDMtNTQ5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NDUKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU0NwogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgNAogICAgKgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU0My01NDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTQzLTU0OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpvcHRJbkVzY3Jvd193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IG9wdEluRXNjcm93X2FmdGVyX3doaWxlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUyLTU1OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgc2VuZGVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldHNbaV0KICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIHhmZXJBc3NldDogYXNzZXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU1NgogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NTItNTU4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBzZW5kZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0c1tpXQogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUyLTU1OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgc2VuZGVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldHNbaV0KICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIG9wdEluRXNjcm93X3doaWxlX3RvcEAyCgpvcHRJbkVzY3Jvd19hZnRlcl93aGlsZUA1OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnJlY2xhaW0oZXNjcm93OiBieXRlcywgcmVjbGFpbXM6IGJ5dGVzLCBhbGxvd0Nsb3NlT3V0OiB1aW50NjQpIC0+IGJ5dGVzOgpyZWNsYWltOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIHByaXZhdGUgcmVjbGFpbShlc2Nyb3c6IHN0cmluZywgcmVjbGFpbXM6IEVzY3Jvd1JlY2xhaW1bXSwgYWxsb3dDbG9zZU91dDogYm9vbGVhbik6IHZvaWQgewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTY0CiAgICAvLyBjb25zdCBzZW5kZXIgPSBBcHBsaWNhdGlvbih0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZCkuYWRkcmVzcwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCByZWNsYWltcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCnJlY2xhaW1fd2hpbGVfdG9wQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJlY2xhaW1zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNwogICAgPgogICAgYnogcmVjbGFpbV9hZnRlcl93aGlsZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjcKICAgIC8vIGlmIChyZWNsYWltc1tpXS5hc3NldCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDcKICAgIHB1c2hpbnQgMTcKICAgICoKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGJueiByZWNsYWltX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2OC01NzIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgIGFtb3VudDogcmVjbGFpbXNbaV0uYW1vdW50CiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTcwCiAgICAvLyByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzEKICAgIC8vIGFtb3VudDogcmVjbGFpbXNbaV0uYW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDYKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2OC01NzIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgIGFtb3VudDogcmVjbGFpbXNbaV0uYW1vdW50CiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpyZWNsYWltX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJlY2xhaW1zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNwogICAgYiByZWNsYWltX3doaWxlX3RvcEAxCgpyZWNsYWltX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU3NwogICAgLy8gYXNzZXRBbW91bnQ6IHJlY2xhaW1zW2ldLmFtb3VudCwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzQKICAgIC8vIGNvbnN0IHhmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1ODEKICAgIC8vIGlmIChhbGxvd0Nsb3NlT3V0ICYmIHJlY2xhaW1zW2ldLmNsb3NlT3V0KSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IHJlY2xhaW1fYWZ0ZXJfaWZfZWxzZUA4CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAxMjgKICAgIGdldGJpdAogICAgYnogcmVjbGFpbV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTgyCiAgICAvLyB4ZmVyLnNldCh7IGFzc2V0Q2xvc2VUbzogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSB9KTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4MgogICAgLy8geGZlci5zZXQoeyBhc3NldENsb3NlVG86IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgfSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNAogICAgZnJhbWVfYnVyeSA1CgpyZWNsYWltX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTg1CiAgICAvLyB4ZmVyLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIDQKICAgIGJ6IHJlY2xhaW1fbmV4dF9maWVsZEAxMAogICAgZnJhbWVfZGlnIDUKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpyZWNsYWltX25leHRfZmllbGRAMTA6CiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgNgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc0LTU3OQogICAgLy8gY29uc3QgeGZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJlY2xhaW1zW2ldLmFtb3VudCwKICAgIC8vICAgeGZlckFzc2V0OiByZWNsYWltc1tpXS5hc3NldAogICAgLy8gfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4NQogICAgLy8geGZlci5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICBiIHJlY2xhaW1fYWZ0ZXJfaWZfZWxzZUAxMgoKcmVjbGFpbV9hZnRlcl93aGlsZUAxMzoKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luKHBsdWdpbjogdWludDY0LCB0eXBlOiB1aW50NjQsIGVzY3JvdzogYnl0ZXMsIG1ldGhvZE9mZnNldHM6IGJ5dGVzLCBmdW5kc1JlcXVlc3Q6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk1NS05NjEKICAgIC8vIGFyYzU4X3Jla2V5VG9QbHVnaW4oCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICB0eXBlOiB1aW50NjQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBtZXRob2RPZmZzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgZnVuZHNSZXF1ZXN0OiBGdW5kc1JlcXVlc3RbXQogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA1IDIKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDExCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gY29uc3QgY2FsbGVyID0gdGhpcy5yZXNvbHZlQ2FsbGVyVHlwZSh0eXBlLCBUeG4uc2VuZGVyKQogICAgZnJhbWVfZGlnIC00CiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIHJlc29sdmVDYWxsZXJUeXBlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk2NAogICAgLy8gY29uc3Qga2V5OiBQbHVnaW5LZXkgPSB7IHBsdWdpbiwgY2FsbGVyLCBlc2Nyb3cgfQogICAgZnJhbWVfZGlnIC01CiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBieXRlYyAxMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk2NwogICAgLy8gaWYgKHR5cGUgPT09IENhbGxlclR5cGVBZG1pbikgewogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk2OAogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCkKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk3MQogICAgLy8gdGhpcy5fcmVxdWlyZVBsdWdpbihrZXkpCiAgICBmcmFtZV9kaWcgNDIKICAgIGNhbGxzdWIgX3JlcXVpcmVQbHVnaW4KICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGN1cnJlbnRQbHVnaW4gPSBHbG9iYWxTdGF0ZTxQbHVnaW5LZXk+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDdXJyZW50UGx1Z2luIH0pCiAgICBieXRlYyAyNiAvLyAiY3VycmVudF9wbHVnaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk3MgogICAgLy8gdGhpcy5jdXJyZW50UGx1Z2luLnZhbHVlID0gY2xvbmUoa2V5KQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBjb25zdCB7IGVzY3JvdzogZXNjcm93SUQgfSA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTc1CiAgICAvLyBpZiAoZXNjcm93SUQgIT09IDApIHsKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTc3CiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9IHNwZW5kaW5nQXBwLmFkZHJlc3MKICAgIGZyYW1lX2RpZyAxNwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHNwZW5kaW5nQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MgfSkKICAgIGJ5dGVjIDEwIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5NzcKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID0gc3BlbmRpbmdBcHAuYWRkcmVzcwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGNvbnN0IGVzY3Jvd0lEID0gdGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWUuaWQ7CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU5MgogICAgLy8gY29uc3QgZXNjcm93QWRkcmVzcyA9IEFwcGxpY2F0aW9uKGVzY3Jvd0lEKS5hZGRyZXNzOwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU5NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGZ1bmRzUmVxdWVzdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIwCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEA5NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZnVuZHNSZXF1ZXN0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDIwCiAgICA+CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1OTgKICAgIC8vIGFzc2V0OiBmdW5kc1JlcXVlc3RzW2ldLmFzc2V0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU5Ni01OTkKICAgIC8vIGNvbnN0IGFsbG93YW5jZUtleTogQWxsb3dhbmNlS2V5ID0gewogICAgLy8gICBlc2Nyb3csCiAgICAvLyAgIGFzc2V0OiBmdW5kc1JlcXVlc3RzW2ldLmFzc2V0CiAgICAvLyB9CiAgICBpdG9iCiAgICBieXRlYyAxOCAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhbGxvd2FuY2VzID0gQm94TWFwPEFsbG93YW5jZUtleSwgQWxsb3dhbmNlSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEFsbG93YW5jZXMgfSkgLy8gMzhfNTAwCiAgICBieXRlYyAxOSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjI1CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5hbGxvd2FuY2VzKGtleSkuZXhpc3RzLCBFUlJfQUxMT1dBTkNFX0RPRVNfTk9UX0VYSVNUKTsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDk5CiAgICBieXRlYyAzNCAvLyAiRVJSOk5BTFciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFMVwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAOTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gY29uc3QgeyB0eXBlLCBzcGVudCwgYW1vdW50LCBsYXN0LCBtYXgsIGludGVydmFsLCBzdGFydCwgdXNlUm91bmRzIH0gPSB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxCiAgICBmcmFtZV9idXJ5IDExCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDMzCiAgICBkdXAKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMTIKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMjMKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDI1CiAgICBkdXAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDIxCiAgICBkdXAKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDM0CiAgICBwdXNoaW50IDM5MgogICAgZ2V0Yml0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjI3CiAgICAvLyBjb25zdCBuZXdMYXN0ID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcDsKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMDEKICAgIGdsb2JhbCBSb3VuZAogICAgZnJhbWVfYnVyeSAyOQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDEwMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjI5CiAgICAvLyBpZiAodHlwZSA9PT0gU3BlbmRBbGxvd2FuY2VUeXBlRmxhdCkgewogICAgZnJhbWVfZGlnIDExCiAgICBieXRlYyAxNiAvLyAweDAxCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYzMAogICAgLy8gY29uc3QgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudCAtIHNwZW50OwogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgMzMKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBsb2dnZWRBc3NlcnQobGVmdG92ZXIgPj0gZnVuZFJlcXVlc3QuYW1vdW50LCBFUlJfQUxMT1dBTkNFX0VYQ0VFREVEKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzOQogICAgPj0KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMDUKICAgIGJ5dGVjIDIwIC8vICJFUlI6QUxFWCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBTEVYCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYzMgogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUuc3BlbnQgKz0gZnVuZFJlcXVlc3QuYW1vdW50CiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAzOQogICAgKwogICAgaXRvYgogICAgcHVzaGludCAxNwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY1NwogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUubGFzdCA9IG5ld0xhc3QKICAgIGZyYW1lX2RpZyAyOQogICAgaXRvYgogICAgZnJhbWVfZGlnIDYKICAgIHB1c2hpbnQgMzMKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjAzCiAgICAvLyBpZiAoZnVuZHNSZXF1ZXN0c1tpXS5hc3NldCAhPT0gMCkgewogICAgZnJhbWVfZGlnIDM3CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAxMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjA0LTYxMQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogZnVuZHNSZXF1ZXN0c1tpXS5hc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYwNgogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjA2CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIGFzc2V0QW1vdW50OiBmdW5kc1JlcXVlc3RzW2ldLmFtb3VudCwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAzNwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYwNC02MTAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBmdW5kc1JlcXVlc3RzW2ldLmFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGZ1bmRzUmVxdWVzdHNbaV0uYXNzZXQKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYwNC02MTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBmdW5kc1JlcXVlc3RzW2ldLmFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGZ1bmRzUmVxdWVzdHNbaV0uYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU5NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGZ1bmRzUmVxdWVzdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjAKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAOTYKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDEyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjEzLTYxOQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogZnVuZHNSZXF1ZXN0c1tpXS5hbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MTUKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjE3CiAgICAvLyBhbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYxMy02MTgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50CiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYxMy02MTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDEwNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjMzCiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNwZW5kQWxsb3dhbmNlVHlwZVdpbmRvdykgewogICAgZnJhbWVfZGlnIDExCiAgICBwdXNoYnl0ZXMgMHgwMgogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDExNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NjEKICAgIC8vIGlmICh1c2VSb3VuZHMpIHsKICAgIGZyYW1lX2RpZyA0MAogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vIHJldHVybiBHbG9iYWwucm91bmQgLSAoKEdsb2JhbC5yb3VuZCAtIHN0YXJ0KSAlIGludGVydmFsKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkdXAKICAgIGZyYW1lX2RpZyAzNAogICAgLQogICAgZnJhbWVfZGlnIDIxCiAgICAlCiAgICAtCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuZ2V0TGF0ZXN0V2luZG93U3RhcnRAMTI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzYKICAgIC8vIGlmIChjdXJyZW50V2luZG93U3RhcnQgPiBsYXN0KSB7CiAgICBmcmFtZV9kaWcgMjMKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDExMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzcKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPj0gZnVuZFJlcXVlc3QuYW1vdW50LCBFUlJfQUxMT1dBTkNFX0VYQ0VFREVEKTsKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEyCiAgICA8PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExMAogICAgYnl0ZWMgMjAgLy8gIkVSUjpBTEVYIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMRVgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjM4CiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZS5zcGVudCA9IGZ1bmRSZXF1ZXN0LmFtb3VudAogICAgZnJhbWVfZGlnIDYKICAgIHB1c2hpbnQgMTcKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTIxCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAxMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0MQogICAgLy8gY29uc3QgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudCAtIHNwZW50OwogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgMzMKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyBsb2dnZWRBc3NlcnQobGVmdG92ZXIgPj0gZnVuZFJlcXVlc3QuYW1vdW50LCBFUlJfQUxMT1dBTkNFX0VYQ0VFREVEKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNgogICAgPj0KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMTMKICAgIGJ5dGVjIDIwIC8vICJFUlI6QUxFWCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBTEVYCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0MwogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUuc3BlbnQgKz0gZnVuZFJlcXVlc3QuYW1vdW50CiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAzNgogICAgKwogICAgaXRvYgogICAgcHVzaGludCAxNwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyMQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjY0CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCAtICgoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCAtIHN0YXJ0KSAlIGludGVydmFsKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9kaWcgMzQKICAgIC0KICAgIGZyYW1lX2RpZyAyMQogICAgJQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzQKICAgIC8vIGNvbnN0IGN1cnJlbnRXaW5kb3dTdGFydCA9IHRoaXMuZ2V0TGF0ZXN0V2luZG93U3RhcnQodXNlUm91bmRzLCBzdGFydCwgaW50ZXJ2YWwpCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5nZXRMYXRlc3RXaW5kb3dTdGFydEAxMjgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDExNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjQ1CiAgICAvLyB9IGVsc2UgaWYgKHR5cGUgPT09IFNwZW5kQWxsb3dhbmNlVHlwZURyaXApIHsKICAgIGZyYW1lX2RpZyAxMQogICAgcHVzaGJ5dGVzIDB4MDMKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0NgogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZnJhbWVfZGlnIDQwCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VAMTE3CiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2J1cnkgMTYKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUAxMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0NwogICAgLy8gY29uc3QgcGFzc2VkOiB1aW50NjQgPSBlcG9jaFJlZiAtIGxhc3QKICAgIGZyYW1lX2RpZyAxNgogICAgZnJhbWVfZGlnIDIzCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY1MQogICAgLy8gY29uc3QgYWNjcnVlZDogdWludDY0ID0gc3BlbnQgKyAoKHBhc3NlZCAvIGludGVydmFsKSAqIGFtb3VudCkKICAgIGZyYW1lX2RpZyAyMQogICAgLwogICAgZnJhbWVfZGlnIDEyCiAgICAqCiAgICBmcmFtZV9kaWcgMzMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjUyCiAgICAvLyBjb25zdCBhdmFpbGFibGU6IHVpbnQ2NCA9IGFjY3J1ZWQgPiBtYXggPyBtYXggOiBhY2NydWVkCiAgICBkdXAKICAgIGZyYW1lX2RpZyAyNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICA+CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIGxvZ2dlZEFzc2VydChhdmFpbGFibGUgPj0gZnVuZFJlcXVlc3QuYW1vdW50LCBFUlJfQUxMT1dBTkNFX0VYQ0VFREVEKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzOAogICAgPj0KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMjAKICAgIGJ5dGVjIDIwIC8vICJFUlI6QUxFWCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBTEVYCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAxMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY1NQogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUuc3BlbnQgPSAoYXZhaWxhYmxlIC0gZnVuZFJlcXVlc3QuYW1vdW50KQogICAgZnJhbWVfZGlnIDEzCiAgICBmcmFtZV9kaWcgMzgKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyA2CiAgICBwdXNoaW50IDE3CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjEKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0NgogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfYnVyeSAxNgogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMTE4CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VAMTAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MjcKICAgIC8vIGNvbnN0IG5ld0xhc3QgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfYnVyeSAyOQogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMTAyCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDMwCiAgICAvLyBjb25zdCB7IHVzZVJvdW5kcywgdXNlRXhlY3V0aW9uS2V5IH0gPSB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZ2V0Yml0CiAgICBmcmFtZV9idXJ5IDQwCiAgICBpbnRjXzIgLy8gMgogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQzMgogICAgLy8gaWYgKHVzZUV4ZWN1dGlvbktleSAmJiAhdGhpcy5pc0FkbWluKCkpIHsKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MzMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS5leGlzdHMsIEVSUl9FWEVDVVRJT05fS0VZX05PVF9GT1VORCk7CiAgICB0eG4gTGVhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MzMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS5leGlzdHMsIEVSUl9FWEVDVVRJT05fS0VZX05PVF9GT1VORCk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAyNAogICAgYnl0ZWMgMzUgLy8gIkVSUjpORVhLIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5FWEsKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgYnl0ZWMgOSAvLyAieCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDM0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKFR4bi5sZWFzZSkudmFsdWUuZmlyc3RWYWxpZCA8PSBHbG9iYWwucm91bmQsIEVSUl9FWEVDVVRJT05fTk9UX1JFQURZKTsKICAgIHR4biBMZWFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQzNAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLnZhbHVlLmZpcnN0VmFsaWQgPD0gR2xvYmFsLnJvdW5kLCBFUlJfRVhFQ1VUSU9OX05PVF9SRUFEWSk7CiAgICBpbnRjXzIgLy8gMgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBnbG9iYWwgUm91bmQKICAgIDw9CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMjYKICAgIHB1c2hieXRlcyAiRVJSOkVYTlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RVhOUgoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS52YWx1ZS5sYXN0VmFsaWQgPj0gR2xvYmFsLnJvdW5kLCBFUlJfRVhFQ1VUSU9OX0VYUElSRUQpOwogICAgdHhuIExlYXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKFR4bi5sZWFzZSkudmFsdWUubGFzdFZhbGlkID49IEdsb2JhbC5yb3VuZCwgRVJSX0VYRUNVVElPTl9FWFBJUkVEKTsKICAgIHB1c2hpbnQgMTAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZ2xvYmFsIFJvdW5kCiAgICA+PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDI4CiAgICBwdXNoYnl0ZXMgIkVSUjpFWFhQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVYWFAKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgYnl0ZWMgOSAvLyAieCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDM3CiAgICAvLyBjb25zdCBncm91cHMgPSB0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS52YWx1ZS5ncm91cHMgYXMgUmVhZG9ubHk8Ynl0ZXM8MzI+W10+OwogICAgdHhuIExlYXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGxldCBmb3VuZEdyb3VwID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIwCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgOAogICAgcHVzaGludCAxOAogICAgaW50Y18yIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMjAKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfd2hpbGVAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyBpZiAoZ3JvdXBzW2ldID09PSBHbG9iYWwuZ3JvdXBJZCkgewogICAgZnJhbWVfZGlnIDIwCiAgICBwdXNoaW50IDMyCiAgICAqCiAgICBwdXNoaW50IDIwCiAgICArCiAgICBmcmFtZV9kaWcgOAogICAgc3dhcAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGdsb2JhbCBHcm91cElECiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ0MgogICAgLy8gZm91bmRHcm91cCA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxOAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjAKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BAMjkKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfd2hpbGVAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ0NgogICAgLy8gbG9nZ2VkQXNzZXJ0KGZvdW5kR3JvdXAsIEVSUl9HUk9VUF9OT1RfRk9VTkQpOwogICAgZnJhbWVfZGlnIDE4CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMzUKICAgIHB1c2hieXRlcyAiRVJSOk5HUlAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkdSUAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLmRlbGV0ZSgpOwogICAgdHhuIExlYXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIGNvbnN0IGluaXRpYWxDaGVjayA9IHRoaXMucGx1Z2luQ2hlY2soa2V5KTsKICAgIGZyYW1lX2RpZyA0MgogICAgY2FsbHN1YiBwbHVnaW5DaGVjawogICAgZnJhbWVfYnVyeSA0MgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyBsb2dnZWRBc3NlcnQoaW5pdGlhbENoZWNrLmV4aXN0cywgRVJSX1BMVUdJTl9ET0VTX05PVF9FWElTVCk7CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMzgKICAgIGJ5dGVjIDI3IC8vICJFUlI6TlBMRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOUExHCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyBsb2dnZWRBc3NlcnQoIWluaXRpYWxDaGVjay5leHBpcmVkLCBFUlJfUExVR0lOX0VYUElSRUQpOwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDQwCiAgICBieXRlYyAzNyAvLyAiRVJSOlBFWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UEVYUAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ1NAogICAgLy8gbG9nZ2VkQXNzZXJ0KCFpbml0aWFsQ2hlY2sub25Db29sZG93biwgRVJSX1BMVUdJTl9PTl9DT09MRE9XTik7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGdldGJpdAogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANDIKICAgIGJ5dGVjIDM4IC8vICJFUlI6UENMRCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQQ0xECgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA0MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDU2LTQ1OAogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMKICAgIC8vICAgPyBHbG9iYWwucm91bmQKICAgIC8vICAgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZnJhbWVfZGlnIDQwCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDU3CiAgICAvLyA/IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9idXJ5IDE2CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VANDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ2MAogICAgLy8gbGV0IHJla2V5c0JhY2sgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gbGV0IG1ldGhvZEluZGV4OiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIyCiAgICBmcmFtZV9kaWcgNDIKICAgIGZyYW1lX2J1cnkgNAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BANDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ2MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyMgogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ibG9ja0A5MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIGlmICh0aGlzLnR4blJla2V5c0JhY2sodHhuKSkgewogICAgZnJhbWVfZGlnIDIyCiAgICBjYWxsc3ViIHR4blJla2V5c0JhY2sKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjcKICAgIC8vIHJla2V5c0JhY2sgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMzIKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tAOTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ5NwogICAgLy8gbG9nZ2VkQXNzZXJ0KHJla2V5c0JhY2ssIEVSUl9NSVNTSU5HX1JFS0VZX0JBQ0spOwogICAgZnJhbWVfZGlnIDMyCiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAOTMKICAgIGJ5dGVjIDMzIC8vICJFUlI6TlJLQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOUktCCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA5MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTg2CiAgICAvLyBpZiAodGhpcy5wbHVnaW5zKGtleSkudmFsdWUuY292ZXJGZWVzKSB7CiAgICBwdXNoaW50IDI3CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMwogICAgZ2V0Yml0CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODgKICAgIC8vIGNvbnN0IG1heEZlZTogdWludDY0ID0gKE1BWF9JTk5FUl9UWE5fQ09VTlQgKyBNQVhfT1VURVJfVFhOX0NPVU5UKSAqIEdsb2JhbC5taW5UeG5GZWUKICAgIHB1c2hpbnQgMjcyCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTg5CiAgICAvLyBjb25zdCByZWltYnVyc2VtZW50ID0gVHhuLmZlZSA8IG1heEZlZSA/IFR4bi5mZWUgOiBtYXhGZWUKICAgIHR4biBGZWUKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMgogICAgdHhuIEZlZQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5OTEtOTk5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogcmVpbWJ1cnNlbWVudCwKICAgIC8vICAgICByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcicKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk5MwogICAgLy8gc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gc3BlbmRpbmdBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcyB9KQogICAgYnl0ZWMgMTAgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk5MwogICAgLy8gc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk5NAogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk5NgogICAgLy8gcmVrZXlUbzogcGx1Z2luQXBwLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTk3CiAgICAvLyBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcicKICAgIHB1c2hieXRlcyAicmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlciIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5OTEtOTk4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogcmVpbWJ1cnNlbWVudCwKICAgIC8vICAgICByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcicKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTkxLTk5OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHJlaW1idXJzZW1lbnQsCiAgICAvLyAgICAgcmVrZXlUbzogcGx1Z2luQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIHRvIHBsdWdpbiBhcHAgJiByZWltYnVyc2luZyBjYWxsZXInCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyByZWtleUluZGV4ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWtleUluZGV4IH0pCiAgICBieXRlYyAyMSAvLyAicmVrZXlfaW5kZXgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMTIKICAgIC8vIHRoaXMucmVrZXlJbmRleC52YWx1ZSA9IFR4bi5ncm91cEluZGV4CiAgICB0eG4gR3JvdXBJbmRleAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAxNAogICAgLy8gaWYgKHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmRlbGVnYXRpb25UeXBlID09PSBEZWxlZ2F0aW9uVHlwZVNlbGYpIHsKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzMgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBieXRlYyAxNiAvLyAweDAxCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDE5OgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMjoKICAgIGZyYW1lX2RpZyAyNgogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMTMKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAxLTEwMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJwogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMDMKICAgIC8vIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHNwZW5kaW5nQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MgfSkKICAgIGJ5dGVjIDEwIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAzCiAgICAvLyBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAwNQogICAgLy8gcmVrZXlUbzogcGx1Z2luQXBwLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAwNgogICAgLy8gbm90ZTogJ3Jla2V5aW5nIHRvIHBsdWdpbiBhcHAnCiAgICBwdXNoYnl0ZXMgInJla2V5aW5nIHRvIHBsdWdpbiBhcHAiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAxLTEwMDcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJwogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAxLTEwMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJwogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTcKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyBpZiAodHhuLnR5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwpIHsKICAgIGZyYW1lX2RpZyAyMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNgogICAgIT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA1MQogICAgZnJhbWVfZGlnIDQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tAODk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ2MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gKFR4bi5ncm91cEluZGV4ICsgMSk7IGkgPCBHbG9iYWwuZ3JvdXBTaXplOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjIKICAgIGZyYW1lX2J1cnkgNAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEA0NgoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDUxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIGxvZ2dlZEFzc2VydCh0eG4uYXBwSWQuaWQgPT09IGtleS5wbHVnaW4sIEVSUl9DQU5OT1RfQ0FMTF9PVEhFUl9BUFBTX0RVUklOR19SRUtFWSk7CiAgICBmcmFtZV9kaWcgMjIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGZyYW1lX2RpZyA0MgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDUzCiAgICBwdXNoYnl0ZXMgIkVSUjpDQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkNDT1IKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDUzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIGxvZ2dlZEFzc2VydCh0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AsIEVSUl9JTlZBTElEX09OQ09NUExFVEUpOwogICAgZnJhbWVfZGlnIDIyCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU1CiAgICBwdXNoYnl0ZXMgIkVSUjpJT0NOIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklPQ04KCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGxvZ2dlZEFzc2VydCh0eG4ubnVtQXBwQXJncyA+IDEsIEVSUl9JTlZBTElEX1NFTkRFUl9BUkcpOwogICAgZnJhbWVfZGlnIDIyCiAgICBndHhucyBOdW1BcHBBcmdzCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU3CiAgICBwdXNoYnl0ZXMgIkVSUjpJU0FHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklTQUcKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0ODAKICAgIC8vIGxvZ2dlZEFzc2VydChBcHBsaWNhdGlvbihidG9pKHR4bi5hcHBBcmdzKDEpKSkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCwgRVJSX0lOVkFMSURfU0VOREVSX1ZBTFVFKTsKICAgIGZyYW1lX2RpZyAyMgogICAgaW50Y18xIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBidG9pCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANTkKICAgIHB1c2hieXRlcyAiRVJSOklTVkwiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVNWTAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ4MgogICAgLy8gY29uc3QgeyBleHBpcmVkLCBvbkNvb2xkb3duLCBoYXNNZXRob2RSZXN0cmljdGlvbnMgfSA9IHRoaXMucGx1Z2luQ2hlY2soa2V5KTsKICAgIGZyYW1lX2RpZyA0MgogICAgY2FsbHN1YiBwbHVnaW5DaGVjawogICAgZnJhbWVfYnVyeSA0MgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGdldGJpdAogICAgZnJhbWVfYnVyeSAzMQogICAgc3dhcAogICAgcHVzaGludCAzCiAgICBnZXRiaXQKICAgIGZyYW1lX2J1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBsb2dnZWRBc3NlcnQoIWV4cGlyZWQsIEVSUl9QTFVHSU5fRVhQSVJFRCk7CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2MQogICAgYnl0ZWMgMzcgLy8gIkVSUjpQRVhQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBFWFAKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDYxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxvZ2dlZEFzc2VydCghb25Db29sZG93biwgRVJSX1BMVUdJTl9PTl9DT09MRE9XTik7CiAgICBmcmFtZV9kaWcgMzEKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDYzCiAgICBieXRlYyAzOCAvLyAiRVJSOlBDTEQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UENMRAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ4NwogICAgLy8gaWYgKGhhc01ldGhvZFJlc3RyaWN0aW9ucykgewogICAgZnJhbWVfZGlnIDE5CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAODgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyBsb2dnZWRBc3NlcnQobWV0aG9kSW5kZXggPCBtZXRob2RPZmZzZXRzLmxlbmd0aCwgRVJSX01BTEZPUk1FRF9PRkZTRVRTKTsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyAyNwogICAgPgogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDY2CiAgICBwdXNoYnl0ZXMgIkVSUjpNT0ZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1PRkYKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDY2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGNvbnN0IHsgbWV0aG9kQWxsb3dlZCwgbWV0aG9kT25Db29sZG93biB9ID0gdGhpcy5tZXRob2RDaGVjayhrZXksIHR4biwgbWV0aG9kT2Zmc2V0c1ttZXRob2RJbmRleF0pOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDI3CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTEwCiAgICAvLyBsb2dnZWRBc3NlcnQobGVuKHR4bi5hcHBBcmdzKDApKSA9PT0gNCwgRVJSX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9MRU5HVEgpCiAgICBmcmFtZV9kaWcgMjIKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDY4CiAgICBwdXNoYnl0ZXMgIkVSUjpJTVNMIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNU0wKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDY4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MTEKICAgIC8vIGNvbnN0IHNlbGVjdG9yQXJnID0gdHhuLmFwcEFyZ3MoMCkudG9GaXhlZCh7IGxlbmd0aDogNCB9KQogICAgZnJhbWVfZGlnIDM1CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBmcmFtZV9kaWcgNDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTEzCiAgICAvLyBjb25zdCB7IHVzZVJvdW5kcyB9ID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUKICAgIGR1cAogICAgcHVzaGludCAyNwogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMQogICAgZ2V0Yml0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTE0CiAgICAvLyBjb25zdCB7IHNlbGVjdG9yLCBjb29sZG93biwgbGFzdENhbGxlZCB9ID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUubWV0aG9kc1tvZmZzZXRdCiAgICBmcmFtZV9kaWcgMzAKICAgIHB1c2hpbnQgMjAKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgcHVzaGludCA0NgogICAgKwogICAgcHVzaGludCAyMAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDQKICAgIGZyYW1lX2J1cnkgOQogICAgZHVwCiAgICBwdXNoaW50IDQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDE1CiAgICBwdXNoaW50IDEyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGNvbnN0IGVwb2NoUmVmID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDcwCiAgICBnbG9iYWwgUm91bmQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA3MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTE5CiAgICAvLyBjb25zdCBtZXRob2RPbkNvb2xkb3duID0gKGVwb2NoUmVmIC0gbGFzdENhbGxlZCkgPCBjb29sZG93bgogICAgZnJhbWVfZGlnIDI0CiAgICAtCiAgICBmcmFtZV9kaWcgMTUKICAgIDwKICAgIGZyYW1lX2J1cnkgMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTIxCiAgICAvLyBpZiAoc2VsZWN0b3IgPT09IHNlbGVjdG9yQXJnICYmICghaGFzQ29vbGRvd24gfHwgIW1ldGhvZE9uQ29vbGRvd24pKSB7CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDEwCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDgwCiAgICBmcmFtZV9kaWcgMTUKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5faWZfYm9keUA3NAogICAgZnJhbWVfZGlnIDI4CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDgwCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2lmX2JvZHlANzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyMwogICAgLy8gaWYgKGhhc0Nvb2xkb3duKSB7CiAgICBmcmFtZV9kaWcgMTUKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA3OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MjQKICAgIC8vIGNvbnN0IGxhc3RDYWxsZWQgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZnJhbWVfZGlnIDQwCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VANzcKICAgIGdsb2JhbCBSb3VuZAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDc4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MjUKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLm1ldGhvZHNbb2Zmc2V0XS5sYXN0Q2FsbGVkID0gbGFzdENhbGxlZAogICAgaXRvYgogICAgZnJhbWVfZGlnIDE0CiAgICBwdXNoaW50IDU4CiAgICArCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDc5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MjgtNTMxCiAgICAvLyByZXR1cm4gewogICAgLy8gICBtZXRob2RBbGxvd2VkOiB0cnVlLAogICAgLy8gICBtZXRob2RPbkNvb2xkb3duCiAgICAvLyB9CiAgICBwdXNoYnl0ZXMgMHg4MAogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2RpZyAyOAogICAgc2V0Yml0CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQubWV0aG9kQ2hlY2tAODE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gY29uc3QgeyBtZXRob2RBbGxvd2VkLCBtZXRob2RPbkNvb2xkb3duIH0gPSB0aGlzLm1ldGhvZENoZWNrKGtleSwgdHhuLCBtZXRob2RPZmZzZXRzW21ldGhvZEluZGV4XSk7CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIGZyYW1lX2J1cnkgMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBsb2dnZWRBc3NlcnQobWV0aG9kQWxsb3dlZCAmJiAhbWV0aG9kT25Db29sZG93biwgRVJSX01FVEhPRF9PTl9DT09MRE9XTik7CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Jvb2xfZmFsc2VAODQKICAgIGZyYW1lX2RpZyAyOAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUA4NAogICAgaW50Y18xIC8vIDEKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9tZXJnZUA4NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBsb2dnZWRBc3NlcnQobWV0aG9kQWxsb3dlZCAmJiAhbWV0aG9kT25Db29sZG93biwgRVJSX01FVEhPRF9PTl9DT09MRE9XTik7CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDg4CiAgICBwdXNoYnl0ZXMgIkVSUjpNQ0xEIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1DTEQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA4ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgZnJhbWVfZGlnIDQyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0OTMKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmxhc3RDYWxsZWQgPSBlcG9jaFJlZgogICAgZnJhbWVfZGlnIDE2CiAgICBpdG9iCiAgICBwdXNoaW50IDI4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0OTQKICAgIC8vIG1ldGhvZEluZGV4ICs9IDE7CiAgICBmcmFtZV9kaWcgMjcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDI3CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYmxvY2tAODkKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUA4NDoKICAgIGludGNfMCAvLyAwCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9tZXJnZUA4NQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDc3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MjQKICAgIC8vIGNvbnN0IGxhc3RDYWxsZWQgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VANzgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA4MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTM0LTUzNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgbWV0aG9kQWxsb3dlZDogZmFsc2UsCiAgICAvLyAgIG1ldGhvZE9uQ29vbGRvd246IHRydWUKICAgIC8vIH0KICAgIHB1c2hieXRlcyAweDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gY29uc3QgeyBtZXRob2RBbGxvd2VkLCBtZXRob2RPbkNvb2xkb3duIH0gPSB0aGlzLm1ldGhvZENoZWNrKGtleSwgdHhuLCBtZXRob2RPZmZzZXRzW21ldGhvZEluZGV4XSk7CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5tZXRob2RDaGVja0A4MQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDcwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGNvbnN0IGVwb2NoUmVmID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VANzEKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBmcmFtZV9idXJ5IDE2CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA0NQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk4MAogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHNwZW5kaW5nQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MgfSkKICAgIGJ5dGVjIDEwIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODAKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5fYWRkUGx1Z2luKG5hbWU6IGJ5dGVzLCBwbHVnaW46IHVpbnQ2NCwgY2FsbGVyOiBieXRlcywgZXNjcm93OiBieXRlcywgYWRtaW46IHVpbnQ2NCwgZGVsZWdhdGlvblR5cGU6IGJ5dGVzLCBsYXN0VmFsaWQ6IHVpbnQ2NCwgY29vbGRvd246IHVpbnQ2NCwgbWV0aG9kczogYnl0ZXMsIHVzZVJvdW5kczogdWludDY0LCB1c2VFeGVjdXRpb25LZXk6IHVpbnQ2NCwgY292ZXJGZWVzOiB1aW50NjQsIGNhblJlY2xhaW06IHVpbnQ2NCwgZGVmYXVsdFRvRXNjcm93OiB1aW50NjQpIC0+IGJ5dGVzOgpfYWRkUGx1Z2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDYxLTEwNzYKICAgIC8vIHByaXZhdGUgX2FkZFBsdWdpbigKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgYWRtaW46IGJvb2xlYW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiBVaW50OCwKICAgIC8vICAgbGFzdFZhbGlkOiB1aW50NjQsCiAgICAvLyAgIGNvb2xkb3duOiB1aW50NjQsCiAgICAvLyAgIG1ldGhvZHM6IE1ldGhvZFJlc3RyaWN0aW9uW10sCiAgICAvLyAgIHVzZVJvdW5kczogYm9vbGVhbiwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBib29sZWFuLAogICAgLy8gICBjb3ZlckZlZXM6IGJvb2xlYW4sCiAgICAvLyAgIGNhblJlY2xhaW06IGJvb2xlYW4sCiAgICAvLyAgIGRlZmF1bHRUb0VzY3JvdzogYm9vbGVhbgogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byAxNCAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA1CiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA3NwogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA3OQogICAgLy8gY29uc3QgaXNOYW1lZCA9IG5hbWUgIT09ICcnCiAgICBmcmFtZV9kaWcgLTE0CiAgICBieXRlY18wIC8vICIiCiAgICAhPQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODAKICAgIC8vIGlmIChpc05hbWVkKSB7CiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIG5hbWVkUGx1Z2lucyA9IEJveE1hcDxzdHJpbmcsIFBsdWdpbktleT4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeE5hbWVkUGx1Z2lucyB9KTsKICAgIGJ5dGVjIDE1IC8vICJuIgogICAgZnJhbWVfZGlnIC0xNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODEKICAgIC8vIGxvZ2dlZEFzc2VydCghdGhpcy5uYW1lZFBsdWdpbnMobmFtZSkuZXhpc3RzLCBFUlJfUExVR0lOX0FMUkVBRFlfRVhJU1RTKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VANAogICAgYnl0ZWMgMzkgLy8gIkVSUjpFUExHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVQTEcKCl9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDg2CiAgICAvLyBkZWxlZ2F0aW9uVHlwZSA9PT0gRGVsZWdhdGlvblR5cGVTZWxmICYmCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ5dGVjIDE2IC8vIDB4MDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODYtMTA4NwogICAgLy8gZGVsZWdhdGlvblR5cGUgPT09IERlbGVnYXRpb25UeXBlU2VsZiAmJgogICAgLy8gY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGJ6IF9hZGRQbHVnaW5fYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODcKICAgIC8vIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODYtMTA4NwogICAgLy8gZGVsZWdhdGlvblR5cGUgPT09IERlbGVnYXRpb25UeXBlU2VsZiAmJgogICAgLy8gY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGJ6IF9hZGRQbHVnaW5fYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKX2FkZFBsdWdpbl9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwODQtMTA5MAogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICAhKAogICAgLy8gICAgIGRlbGVnYXRpb25UeXBlID09PSBEZWxlZ2F0aW9uVHlwZVNlbGYgJiYKICAgIC8vICAgICBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcwogICAgLy8gICApLAogICAgLy8gICBFUlJfWkVST19BRERSRVNTX0RFTEVHQVRJT05fVFlQRQogICAgLy8gKQogICAgYnogX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMTAKICAgIHB1c2hieXRlcyAiRVJSOlpBRFQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WkFEVAoKX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwOTMtMTA5NAogICAgLy8gdXNlRXhlY3V0aW9uS2V5ICYmCiAgICAvLyBjYWxsZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBieiBfYWRkUGx1Z2luX2Jvb2xfZmFsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5NAogICAgLy8gY2FsbGVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMTIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5My0xMDk0CiAgICAvLyB1c2VFeGVjdXRpb25LZXkgJiYKICAgIC8vIGNhbGxlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICBieiBfYWRkUGx1Z2luX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMSAvLyAxCgpfYWRkUGx1Z2luX2Jvb2xfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwOTEtMTA5NwogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICAhKAogICAgLy8gICAgIHVzZUV4ZWN1dGlvbktleSAmJgogICAgLy8gICAgIGNhbGxlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICAvLyAgICksCiAgICAvLyAgIEVSUl9VU0lOR19FWEVDVVRJT05fS0VZX1JFUVVJUkVTX0dMT0JBTAogICAgLy8gKQogICAgYnogX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMTYKICAgIHB1c2hieXRlcyAiRVJSOlVFS0ciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6VUVLRwoKX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMDAKICAgIC8vIGlmIChkZWZhdWx0VG9Fc2Nyb3cpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hZGRQbHVnaW5faWZfYm9keUAxNwogICAgZnJhbWVfZGlnIC0xMQogICAgZnJhbWVfYnVyeSAxCgpfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMDUKICAgIC8vIGNvbnN0IGtleTogUGx1Z2luS2V5ID0geyBwbHVnaW4sIGNhbGxlciwgZXNjcm93OiBlc2Nyb3dLZXkgfQogICAgZnJhbWVfZGlnIC0xMwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDExIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEwNwogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLnBsdWdpbnMoa2V5KS5leGlzdHMsIEVSUl9QTFVHSU5fQUxSRUFEWV9FWElTVFMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfYXNzZXJ0QDIyCiAgICBieXRlYyAzOSAvLyAiRVJSOkVQTEciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RVBMRwoKX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMDkKICAgIC8vIGxldCBtZXRob2RJbmZvczogTWV0aG9kSW5mb1tdID0gW10KICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExMAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hZGRQbHVnaW5fd2hpbGVfdG9wQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTEwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIC02CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDcKICAgID4KICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfd2hpbGVAMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gbWV0aG9kSW5mb3MucHVzaCh7IC4uLm1ldGhvZHNbaV0sIGxhc3RDYWxsZWQ6IDAgfSkKICAgIGZyYW1lX2RpZyAtNgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMTIKICAgICoKICAgIHB1c2hpbnQgMTIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgc3dhcAogICAgZXh0cmFjdCA0IDgKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMTEKICAgIC8vIG1ldGhvZEluZm9zLnB1c2goeyAuLi5tZXRob2RzW2ldLCBsYXN0Q2FsbGVkOiAwIH0pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIHJlcGxhY2UyIDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMTAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA3CiAgICBiIF9hZGRQbHVnaW5fd2hpbGVfdG9wQDIzCgpfYWRkUGx1Z2luX2FmdGVyX3doaWxlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE0CiAgICAvLyBsZXQgdG90YWxNYnI6IHVpbnQ2NCA9IHRoaXMucGx1Z2luc01icihlc2Nyb3dLZXksIG1ldGhvZEluZm9zLmxlbmd0aCkKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNhbGxzdWIgcGx1Z2luc01icgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE1CiAgICAvLyBpZiAoaXNOYW1lZCkgewogICAgZnJhbWVfZGlnIDgKICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIHJldHVybiBNaW5OYW1lZFBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKG5hbWUpLmxlbmd0aCkKICAgIGZyYW1lX2RpZyAtMTQKICAgIGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIHJldHVybiBNaW5OYW1lZFBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKG5hbWUpLmxlbmd0aCkKICAgIGludGMgNSAvLyAxODkwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE2CiAgICAvLyB0b3RhbE1iciArPSB0aGlzLm5hbWVkUGx1Z2luc01icihuYW1lKQogICAgKwoKX2FkZFBsdWdpbl9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE4CiAgICAvLyB0aGlzLl9wYXlNYnJGcm9tQ29udHJvbGxlZCh0b3RhbE1icikKICAgIGNhbGxzdWIgX3BheU1ickZyb21Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gaWYgKGVzY3JvdyA9PT0gJycpIHsKICAgIGZyYW1lX2RpZyAtMTEKICAgIGJ5dGVjXzAgLy8gIiIKICAgID09CiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKX2FkZFBsdWdpbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Lm1heWJlTmV3RXNjcm93QDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTIxCiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBmcmFtZV9kaWcgLTUKICAgIGJ6IF9hZGRQbHVnaW5fdGVybmFyeV9mYWxzZUAyOQogICAgZ2xvYmFsIFJvdW5kCgpfYWRkUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMzMKICAgIC8vIGNhblJlY2xhaW06IGVzY3JvdyAhPT0gJycgPyBjYW5SZWNsYWltIDogZmFsc2UsCiAgICBmcmFtZV9kaWcgLTExCiAgICBieXRlY18wIC8vICIiCiAgICAhPQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyMy0xMTM2CiAgICAvLyB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSA9IHsKICAgIC8vICAgZXNjcm93OiBlc2Nyb3dJRCwKICAgIC8vICAgYWRtaW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlLAogICAgLy8gICBsYXN0VmFsaWQsCiAgICAvLyAgIGNvb2xkb3duLAogICAgLy8gICBtZXRob2RzOiBjbG9uZShtZXRob2RJbmZvcyksCiAgICAvLyAgIHVzZVJvdW5kcywKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5LAogICAgLy8gICBjb3ZlckZlZXMsCiAgICAvLyAgIGNhblJlY2xhaW06IGVzY3JvdyAhPT0gJycgPyBjYW5SZWNsYWltIDogZmFsc2UsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IDAsCiAgICAvLyAgIHN0YXJ0OiBlcG9jaFJlZiwKICAgIC8vIH0KICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTkKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC04CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNwogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDJjCiAgICBjb25jYXQKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMTAKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2RpZyAtNQogICAgc2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgZnJhbWVfZGlnIC00CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgZnJhbWVfZGlnIC0zCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEzOAogICAgLy8gaWYgKGlzTmFtZWQpIHsKICAgIGZyYW1lX2RpZyA4CiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBuYW1lZFBsdWdpbnMgPSBCb3hNYXA8c3RyaW5nLCBQbHVnaW5LZXk+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhOYW1lZFBsdWdpbnMgfSk7CiAgICBieXRlYyAxNSAvLyAibiIKICAgIGZyYW1lX2RpZyAtMTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTM5CiAgICAvLyB0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS52YWx1ZSA9IGNsb25lKGtleSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAoKX2FkZFBsdWdpbl9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9hZGRQbHVnaW5fdGVybmFyeV9mYWxzZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyMQogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBfYWRkUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMzAKCl9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBmcmFtZV9kaWcgLTExCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI5MgogICAgLy8gcmV0dXJuIHRoaXMuZXNjcm93cyhlc2Nyb3cpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI5Mi0yOTQKICAgIC8vIHJldHVybiB0aGlzLmVzY3Jvd3MoZXNjcm93KS5leGlzdHMKICAgIC8vICAgPyB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZAogICAgLy8gICA6IHRoaXMubmV3RXNjcm93KGVzY3JvdykKICAgIGJ6IF9hZGRQbHVnaW5fdGVybmFyeV9mYWxzZUAzNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyOTMKICAgIC8vID8gdGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWUuaWQKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CgpfYWRkUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMzg6CiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyMAogICAgLy8gY29uc3QgZXNjcm93SUQgPSB0aGlzLm1heWJlTmV3RXNjcm93KGVzY3Jvdyk7CiAgICBiIF9hZGRQbHVnaW5fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5tYXliZU5ld0VzY3Jvd0AzOQoKX2FkZFBsdWdpbl90ZXJuYXJ5X2ZhbHNlQDM3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyOTQKICAgIC8vIDogdGhpcy5uZXdFc2Nyb3coZXNjcm93KQogICAgZnJhbWVfZGlnIC0xMQogICAgY2FsbHN1YiBuZXdFc2Nyb3cKICAgIGIgX2FkZFBsdWdpbl90ZXJuYXJ5X21lcmdlQDM4CgpfYWRkUGx1Z2luX2lmX2JvZHlAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMDEKICAgIC8vIGxvZ2dlZEFzc2VydChlc2Nyb3cgIT09ICcnLCBFUlJfRVNDUk9XX1JFUVVJUkVEX1RPX0JFX1NFVF9BU19ERUZBVUxUKQogICAgZnJhbWVfZGlnIC0xMQogICAgYnl0ZWNfMCAvLyAiIgogICAgIT0KICAgIGJueiBfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxOQogICAgcHVzaGJ5dGVzICJFUlI6RVJTRCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFUlNECgpfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEwMgogICAgLy8gZXNjcm93S2V5ID0gJycKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjAKCl9hZGRQbHVnaW5fYm9vbF9mYWxzZUAxMzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hZGRQbHVnaW5fYm9vbF9tZXJnZUAxNAoKX2FkZFBsdWdpbl9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYWRkUGx1Z2luX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAHAAECCJAD1JMBtNgBJigAEmNvbnRyb2xsZWRfYWRkcmVzcwFwFWxhc3RfdXNlcl9pbnRlcmFjdGlvbgFlBBUffHULbGFzdF9jaGFuZ2UCAAABAAF4EHNwZW5kaW5nX2FkZHJlc3MCACoIRVJSOkZPUkICAAIFYWRtaW4BbgEBAWQCAAoBYQhFUlI6QUxFWAtyZWtleV9pbmRleAZkb21haW4OZXNjcm93X2ZhY3RvcnkKcmV2b2NhdGlvbg91cGRhdGVfc2V0dGluZ3MOY3VycmVudF9wbHVnaW4IRVJSOk5QTEcEbMP2Bgd2ZXJzaW9uCWFraXRhX2RhbwhuaWNrbmFtZQtmYWN0b3J5X2FwcAhFUlI6TlJLQghFUlI6TkFMVwhFUlI6TkVYSwhFUlI6QURNTghFUlI6UEVYUAhFUlI6UENMRAhFUlI6RVBMRzEYQAAEJxUiZ4AE6pGA3TYaAI4BAS8xGRREMRhBARiCCwS9YJnlBHeHhn0ELXcRtwRAGm2ABJ+RzM0EF9i8tAQ4VlirBF7wtBUEXFiVPATSS3VWBBR7bNYnHIIbBMlaXT0Es2I0pQRa3zOPBEikRWYEVnJGLgRXpR2IBO70SP0EVy/R6gTjULnUBAqMssIEJbcTygTrrxSgBGogXPwErhpNygRkTS3sBL9NfFcE1d04KwRc6+1DBNWGha8EE7xE5ASJp2gmBAV5TX0EokA93wQC/kUVBEG9xoAEiCuxwgQXYMZSNhoAjicCRwLqAwMDFQMnA0ADWANwA4wDswPOBHsEzgVRBkkGkQbrB3wHwAgOCKwJFAlcCacJ4AqICsMLfgxrDRkN4Q4lDjEO+w/LEIYRMhGuEhgAgATp7S5vNhoAjgEBPwAxGYEEEjEYEERCAoaKAgGL/lcCAIv/JAtLAUxZSlkkCFiJigMBi/0iWUkkCyQIi/0kSwJSi/8kC69Qi/0Vi/1PA08CUov+UFBMi/8ISRZXBgBMJAtJIosEiwIMQQAjiwNJFlcGAIsAiwRJTgRPAl1JjABLAVkkCAiMAyQIjARC/9WLAYsAUIwAiYoDASiL/SJZSYv/CBZXBgBMi/1XAgBMJAuL/yQLIosFiwMMQQAciwKLBUlOAlmLBAgWVwYAiwFMUIwBJAiMBUL/3IsCFYwAIowFiwWLBAxBAByL/osFSU4CWYsACBZXBgCLAUxQjAEkCIwFQv/ciwKLA4sAUosBTFCL/hWL/osETwJSUIwAiYoBAYv/FkmTJQ5EVwcBiSKI/+0iFklPAlBLAVBLAVCAAwAsAFBLAVBMUCcHUIk2GgFJIlkkCEsBFRJEVwIANhoCSRUlEkQXNhoDSRWBIBJENhoESRWBIBJENhoFSSJZJAhLARUSRFcCADYaBkkVJRJEFzYaB0kVJRJEFzYaCEkiWSQISwEVEkRXAgA2GglJFYEgEkQ2GgpJFYEgEkQyDUAADIAIRVJSOkJERVCwAEsGSwgTQAAMgAhFUlI6QUNCQ7AAJx1LCmcnHksJZycOSwdnJxZLBmdLBzIDEkEARTIKKUxnJxdLBWcnCjIDZycYSwRnJx9LA2cnIDINZ4AIcmVmZXJyZXJLAmcnGYABwGeABHNhbHRLAWcrMgdnJwYyB2cjQ0sHQv+4NhoBSSJZJAhLARUSRFcCAEkiTCgTQQAQSwFJiBCAJwRMUL5EIltFAbEiJxdlRElyCESBxF6yCLIHI7IQIrIBtksBFkyyGIAEYH5wRrIashqBBrIQIrIBsyNDNhoBSSJZJAhLARUSRFcCAIgRQEAAGCInGWVEIlNBACUxACInIGVEcghEEkEAFyNAAAyACEVSUjpPQUNVsAAnHUsBZyNDIkL/5jYaAUkiWSQISwEVEkRXAgCID7wnFkxnI0M2GgFJFSUSRBeID6onGExnI0M2GgFJFSUSRBeID5gnHkxnI0M2GgFJIlkkCEsBFRJEVwIAiA9/Jx9MZyNDNhoBSRUlEkQXiA9tgAZhdmF0YXJMZyNDNhoBSRUlEkQXiA9VgAZiYW5uZXJMZyNDNhoBSSJZJAhLARUSRFcCAIgPNoADYmlvTGcjQzYaAUkVIxJEIlM2GgJJFSMSRCJTiA8WJwgiTwNUI08CVCcZTGcjQzYaAUkVgSASRIgO+icOTGcrMgdnJwYyB2cjQyI2GgFJFYEgEkQiJxplTElPAkRJIltMSYEoWUsBFVJXAgAoEkAADIAIRVJSOkFQTkWwADEASwFyCEQSQAAMgAhFUlI6U01BULAAIillRHMCREsBcghEEkAADIAIRVJSOlBEQ1ewACpLAlBJRQW9RQFBADZLA4EbI7oiU0EAKyNAAAyACEVSUjpQREFQsAAnDksDZ0sDJSO6JxASQQAEKzIHZycGMgdnI0MiQv/SIicKZURJcwJMTgJEIillRBJBADoiKWVEMgoSQQAwMgNLARJAAAyACEVSUjpBVUFNsAAnCjIDZzIKIhZMUIAEACoAAFAnGkxnJxUiZyNDMgpC/80oSTYaAUkVgSASRDYaAkkVIxJEIlOIDdOxIillRIAbcmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50sgVLArIgTwKyB7IAI7IQIrIBs0EAJCJFATEWIwhFAksBMgQMQQALSwGIDxBBABEjRQFJQAAEJyGwACsyB2cjQ0sBIwhFAkL/1ihHBTYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVgSASRDYaBEkiWSQISwEVEkRXAgA2GgVJTgUVgQQSRE4CiA6bTwIWTFBLARUWVwYCTwJQTCcLUExQKkxQSb1FAUAADiInCCJPAlQnBUxQsCNDRwKBESW6F0UJSYEbI7pJI1NFBSRTTIEcJboXRQZBAAQiQv/PSYEsJLoXFEUEIkUGSYEsJLoXSwYNQQAaSwWBFAuBLghLAUyBFLpXAARLAhJBADEjRQRLAkEAIjIGRQdLBEsHD0EAEksGSwUJSwgPQQAHI0sEEEL/eiJC//YyB0UHQv/bSwUjCEUGQv+jNhoBSRUlEkQXNhoCSRUlEkQXNhoDSSJZJAhLARUSRFcCADYaBEkiWSULJAhLARUSRDYaBUkiWYEQCyQISwEVEkSID4tGAiNDNhoBSSJZJAhLARUSRFcCADYaAkkVJRJEFzYaA0kiWSQISwEVEkRXAgA2GgRJIlklCyQISwEVEkQ2GgVJIlmBEAskCEsBFRJEJw9PBVAiJboXTgSIDzFGAiNDNhoBSRUlEkQXNhoCSRWBIBJENhoDSSJZJAhLARUSRFcCADYaBEkVIxJEIlM2GgVJFSMSRDYaBkkVJRJEFzYaB0kVJRJEFzYaCEkiWYEMCyQISwEVEkQ2GglJFSMSRCJTNhoKSRUjEkQiUzYaC0kVIxJEIlM2GgxJFSMSRCJTNhoNSRUjEkQiUyhODYgUP0gjQzYaAUkVgSASRDYaAkkiWSQISwEVEkRXAgCIDFxAAAyACEVSUjpPQUFQsABHAhUhBAuB1HoIiAt9JxFLA1BJvEhMvyNDNhoBSRUlEkQXNhoCSRWBIBJENhoDSSJZJAhLARUSRFcCAIgK308CFk8CUEsBFRZXBgJPAlBMJwtQTFCICx8qTFC8SCsyB2cnBjIHZyNDNhoBSSJZJAhLARUSRFcCADYaAkkVJRJEFzYaA0kVgSASRDYaBEkiWSQISwEVEkRXAgA2GgVJFSMSRCJTNhoGSRUjEkQ2GgdJFSUSRBc2GghJFSUSRBc2GglJIlmBDAskCEsBFRJENhoKSRUjEkQiUzYaC0kVIxJEIlM2GgxJFSMSRCJTNhoNSRUjEkQiUzYaDkkVIxJEIlOIEw9II0M2GgFJIlkkCEsBFRJEVwIASYgKBCcPTFBJvUUBQAAEJxuwAEcCvkSICkcqSwFQSYEsJLoXTwO8SEy8SEsDFSEECyEFCEsCgShZSwMVTwROAlJXAgBPAogKcAiICkwrMgdnJwYyB2cjQzYaAUkiWSQISwEVEkRXAgBJiAmRJwRMUL1FAUEADIAIRVJSOkVFU0OwAEkoE0AADIAIRVJSOkVOUlGwAEmICjYWJwVMULAjQzYaAUkiWSQISwEVEkRXAgCICoVAAAQnDLAARwKICWonBExQSb5EgUBTFEsBJSO6Ik8CVEsBJU8CuysyB2cnBjIHZ75IJwVMULAjQzYaAUkiWSQISwEVEkRXAgA2GgJHAiJZgRELJAhMFRJEiAoqQAAEJwywAEsBSYgJDksBI4gLkUgjQzYaAUkVJRJEF0k2GgJJTgJJFYEgEkQ2GgNJIlkkCEsBFRJEVwIASU4DNhoESU4ESSJZgRELJAhMFRJETwIWTwJQSwEVFlcGAk8CUEwnC1BMUIgI6SpMUIEbI7qBBFNAAAQnDLAASwGICJsxAEsEcghEEkAAEDEASwMSQAAISwIyAxJBAB8jQAAEJwywACcESwJJTgJQvkSBQFMUSwJMiArtSCNDIkL/3jYaAUkiWSQISwEVEkRXAgA2GgJHAiJZJQskCEwVEkSICUpAAAQnDLAASwFJiAguSYgIRUsBiApISCNDNhoBSRUlEkQXNhoCSU4CSRWBIBJENhoDSSJZJAhLARUSRFcCAElOAzYaBElOBEkiWUlOBSULJAhMFRJEMRYjCUlOBDgQIxJESwIWTwJQSwEVFlcGAksCUEwnC1BMUIgH+UhJiAe8iAfUMQBMcghEEkAAEDEASwUSQAAISwQyAxJBADQjQAAEJwywAEcCOAciKWVEEkw4CDIQSwQLEhBAAAyACEVSUjpJUEFZsABLA0sDiAmRSCNDIkL/ySJHBCg2GgFJIlkkCEsBFRJEVwIASTYaAklOAkkiWUlOA0mBIgskCE8CFRJEiAcMSwGIBzNLAYgHSUwVSU4CIQQLIQYIC4gHayJJSwMMQQCSSwNXAgBLAYEiC4EiWElXAAhLAVcIAUUJSwFXCQhFDUsBVxEIRQxLAVcZCEULTIGIAlNFB0sCFlcGAksGUCcSTwJQTFAnE0xQSUUJvUUBQQAMgAhFUlI6RUFMV7AASwVBACsyBksHSwtQSwxQIhZMSwFQSwtQTFBMFlAnCCJLCFRQSwhMv0kjCEUBQv9sMgdC/9IrMgdnJwYyB2cjQyIoSTYaAUkiWSQISwEVEkRXAgA2GgJHAiJZSU4CJQskCEwVEkSIB2FAAAaIB4VBAHkjQAAMgAhFUlI6T0FSTbAASwJJiAYzSYgGShVJRQUhBAshBghLAQuIBo8iRQVLBEsBDEEAOUsBVwIASwUlCyVYSwQWVwYCSwRQJxJPAlBMUCcTTFBJRQe9RQFAAAQnIrAASwW8SEsEIwhFBUL/vysyB2cnBjIHZyNDIkL/hDYaAUkVgSASRDYaAklOAkkiWUlOA4EgC0lOAyQITBUSRDYaA0kVJRJEF0w2GgRJFSUSRBdOAogFZycJTFBJTgK9RQFAACAWgAIAEkxQSwIWUEsFUEsBSbxITL8rMgdnJwYyB2cjQ0sBJCW6FxJAAAyACEVSUjpFS0ZWsABJgQoluhdLAhJAAAyACEVSUjpFS0xWsABLBFcCAEsBSYESJLoXSwG9SEsGCEsCTNNJSwcIFlcGAksCgRJPAruBIAuBFAgiTwPSQv+TNhoBSRWBIBJEJwlMUEm9RQFAAAQnI7AAiAX4QAAMSYEKJboXMgYMQQAWI0AABCcksABJvEgrMgdnJwYyB2cjQyJC/+ciJw5lRCcFTFCwI0MiSShJNhoBSSJZSU4CJAtMSRVMVwIAIklLBQxBADNHAiQLSwNJTwJZSUsHSU4EEkRLARVSSRVLAYEoWUmBKhJETFIiWYEsCAhFBSMIRQFC/8ZLAyQISwMSRCcHRQgiRQdLBksFDEEAWksGSSQLSwNJTwJZSwEVTwMjCElFCkkkC0sETFlLCU8CCU1SKkxQSUUKvUUBQQAYSwi+RCcNTFBLCEwjiPHBRQhLBUUHQv+xiPJLJw1MUEsITCOI8apFCEL/5icFSwhQsCNDIkcCKEk2GgFHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRCcHRQkiRQhLB0sFDElFCEEAaksGREsFSwiI8LhXAgAnD0xQSUUMvUUBQQA9Swq+RCpMUElFC71FAUEAGksJvkQnDUxQSwlMI4jxBkUJSwcjCEUIQv+xiPGOJw1MUEsJTCOI8O1FCUL/5IjxeycNTFBLCUwjiPDaRQlC/9EnBUsJULAjQyJJKEk2GgFHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRCcHRQkiRQhLB0sFDElFCEEAVksGREsFSwiI7+lXAgAnBExQSUULvUUBQQAeSwm+REsJSSJZIwgWVwYAXABMUEUJSwcjCEUIQv+9SwhJIlkjCBZXBgBcAIAJAAAAAAAAAAAAUEUJQv/ZJwVLCVCwI0MiNhoBSSJZJAhLARUSRFcCADYaAkcCIllJTgIlCyQITBUSRCIWJwciSUsEDEEAdUsEVwIASwElCyVYSwZJFRZXBgJMUCcSTwJQTFAnE0xQSUUIvUUBQQAdSwa+REsCSSJZIwgWVwYAXABMUEUCSSMIRQFC/7MiiPAgSwNJTgJQSwFQSwFQSwFQSwFQTFAnCFBLAkkiWSMIFlcGAFwATFBFAkL/yScFSwJQsCNDIjYaAUcCIllJTgKBIAskCEwVEkQnByJJSwMMQQBWSwNXAgBLAYEgC4EgWCcJTFBJRQa9RQFBABlLBL5EJw1MUEsCTCOI7x9FAkkjCEUBQv/GSwGAFgACABIAAAAAAAAAAAAAAAAAAAAAAAAjiO73RQJC/9UnBUsCULAjQyI2GgFHAiJZSU4CgSALJAhMFRJEJwciSUsDDEEAREsDVwIASwGBIAuBIFgnEUxQSUUGvUUBQQAdSwS+REkVFlcGAkxQSwJMI4juOEUCSSMIRQFC/8JLAScHI4juJkUCQv/rJwVLAlCwI0M2GgFJIlkkCEsBFRJEVwIANhoCSRUlEkQXNhoDSSJZJAhLARUSRFcCADYaBEkVJRJEF0sDFSEEC4HkMksBCEsFTwWIARhPBBUhBAshBUsBCCEGTwUIgdR6TwMITwWBgGQLgZSgAQgnBE8HUL1OBkgyAYG08gkISwcITwUWTwUWUE8GFlBPBBZQTwIWUE8CFlAnCCJPBFRQTBZQJwVMULAjQ4gBOEAABCcksACJiAEtQAAGiAFRQQARI0AADIAIRVJSOk9BUlCwAIkiQv/sigEAJwSL/1C9RQFAAAyACEVSUjpORVNDsACJigEAJwSL/1C+RIFAU0EADIAIRVJSOkVTQ0ywAImKAQEqi/9QvUUBQAAEJxuwAIv/iYoBACIpZUQyChNBABaxIillRDIKi/+yCLIHsgAjshAisgGziYoBACIpZUQyChNBABKxIillRIv/sgiyByOyECKyAbOJigIBgRSL/wuL/hUIIQQLgfSvAgiJigEBi/8VIQQLgeQyCIj/l7EiKWVEgfCTCTIBCCInF2VESXIIRLIHTLIISwGyACOyECKyAbayGLIAgATYXPGEshqBBrIQIrIBs7Q+SVcEAExXAAQnBRJESRUlEkQXSRYnCFAnBIv/UEy/iTEAIicOZUQSQAAbJxExAFC9RQFBABInETEAUL5EIicWZUQSQQACI4kiiTEAIicYZURyCEQSiYoCAYv+IxJBAAMyA4mL/iQSQQADMgqJi/+JigEBi/84ACIpZUQSQQAMi/84IDIKEkEAAiOJi/84EIEGEkEAJ4v/OBgyCBJBAB2L/zgbIxJBABSL/zgZQAANi/8iwhonHBJBAAIjiSKJigECKEcCKov/UEm9SU8CSEAACoABYIv/jAGMAImLA0mBCSW6F4wCSYERJboXjABJgRsjuiNTTIEcJboXjAFBADAyBkmLAg1MiwEJiwAMiwOBLCS6FyINJwgiiwRUI08EVCRPA1SBA08CVIv/jAGMAIkyB0L/zYoCAScEi/5QvkQiW3IITElPAkSxIillRDIQi/8iWUlOBAuyCLIAsgcjshAisgGzIosCiwEMQQApsYv/VwIAiwJJTgIlC1uyESKyEosASbIUsgCBBLIQIrIBsyMIjAJC/8+L/4wAiYoDASJJKEcCIicEi/1QvkQiW3IIRCKL/iJZiwcNQQCFi/5XAgCLB4ERC4ERWEmMACJbSYwCQAAhsSIpZUSLACVbsgiyB4sGsgAjshAisgGziwcjCIwHQv+9IillTIwBRIsAJVuMAyKMBIv/QQASiwCBgAFTQQAJIillRCOMBIwFsYsEQQAEiwWyFYsCshGLA7ISiwGyFIsGsgCBBLIQIrIBs0L/q4v+jACJigUCIkcLKEcci/wxAIj+Aov7FkxQi/0VFlcGAov9UElPAicLUExQi/wkEkEAA4j8cIsqiPzPSYwqJxpLAWcqTFBJjAUiJboXSYwRQQVHixFyCEQnCkxnJwSL/VC+RCJbcghMjAJEIowUi/8iWYsUDUEBsIv/VwIAixSBEAuBEFhJjAAiW0mMJRYnEkxQiylQJxNMUEmMBr1FAUAABCcisACLBr5ESVcAAYwLSYERW4whSYEJW4wMSYEhW4wXSSNbjBlJgRlbjBVJgSlbjCKBiANTSYwoQQFEMgaMHYsLJxASQQB0iwyLIQmLACVbSYwnD0AABCcUsACLBkm+RIERW4snCBaBEUy7ix0WiwaBIU8Cu4slQQAmsSIpZUSLACVbiyWyEbISiwKyFLIAgQSyECKyAbOLFCMIjBRC/yyxIillRIsAJVuyCIsCsgeyACOyECKyAbNC/9yLC4ABAhJBAGeLKEEAVTIGSYsiCYsVGAmLFw1BAB6LAElXCAiMASVbiwwOQAAEJxSwAIsGgRGLAbtC/3SLDIshCYsAJVtJjCQPQAAEJxSwAIsGSb5EgRFbiyQIFoERTLtC/00yB0mLIgmLFRgJQv+oiwuAAQMSQf83iyhBAD8yBowQixCLFwmLFQqLDAuLIQhJixlJTgMNTE4CTUmMDYsAJVtJjCYPQAAEJxSwAIsNiyYJFosGgRFPArtC/vMyB4wQQv++MgeMHUL+uYsFgRsjukkjU4woJFNBAJ6I+6ZAAJgnCTEGUL1FAUAABCcjsAAnCTEGUCQluhcyBg5AAAyACEVSUjpFWE5SsAAnCTEGUIEKJboXMgYPQAAMgAhFUlI6RVhYULAAJwkxBlCMCCKMEiKMFIsIgRIkuheLFA1BACCLFIEgC4EUCIsITIEgujILEkEAAyOMEosUIwiMFEL/04sSQAAMgAhFUlI6TkdSULAAJwkxBlC8SIsqiPukjCpJjAMiU0AABCcbsACLAyNTQQAEJyWwAIsDJFNBAAQnJrAAiyhBAo8yBowQIowgIowbMRYjCIwWiyqMBIsWMgQMQQALixaI+wxBANMjjCCLIEAABCchsAAqiwRQSYwHgRsjuoEDU0EAgIGQAjIAC0mMGjEBDUEAbDEBsSInCmVEMQCL+3IIRIArcmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcrIFsiBPArIIsgeyACOyECKyAbMnFTEWZ4sHJSO6JxASQQAEKzIHZ4v+i/+MAYwAiYsaQv+RsSInCmVEi/tyCESAFnJla2V5aW5nIHRvIHBsdWdpbiBhcHCyBbIgSbIHsgAjshAisgGzQv+oixY4EIEGE0EADYsEixYjCIwWjARC/waLFjgYiyoiWxJAAAyACEVSUjpDQ09SsACLFjgZQQAMgAhFUlI6SU9DTrAAixY4GyMNQAAMgAhFUlI6SVNBR7AAixYjwhoXMggSQAAMgAhFUlI6SVNWTLAAiyqI+hCMKkkjU0sBJFOMH0yBA1OME0EABCclsACLH0EABCcmsACLE0EA04v+IlmLGw1AAAyACEVSUjpNT0ZGsACL/lcCAIsbJQtbjB6LFiLCGkmMChWBBBJJjCNAAAyACEVSUjpJTVNMsACLI0QqiypQSYwFSYEbI7ojU0lOAowoix6BFAtJjA6BLgiBFLpJVwAEjAlJgQRbjA+BDFuMGEEAgTIGixgJiw8MjByLCYsKEkEAaYsPQQAFixxAAF+LD0EAE4soQQBQMgYWiw6BOgiLBUxPAruAAYAjixxUSSJTTCNTjBxBACyLHEAAJyNAAAyACEVSUjpNQ0xEsAAqiypJTgJQixAWgRxMu4sbIwiMG0L+iCJC/9YyB0L/rYABQEL/ujIHQv98MgeMEEL9biIpZUQnCkxnQvyDig4BIkcFKEmI9vaL8igTSUEADycPi/JQvUUBQQAEJyewAIv3JxASQQGEi/QyAxJBAXwjQQAMgAhFUlI6WkFEVLAAi/xBAWOL9DIDE0EBWyNBAAyACEVSUjpVRUtHsACL/0ABLYv1jAGL8xaL9FCLAUkVFlcGAkxQTCcLUExQSYwCKkxQSYwEvUUBQQAEJyewACIWjAAnB4wFIowHi/oiWYsHDUEANIv6VwIAiwdJTgKBDAuBDFhJVwAETFcECFCLAFCLBUkiWSMIFlcGAFwATFCMBSMIjAdC/8KLBSJZiwFMiPbZiwhBAAqL8hUhBAshBQgIiPaDi/UoEkEAcyKMBov7QQBmMgaL9SgTIov+TwJNiwYWi/dQi/gWUIv5FlCAAgAsUCcIIov2VCOL+1Qki/xUgQOL/VSBBE8DVFCLAFBMFlCLBVCLBEm8SEy/iwhBAAsnD4vyUEm8SIsCvysyB2cnBjIHZ4v6jACJMgdC/5cnBIv1UEmMA71FAUEAC4sDvkQiW4wGQv93i/WI9kRC//OL9SgTQAAMgAhFUlI6RVJTRLAAKIwBQv6+IkL+oiJC/oE=", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
32
+ var APP_SPEC = { "name": "AbstractedAccount", "structs": { "AbstractAccountBoxMBRData": [{ "name": "plugins", "type": "uint64" }, { "name": "namedPlugins", "type": "uint64" }, { "name": "escrows", "type": "uint64" }, { "name": "allowances", "type": "uint64" }, { "name": "executions", "type": "uint64" }, { "name": "domainKeys", "type": "uint64" }, { "name": "escrowExists", "type": "bool" }, { "name": "newEscrowMintCost", "type": "uint64" }], "AllowanceInfo": [{ "name": "type", "type": "uint8" }, { "name": "max", "type": "uint64" }, { "name": "amount", "type": "uint64" }, { "name": "spent", "type": "uint64" }, { "name": "interval", "type": "uint64" }, { "name": "last", "type": "uint64" }, { "name": "start", "type": "uint64" }, { "name": "useRounds", "type": "bool" }], "AllowanceKey": [{ "name": "escrow", "type": "string" }, { "name": "asset", "type": "uint64" }], "EscrowInfo": [{ "name": "id", "type": "uint64" }, { "name": "locked", "type": "bool" }], "ExecutionInfo": [{ "name": "groups", "type": "byte[32][]" }, { "name": "firstValid", "type": "uint64" }, { "name": "lastValid", "type": "uint64" }], "FactoryUpdateSettings": [{ "name": "allowed", "type": "bool" }, { "name": "automatic", "type": "bool" }], "PluginInfo": [{ "name": "escrow", "type": "uint64" }, { "name": "delegationType", "type": "uint8" }, { "name": "lastValid", "type": "uint64" }, { "name": "cooldown", "type": "uint64" }, { "name": "methods", "type": "(byte[4],uint64,uint64)[]" }, { "name": "admin", "type": "bool" }, { "name": "useRounds", "type": "bool" }, { "name": "useExecutionKey", "type": "bool" }, { "name": "coverFees", "type": "bool" }, { "name": "canReclaim", "type": "bool" }, { "name": "lastCalled", "type": "uint64" }, { "name": "start", "type": "uint64" }], "PluginKey": [{ "name": "plugin", "type": "uint64" }, { "name": "caller", "type": "address" }, { "name": "escrow", "type": "string" }] }, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version", "desc": "The version of the abstracted account application" }, { "type": "uint64", "name": "akitaDAO" }, { "type": "address", "name": "controlledAddress", "desc": "The address of the abstracted account. If zeroAddress, then the address of the contract account will be used" }, { "type": "address", "name": "admin", "desc": "The address of the admin for this application" }, { "type": "string", "name": "domain", "desc": "The domain associated with the admin account" }, { "type": "uint64", "name": "escrowFactory", "desc": "The app ID of the escrow factory to use for creating escrows" }, { "type": "uint64", "name": "revocationApp", "desc": "The app ID of the revocation app associated with this abstracted account" }, { "type": "string", "name": "nickname", "desc": "A user-friendly name for this abstracted account" }, { "type": "address", "name": "referrer", "desc": "The address that referred the creation of this wallet" }, { "type": "byte[32]", "name": "salt" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "desc": "Create an abstracted account application.\nThis is not part of ARC58 and implementation specific.", "events": [], "recommendations": {} }, { "name": "register", "args": [{ "type": "string", "name": "escrow", "desc": "The name of the escrow to register, or empty string for the main account" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Register the abstracted account with the escrow factory.\nThis allows apps to correlate the account with the app without needing\nit to be explicitly provided.", "events": [], "recommendations": {} }, { "name": "update", "args": [{ "type": "string", "name": "version", "desc": "the version of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["UpdateApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setDomain", "args": [{ "type": "string", "name": "domain", "desc": "The domain to associate with the admin account" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Set the domain associated with the admin account", "events": [], "recommendations": {} }, { "name": "setRevocationApp", "args": [{ "type": "uint64", "name": "app", "desc": "The app ID of the new revocation app" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the revocation app associated with the contract", "events": [], "recommendations": {} }, { "name": "setAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO", "desc": "The app ID of the new Akita DAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the Akita DAO associated with the contract", "events": [], "recommendations": {} }, { "name": "setNickname", "args": [{ "type": "string", "name": "nickname", "desc": "the new nickname of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the nickname of the wallet", "events": [], "recommendations": {} }, { "name": "setAvatar", "args": [{ "type": "uint64", "name": "avatar", "desc": "the new avatar of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the avatar of the wallet", "events": [], "recommendations": {} }, { "name": "setBanner", "args": [{ "type": "uint64", "name": "banner", "desc": "the new banner of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the banner of the wallet", "events": [], "recommendations": {} }, { "name": "setBio", "args": [{ "type": "string", "name": "bio", "desc": "the new bio of the wallet" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes the bio of the wallet", "events": [], "recommendations": {} }, { "name": "setFactoryUpdateSettings", "args": [{ "type": "bool", "name": "allowed", "desc": "whether the admin can update the wallet from the factory" }, { "type": "bool", "name": "automatic", "desc": "whether the wallet updates from the factory can be triggered automatically" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Changes permissions on factory pushed contract wallet updates", "events": [], "recommendations": {} }, { "name": "arc58_changeAdmin", "args": [{ "type": "address", "name": "newAdmin", "desc": "The new admin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Attempt to change the admin for this app. Some implementations MAY not support this.", "events": [], "recommendations": {} }, { "name": "arc58_pluginChangeAdmin", "args": [{ "type": "address", "name": "newAdmin", "desc": "The new admin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Attempt to change the admin via plugin.", "events": [], "recommendations": {} }, { "name": "arc58_verifyAuthAddress", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Verify the abstracted account is rekeyed to this app", "events": [], "recommendations": {} }, { "name": "arc58_rekeyTo", "args": [{ "type": "address", "name": "address", "desc": "The address to rekey to" }, { "type": "bool", "name": "flash", "desc": "Whether or not this should be a flash rekey. If true, the rekey back to the app address must done in the same txn group as this call" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Rekey the abstracted account to another address. Primarily useful for rekeying to an EOA.", "events": [], "recommendations": {} }, { "name": "arc58_canCall", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to check" }, { "type": "uint64", "name": "type", "desc": "0 = Other (specific address), 1 = Global (anyone), 2 = Admin (current admin)" }, { "type": "address", "name": "address", "desc": "The address that will trigger the plugin (used when type = Other)" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "byte[4]", "name": "method", "desc": "The method selector being called on the plugin" }], "returns": { "type": "bool", "desc": "Whether the plugin can be called with these parameters" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Check whether the plugin can be used", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToPlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to rekey to" }, { "type": "uint64", "name": "type", "desc": "0 = Other (Txn.sender), 1 = Global (anyone), 2 = Admin (current admin)" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group. If the plugin has method restrictions, these indices must match the methods used on each subsequent call to the plugin within the group" }, { "type": "(uint64,uint64)[]", "name": "fundsRequest", "desc": "If the plugin is using an escrow, this is the list of funds to transfer to the escrow for the plugin to use during execution" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Temporarily rekey to an approved plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_rekeyToNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The name of the plugin to rekey to" }, { "type": "uint64", "name": "type" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }, { "type": "uint64[]", "name": "methodOffsets", "desc": "The indices of the methods being used in the group. If the plugin has method restrictions, these indices must match the methods used on each subsequent call to the plugin within the group" }, { "type": "(uint64,uint64)[]", "name": "fundsRequest", "desc": "If the plugin is using an escrow, this is the list of funds to transfer to the escrow for the plugin to use during execution" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Temporarily rekey to a named plugin app address", "events": [], "recommendations": {} }, { "name": "arc58_addPlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to add" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin, or the global zero address for any address" }, { "type": "string", "name": "escrow", "desc": "The escrow account to use for the plugin, if any. If empty, no escrow will be used, if the named escrow does not exist, it will be created" }, { "type": "bool", "name": "admin", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "uint8", "name": "delegationType", "desc": "The ownership of the delegation for last_interval updates" }, { "type": "uint64", "name": "lastValid", "desc": "The timestamp or round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of seconds or rounds that must pass before the plugin can be called again" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" }, { "type": "bool", "name": "useRounds", "desc": "Whether the plugin uses rounds for cooldowns and lastValid, defaults to timestamp" }, { "type": "bool", "name": "useExecutionKey", "desc": "Whether the plugin requires an execution key to be used" }, { "type": "bool", "name": "coverFees", "desc": "Whether the plugin reimburses the caller for transaction fees" }, { "type": "bool", "name": "canReclaim", "desc": "Whether the plugin is allowed to reclaim funds from escrows via arc58_pluginReclaim" }, { "type": "bool", "name": "defaultToEscrow", "desc": "Whether to use the named escrow as the default escrow (plugin key uses empty string)" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add an app to the list of approved plugins", "events": [], "recommendations": {} }, { "name": "assignDomain", "args": [{ "type": "address", "name": "caller", "desc": "The address of the passkey" }, { "type": "string", "name": "domain", "desc": "The domain to assign to the passkey" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Assign a domain to a passkey", "events": [], "recommendations": {} }, { "name": "arc58_removePlugin", "args": [{ "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to remove" }, { "type": "address", "name": "caller", "desc": "The address that was allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow associated with the plugin" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an app from the list of approved plugins", "events": [], "recommendations": {} }, { "name": "arc58_addNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The plugin name" }, { "type": "uint64", "name": "plugin", "desc": "The app ID of the plugin to add" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin, or the global zero address for any address" }, { "type": "string", "name": "escrow", "desc": "The escrow account to use for the plugin, if any. If empty, no escrow will be used, if the named escrow does not exist, it will be created" }, { "type": "bool", "name": "admin", "desc": "Whether the plugin has permissions to change the admin account" }, { "type": "uint8", "name": "delegationType", "desc": "The ownership of the delegation for last_interval updates" }, { "type": "uint64", "name": "lastValid", "desc": "The timestamp or round when the permission expires" }, { "type": "uint64", "name": "cooldown", "desc": "The number of seconds or rounds that must pass before the plugin can be called again" }, { "type": "(byte[4],uint64)[]", "name": "methods", "desc": "The methods that are allowed to be called for the plugin by the address" }, { "type": "bool", "name": "useRounds", "desc": "Whether the plugin uses rounds for cooldowns and lastValid, defaults to timestamp" }, { "type": "bool", "name": "useExecutionKey", "desc": "Whether the plugin requires an execution key to be used" }, { "type": "bool", "name": "coverFees", "desc": "Whether the plugin reimburses the caller for transaction fees" }, { "type": "bool", "name": "canReclaim", "desc": "Whether the plugin is allowed to reclaim funds from escrows via arc58_pluginReclaim" }, { "type": "bool", "name": "defaultToEscrow", "desc": "Whether to use the named escrow as the default escrow (plugin key uses empty string)" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add a named plugin", "events": [], "recommendations": {} }, { "name": "arc58_removeNamedPlugin", "args": [{ "type": "string", "name": "name", "desc": "The plugin name" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove a named plugin", "events": [], "recommendations": {} }, { "name": "arc58_newEscrow", "args": [{ "type": "string", "name": "escrow", "desc": "The name of the escrow to create" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Create a new escrow for the controlled address", "events": [], "recommendations": {} }, { "name": "arc58_toggleEscrowLock", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to lock or unlock" }], "returns": { "type": "(uint64,bool)", "struct": "EscrowInfo" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Lock or Unlock an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_reclaim", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to reclaim funds from" }, { "type": "(uint64,uint64,bool)[]", "name": "reclaims", "desc": "The list of reclaims to make from the escrow" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Transfer funds from an escrow back to the controlled address.", "events": [], "recommendations": {} }, { "name": "arc58_pluginReclaim", "args": [{ "type": "uint64", "name": "plugin", "desc": "The plugin app ID" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow to reclaim funds from" }, { "type": "(uint64,uint64,bool)[]", "name": "reclaims", "desc": "The list of reclaims to make from the escrow" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Transfer funds from an escrow back to the controlled address via a plugin / allowed caller.\nThe plugin must have canReclaim set to true. CloseOut on asset transfers is blocked when the escrow is locked.", "events": [], "recommendations": {} }, { "name": "arc58_optInEscrow", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to opt-in to" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to opt-in to" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt-in an escrow account to assets", "events": [], "recommendations": {} }, { "name": "arc58_pluginOptInEscrow", "args": [{ "type": "uint64", "name": "plugin", "desc": "The plugin app ID" }, { "type": "address", "name": "caller", "desc": "The address allowed to call the plugin" }, { "type": "string", "name": "escrow", "desc": "The escrow to opt-in assets for" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to opt-in to" }, { "type": "pay", "name": "mbrPayment", "desc": "The payment txn that is used to pay for the asset opt-in" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt-in an escrow account to assets via a plugin / allowed caller", "events": [], "recommendations": {} }, { "name": "arc58_addAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to add the allowance for" }, { "type": "(uint64,uint8,uint64,uint64,uint64,bool)[]", "name": "allowances", "desc": "The list of allowances to add" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add an allowance for an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_removeAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to remove the allowance for" }, { "type": "uint64[]", "name": "assets", "desc": "The list of assets to remove the allowance for" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an allowances for an escrow account", "events": [], "recommendations": {} }, { "name": "arc58_addExecutionKey", "args": [{ "type": "byte[32]", "name": "lease", "desc": "The 32-byte lease key that uniquely identifies this execution" }, { "type": "byte[32][]", "name": "groups", "desc": "The list of 32-byte group IDs that are authorized under this key" }, { "type": "uint64", "name": "firstValid", "desc": "The first round or timestamp when this key becomes valid" }, { "type": "uint64", "name": "lastValid", "desc": "The last round or timestamp when this key expires" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Add or extend an execution key for pre-authorized plugin usage", "events": [], "recommendations": {} }, { "name": "arc58_removeExecutionKey", "args": [{ "type": "byte[32]", "name": "lease", "desc": "The 32-byte lease key identifying the execution to remove" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Remove an execution key. Can be called by admin at any time, or by anyone after the key has expired.", "events": [], "recommendations": {} }, { "name": "arc58_getAdmin", "args": [], "returns": { "type": "address" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get the admin of this app. This method SHOULD always be used rather than reading directly from state\nbecause different implementations may have different ways of determining the admin.", "events": [], "recommendations": {} }, { "name": "arc58_getPlugins", "args": [{ "type": "(uint64,address,string)[]", "name": "keys", "desc": "The plugin keys to look up" }], "returns": { "type": "(uint64,uint8,uint64,uint64,(byte[4],uint64,uint64)[],bool,bool,bool,bool,bool,uint64,uint64)[]", "desc": "The plugin info for each key, or empty plugin info if the key does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get plugin info for a list of plugin keys", "events": [], "recommendations": {} }, { "name": "arc58_getNamedPlugins", "args": [{ "type": "string[]", "name": "names", "desc": "The plugin names to look up" }], "returns": { "type": "(uint64,uint8,uint64,uint64,(byte[4],uint64,uint64)[],bool,bool,bool,bool,bool,uint64,uint64)[]", "desc": "The plugin info for each name, or empty plugin info if the name does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get plugin info for a list of named plugins", "events": [], "recommendations": {} }, { "name": "arc58_getEscrows", "args": [{ "type": "string[]", "name": "escrows", "desc": "The escrow names to look up" }], "returns": { "type": "(uint64,bool)[]", "desc": "The escrow info for each name, or empty escrow info if the name does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get escrow info for a list of escrow names", "events": [], "recommendations": {} }, { "name": "arc58_getAllowances", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow to look up allowances for" }, { "type": "uint64[]", "name": "assets", "desc": "The asset IDs to look up allowances for" }], "returns": { "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,bool)[]", "desc": "The allowance info for each asset, or empty allowance info if no allowance exists" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get allowance info for a list of assets on a given escrow", "events": [], "recommendations": {} }, { "name": "arc58_getExecutions", "args": [{ "type": "byte[32][]", "name": "leases", "desc": "The 32-byte lease keys to look up" }], "returns": { "type": "(byte[32][],uint64,uint64)[]", "desc": "The execution info for each lease, or empty execution info if the lease does not exist" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get execution key info for a list of leases", "events": [], "recommendations": {} }, { "name": "arc58_getDomainKeys", "args": [{ "type": "address[]", "name": "addresses", "desc": "The addresses to look up domain keys for" }], "returns": { "type": "string[]", "desc": "The domain string for each address, or empty string if no domain is assigned" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Get domain key assignments for a list of addresses", "events": [], "recommendations": {} }, { "name": "mbr", "args": [{ "type": "string", "name": "escrow", "desc": "The escrow name to calculate MBR for" }, { "type": "uint64", "name": "methodCount", "desc": "The number of method restrictions on the plugin" }, { "type": "string", "name": "plugin", "desc": "The plugin name to calculate named plugin MBR for" }, { "type": "uint64", "name": "groups", "desc": "The number of execution groups to calculate MBR for" }], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,bool,uint64)", "struct": "AbstractAccountBoxMBRData", "desc": "The MBR costs for plugins, named plugins, escrows, allowances, domain keys, executions, and new escrow creation" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "desc": "Calculate the minimum balance requirements for various box operations", "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 12, "bytes": 30 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the version of the wallet contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app id of the akita DAO" }, "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=", "desc": "The admin of the abstracted account. This address can add plugins and initiate rekeys" }, "domain": { "keyType": "AVMString", "valueType": "AVMString", "key": "ZG9tYWlu", "desc": "The domain associated with the admin account of the abstracted account" }, "controlledAddress": { "keyType": "AVMString", "valueType": "address", "key": "Y29udHJvbGxlZF9hZGRyZXNz", "desc": "The address this app controls" }, "nickname": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmlja25hbWU=", "desc": "A user defined nickname for their wallet" }, "avatar": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXZhdGFy", "desc": "A user defined NFT to display as their avatar that the user owns" }, "banner": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YmFubmVy", "desc": "A user defined NFT to display as their banner that the user owns" }, "bio": { "keyType": "AVMString", "valueType": "AVMString", "key": "Ymlv", "desc": "A user defined description" }, "lastUserInteraction": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF91c2VyX2ludGVyYWN0aW9u", "desc": "The last time the contract was interacted with in unix time" }, "lastChange": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF9jaGFuZ2U=", "desc": "The last time state has changed on the abstracted account (not including lastCalled for cooldowns) in unix time" }, "spendingAddress": { "keyType": "AVMString", "valueType": "address", "key": "c3BlbmRpbmdfYWRkcmVzcw==", "desc": "[TEMPORARY STATE FIELD] The spending address for the currently active plugin" }, "currentPlugin": { "keyType": "AVMString", "valueType": "PluginKey", "key": "Y3VycmVudF9wbHVnaW4=", "desc": "[TEMPORARY STATE FIELD] The current plugin key being used" }, "rekeyIndex": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVrZXlfaW5kZXg=", "desc": "[TEMPORARY STATE FIELD] The index of the transaction that created the rekey sandwich" }, "escrowFactory": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXNjcm93X2ZhY3Rvcnk=", "desc": "the spending account factory to use for allowances" }, "factoryApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmFjdG9yeV9hcHA=", "desc": "the application ID for the contract that deployed this wallet" }, "revocation": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmV2b2NhdGlvbg==", "desc": "The app that can revoke plugins" }, "referrer": { "keyType": "AVMString", "valueType": "address", "key": "cmVmZXJyZXI=", "desc": "The address that created the wallet" }, "factoryUpdateSettings": { "keyType": "AVMString", "valueType": "FactoryUpdateSettings", "key": "dXBkYXRlX3NldHRpbmdz", "desc": "Factory Update Settings" }, "salt": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "c2FsdA==", "desc": "Pseudo Random Function extension salt" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "plugins": { "keyType": "PluginKey", "valueType": "PluginInfo", "desc": "Plugins that add functionality to the controlledAddress and the account that has permission to use it.", "prefix": "cA==" }, "namedPlugins": { "keyType": "AVMString", "valueType": "PluginKey", "desc": "Plugins that have been given a name for discoverability", "prefix": "bg==" }, "escrows": { "keyType": "AVMString", "valueType": "EscrowInfo", "desc": "the escrows that this wallet has created for specific callers with allowances", "prefix": "ZQ==" }, "allowances": { "keyType": "AllowanceKey", "valueType": "AllowanceInfo", "desc": "The Allowances for plugins installed on the smart contract with useAllowance set to true", "prefix": "YQ==" }, "executions": { "keyType": "AVMBytes", "valueType": "ExecutionInfo", "desc": "execution keys", "prefix": "eA==" }, "domainKeys": { "keyType": "address", "valueType": "AVMString", "desc": "Passkeys on the account and their corresponding domain names\naddress : domain\nIMPORTANT: a passkey attached to the akita domain is a co-admin passkey\nwe explicitly have this feature so that the wallet can be used on multiple devices\nwhere the admin passkey may be incompatible\nwe track this onchain so we can assist with 'sign-in from another device' functionality\nas well as uses like DAO based domain revocation", "prefix": "ZA==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1265, 2885, 3060, 3305, 4414, 4585, 4601, 4792, 4948, 5088, 5212, 5500, 5763, 6055, 6163, 6411, 6482, 6570, 6746, 8139], "errorMessage": "Box must have value" }, { "pc": [5715], "errorMessage": "Bytes has valid prefix" }, { "pc": [1127], "errorMessage": "ERR:ACBC" }, { "pc": [4229, 5429], "errorMessage": "ERR:ADMN" }, { "pc": [6565, 6711, 6741, 6834], "errorMessage": "ERR:ALEX" }, { "pc": [1671], "errorMessage": "ERR:APNE" }, { "pc": [1843], "errorMessage": "ERR:AUAM" }, { "pc": [1107], "errorMessage": "ERR:BDEP" }, { "pc": [7378], "errorMessage": "ERR:CCOR" }, { "pc": [3741], "errorMessage": "ERR:EALW" }, { "pc": [2992], "errorMessage": "ERR:EESC" }, { "pc": [4103], "errorMessage": "ERR:EKFV" }, { "pc": [4127], "errorMessage": "ERR:EKLV" }, { "pc": [3010], "errorMessage": "ERR:ENRQ" }, { "pc": [7787, 7898], "errorMessage": "ERR:EPLG" }, { "pc": [8173], "errorMessage": "ERR:ERSD" }, { "pc": [5518], "errorMessage": "ERR:ESCL" }, { "pc": [6928], "errorMessage": "ERR:EXNR" }, { "pc": [6956], "errorMessage": "ERR:EXXP" }, { "pc": [3048, 3139, 3255, 3295, 3363, 3520], "errorMessage": "ERR:FORB" }, { "pc": [7549], "errorMessage": "ERR:IMSL" }, { "pc": [7397], "errorMessage": "ERR:IOCN" }, { "pc": [3554], "errorMessage": "ERR:IPAY" }, { "pc": [7418], "errorMessage": "ERR:ISAG" }, { "pc": [7442], "errorMessage": "ERR:ISVL" }, { "pc": [7692], "errorMessage": "ERR:MCLD" }, { "pc": [7507], "errorMessage": "ERR:MOFF" }, { "pc": [3951, 6478], "errorMessage": "ERR:NALW" }, { "pc": [5489], "errorMessage": "ERR:NESC" }, { "pc": [4203, 6901], "errorMessage": "ERR:NEXK" }, { "pc": [7031], "errorMessage": "ERR:NGRP" }, { "pc": [2881, 5536, 7057], "errorMessage": "ERR:NPLG" }, { "pc": [1992, 7132], "errorMessage": "ERR:NRKB" }, { "pc": [2585], "errorMessage": "ERR:OAAP" }, { "pc": [1381], "errorMessage": "ERR:OACU" }, { "pc": [3870], "errorMessage": "ERR:OARM" }, { "pc": [5458], "errorMessage": "ERR:OARP" }, { "pc": [7079, 7480], "errorMessage": "ERR:PCLD" }, { "pc": [1762], "errorMessage": "ERR:PDAP" }, { "pc": [1722], "errorMessage": "ERR:PDCW" }, { "pc": [7068, 7471], "errorMessage": "ERR:PEXP" }, { "pc": [1694], "errorMessage": "ERR:SMAP" }, { "pc": [7848], "errorMessage": "ERR:UEKG" }, { "pc": [7819], "errorMessage": "ERR:ZADT" }, { "pc": [7552], "errorMessage": "Length must be 4" }, { "pc": [1701, 1805], "errorMessage": "account funded" }, { "pc": [1279, 1361, 1678, 1706, 3267, 3492, 5665, 5786, 6064, 6168, 6400, 6419, 7179, 7288], "errorMessage": "application exists" }, { "pc": [1275, 1346, 1358, 1639, 1698, 1798, 1809, 1817, 1905, 3528, 4252, 5546, 5557, 5582, 5593, 5649, 5661, 5741, 5768, 5783, 5825, 6069, 6208, 6243, 6270, 6601, 6639, 7172, 7283, 7746], "errorMessage": "check GlobalState exists" }, { "pc": [3661, 3918, 4914, 5071, 5195, 6192, 6445, 7935], "errorMessage": "index access is out of bounds" }, { "pc": [1741, 1772, 2120, 2128, 2140, 2188, 2387, 3079, 3245, 4086, 4108, 4214, 4558, 4765, 5962, 5970, 5978, 5985, 6388, 6581, 6591, 6718, 6757, 6847, 6870, 6909, 6937, 6996, 7143, 7253, 7564, 7585, 7653, 7706], "errorMessage": "index out of bounds" }, { "pc": [4299, 4503, 4710], "errorMessage": "invalid array encoding" }, { "pc": [985, 1028, 1062, 1235, 1325, 1398, 1459, 1532, 2043, 2259, 2275, 2290, 2313, 2338, 2354, 2369, 2421, 2473, 2557, 2634, 2694, 2728, 2780, 2852, 2956, 3028, 3103, 3120, 3182, 3204, 3328, 3345, 3408, 3430, 3578, 3598, 3814, 3831, 3997, 4269, 4327, 4473, 4517, 4680, 4724, 4863, 4880, 5036, 5160, 5264, 5289, 6075, 6173, 6426, 7489, 7913, 7975], "errorMessage": "invalid array length header" }, { "pc": [1562, 1572, 1895, 2439, 2491, 2501, 2511, 2521, 2531, 2746, 2798, 2808, 2818, 2828, 2838], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [5172], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [992, 1035, 1069, 1242, 1332, 1405, 1466, 1539, 2050, 2266, 2320, 2345, 2428, 2564, 2641, 2701, 2735, 2859, 2963, 3035, 3110, 3189, 3335, 3415, 3585, 3821, 4870, 5271, 5296], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [4012, 5048], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes[32]>" }, { "pc": [3612], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::AddAllowanceInfo>" }, { "pc": [3129, 3213], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowReclaim>" }, { "pc": [2300, 2379], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::FundsRequest>" }, { "pc": [2483, 2790], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::MethodRestriction>" }, { "pc": [4348], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::PluginKey>" }, { "pc": [4537, 4744], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [2284, 2363, 3353, 3441, 3842, 4891], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [1013, 1022, 1081, 1090, 1602, 1630, 1887, 2037, 2415, 2551, 2628, 2722, 3176, 3402, 3988, 4188], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [2064], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 4>" }, { "pc": [1003, 1046, 1055, 1425, 1443, 1486, 1510, 2018, 2027, 2243, 2252, 2331, 2405, 2457, 2466, 2618, 2712, 2764, 2773, 3162, 3389, 4020, 4030, 5282, 5307], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [2449, 2756], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [5720], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [4323], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint8[32],(len+utf8[]))" }, { "pc": [4511, 4718], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [4307], "errorMessage": "invalid tail pointer for (len+(uint64,uint8[32],(len+utf8[]))[])" }, { "pc": [4318], "errorMessage": "invalid tuple encoding" }, { "pc": [944], "errorMessage": "overflow" }, { "pc": [3453], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCA0MDAgMTg5MDAgMjc3MDAKICAgIGJ5dGVjYmxvY2sgIiIgImNvbnRyb2xsZWRfYWRkcmVzcyIgInAiICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iICJlIiAweDE1MWY3Yzc1ICJsYXN0X2NoYW5nZSIgMHgwMDAwIDB4MDAgIngiICJzcGVuZGluZ19hZGRyZXNzIiAweDAwMmEgIkVSUjpGT1JCIiAweDAwMDIgImFkbWluIiAibiIgMHgwMSAiZCIgMHgwMDBhICJhIiAiRVJSOkFMRVgiICJyZWtleV9pbmRleCIgImRvbWFpbiIgImVzY3Jvd19mYWN0b3J5IiAicmV2b2NhdGlvbiIgInVwZGF0ZV9zZXR0aW5ncyIgImN1cnJlbnRfcGx1Z2luIiAiRVJSOk5QTEciIDB4NmNjM2Y2MDYgInZlcnNpb24iICJha2l0YV9kYW8iICJuaWNrbmFtZSIgImZhY3RvcnlfYXBwIiAiRVJSOk5SS0IiICJFUlI6TkFMVyIgIkVSUjpORVhLIiAiRVJSOkFETU4iICJFUlI6UEVYUCIgIkVSUjpQQ0xEIiAiRVJSOkVQTEciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gcmVrZXlJbmRleCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVrZXlJbmRleCB9KQogICAgYnl0ZWMgMjEgLy8gInJla2V5X2luZGV4IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyLTExOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogQWJzdHJhY3RBY2NvdW50TnVtR2xvYmFsQnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEFic3RyYWN0QWNjb3VudE51bUdsb2JhbFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgQWJzdHJhY3RlZEFjY291bnQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHhlYTkxODBkZCAvLyBtZXRob2QgInVwZGF0ZShzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTItMTE4CiAgICAvLyBAY29udHJhY3QoewogICAgLy8gICBzdGF0ZVRvdGFsczogewogICAgLy8gICAgIGdsb2JhbEJ5dGVzOiBBYnN0cmFjdEFjY291bnROdW1HbG9iYWxCeXRlcywKICAgIC8vICAgICBnbG9iYWxVaW50czogQWJzdHJhY3RBY2NvdW50TnVtR2xvYmFsVWludHMKICAgIC8vICAgfQogICAgLy8gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBBYnN0cmFjdGVkQWNjb3VudCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BANDcKICAgIHB1c2hieXRlc3MgMHhiZDYwOTllNSAweDc3ODc4NjdkIDB4MmQ3NzExYjcgMHg0MDFhNmQ4MCAweDlmOTFjY2NkIDB4MTdkOGJjYjQgMHgzODU2NThhYiAweDVlZjBiNDE1IDB4NWM1ODk1M2MgMHhkMjRiNzU1NiAweDE0N2I2Y2Q2IC8vIG1ldGhvZCAicmVnaXN0ZXIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldERvbWFpbihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0UmV2b2NhdGlvbkFwcCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0QWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgInNldE5pY2tuYW1lKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRBdmF0YXIodWludDY0KXZvaWQiLCBtZXRob2QgInNldEJhbm5lcih1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0QmlvKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRGYWN0b3J5VXBkYXRlU2V0dGluZ3MoYm9vbCxib29sKXZvaWQiLCBtZXRob2QgImFyYzU4X2NoYW5nZUFkbWluKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4oYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMjggLy8gbWV0aG9kICJhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCIKICAgIHB1c2hieXRlc3MgMHhjOTVhNWQzZCAweGIzNjIzNGE1IDB4NWFkZjMzOGYgMHg0OGE0NDU2NiAweDU2NzI0NjJlIDB4NTdhNTFkODggMHhlZWY0NDhmZCAweDU3MmZkMWVhIDB4ZTM1MGI5ZDQgMHgwYThjYjJjMiAweDI1YjcxM2NhIDB4ZWJhZjE0YTAgMHg2YTIwNWNmYyAweGFlMWE0ZGNhIDB4NjQ0ZDJkZWMgMHhiZjRkN2M1NyAweGQ1ZGQzODJiIDB4NWNlYmVkNDMgMHhkNTg2ODVhZiAweDEzYmM0NGU0IDB4ODlhNzY4MjYgMHgwNTc5NGQ3ZCAweGEyNDAzZGRmIDB4MDJmZTQ1MTUgMHg0MWJkYzY4MCAweDg4MmJiMWMyIDB4MTc2MGM2NTIgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvKGFkZHJlc3MsYm9vbCl2b2lkIiwgbWV0aG9kICJhcmM1OF9jYW5DYWxsKHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsYnl0ZVs0XSlib29sIiwgbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbihzdHJpbmcsdWludDY0LHN0cmluZyx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJhcmM1OF9hZGRQbHVnaW4odWludDY0LGFkZHJlc3Msc3RyaW5nLGJvb2wsdWludDgsdWludDY0LHVpbnQ2NCwoYnl0ZVs0XSx1aW50NjQpW10sYm9vbCxib29sLGJvb2wsYm9vbCxib29sKXZvaWQiLCBtZXRob2QgImFzc2lnbkRvbWFpbihhZGRyZXNzLHN0cmluZyl2b2lkIiwgbWV0aG9kICJhcmM1OF9yZW1vdmVQbHVnaW4odWludDY0LGFkZHJlc3Msc3RyaW5nKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZE5hbWVkUGx1Z2luKHN0cmluZyx1aW50NjQsYWRkcmVzcyxzdHJpbmcsYm9vbCx1aW50OCx1aW50NjQsdWludDY0LChieXRlWzRdLHVpbnQ2NClbXSxib29sLGJvb2wsYm9vbCxib29sLGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4oc3RyaW5nKXZvaWQiLCBtZXRob2QgImFyYzU4X25ld0VzY3JvdyhzdHJpbmcpdWludDY0IiwgbWV0aG9kICJhcmM1OF90b2dnbGVFc2Nyb3dMb2NrKHN0cmluZykodWludDY0LGJvb2wpIiwgbWV0aG9kICJhcmM1OF9yZWNsYWltKHN0cmluZywodWludDY0LHVpbnQ2NCxib29sKVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3BsdWdpblJlY2xhaW0odWludDY0LGFkZHJlc3Msc3RyaW5nLCh1aW50NjQsdWludDY0LGJvb2wpW10pdm9pZCIsIG1ldGhvZCAiYXJjNThfb3B0SW5Fc2Nyb3coc3RyaW5nLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3BsdWdpbk9wdEluRXNjcm93KHVpbnQ2NCxhZGRyZXNzLHN0cmluZyx1aW50NjRbXSxwYXkpdm9pZCIsIG1ldGhvZCAiYXJjNThfYWRkQWxsb3dhbmNlcyhzdHJpbmcsKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKVtdKXZvaWQiLCBtZXRob2QgImFyYzU4X3JlbW92ZUFsbG93YW5jZXMoc3RyaW5nLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImFyYzU4X2FkZEV4ZWN1dGlvbktleShieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5KGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgImFyYzU4X2dldEFkbWluKClhZGRyZXNzIiwgbWV0aG9kICJhcmM1OF9nZXRQbHVnaW5zKCh1aW50NjQsYWRkcmVzcyxzdHJpbmcpW10pKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LChieXRlWzRdLHVpbnQ2NCx1aW50NjQpW10sYm9vbCxib29sLGJvb2wsYm9vbCxib29sLHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgImFyYzU4X2dldE5hbWVkUGx1Z2lucyhzdHJpbmdbXSkodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsKGJ5dGVbNF0sdWludDY0LHVpbnQ2NClbXSxib29sLGJvb2wsYm9vbCxib29sLGJvb2wsdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iLCBtZXRob2QgImFyYzU4X2dldEFsbG93YW5jZXMoc3RyaW5nLHVpbnQ2NFtdKSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKVtdIiwgbWV0aG9kICJhcmM1OF9nZXRFeGVjdXRpb25zKGJ5dGVbMzJdW10pKGJ5dGVbMzJdW10sdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXJjNThfZ2V0RG9tYWluS2V5cyhhZGRyZXNzW10pc3RyaW5nW10iLCBtZXRob2QgIm1icihzdHJpbmcsdWludDY0LHN0cmluZyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJlZ2lzdGVyIHNldERvbWFpbiBzZXRSZXZvY2F0aW9uQXBwIHNldEFraXRhREFPIHNldE5pY2tuYW1lIHNldEF2YXRhciBzZXRCYW5uZXIgc2V0QmlvIHNldEZhY3RvcnlVcGRhdGVTZXR0aW5ncyBhcmM1OF9jaGFuZ2VBZG1pbiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcyBhcmM1OF9yZWtleVRvIGFyYzU4X2NhbkNhbGwgYXJjNThfcmVrZXlUb1BsdWdpbiBhcmM1OF9yZWtleVRvTmFtZWRQbHVnaW4gYXJjNThfYWRkUGx1Z2luIGFzc2lnbkRvbWFpbiBhcmM1OF9yZW1vdmVQbHVnaW4gYXJjNThfYWRkTmFtZWRQbHVnaW4gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4gYXJjNThfbmV3RXNjcm93IGFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2sgYXJjNThfcmVjbGFpbSBhcmM1OF9wbHVnaW5SZWNsYWltIGFyYzU4X29wdEluRXNjcm93IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93IGFyYzU4X2FkZEFsbG93YW5jZXMgYXJjNThfcmVtb3ZlQWxsb3dhbmNlcyBhcmM1OF9hZGRFeGVjdXRpb25LZXkgYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5IGFyYzU4X2dldEFkbWluIGFyYzU4X2dldFBsdWdpbnMgYXJjNThfZ2V0TmFtZWRQbHVnaW5zIGFyYzU4X2dldEVzY3Jvd3MgYXJjNThfZ2V0QWxsb3dhbmNlcyBhcmM1OF9nZXRFeGVjdXRpb25zIGFyYzU4X2dldERvbWFpbktleXMgbWJyCiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BANDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMi0xMTgKICAgIC8vIEBjb250cmFjdCh7CiAgICAvLyAgIHN0YXRlVG90YWxzOiB7CiAgICAvLyAgICAgZ2xvYmFsQnl0ZXM6IEFic3RyYWN0QWNjb3VudE51bUdsb2JhbEJ5dGVzLAogICAgLy8gICAgIGdsb2JhbFVpbnRzOiBBYnN0cmFjdEFjY291bnROdW1HbG9iYWxVaW50cwogICAgLy8gICB9CiAgICAvLyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIEFic3RyYWN0ZWRBY2NvdW50IGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZTllZDJlNmYgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCx1aW50NjQsc3RyaW5nLGFkZHJlc3MsYnl0ZVszMl0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjUKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQoYXJyYXk6IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQ6CiAgICBwcm90byAyIDEKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzLCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBieXRlY18wIC8vICIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMgogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjp1aW50OCh2OiB1aW50NjQpIC0+IGJ5dGVzOgp1aW50ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiB1aW50OCh2OiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL3R5cGVzL2Jhc2UudHM6NAogICAgLy8gcmV0dXJuIG5ldyBhcmM0LlVpbnQ4KHYpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjplbXB0eVBsdWdpbkluZm8oKSAtPiBieXRlczoKZW1wdHlQbHVnaW5JbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdXRpbHMudHM6NwogICAgLy8gZGVsZWdhdGlvblR5cGU6IHVpbnQ4KDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdWludDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjEwCiAgICAvLyBtZXRob2RzOiBbXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czo1LTE4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBlc2Nyb3c6IDAsCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiB1aW50OCgwKSwKICAgIC8vICAgbGFzdFZhbGlkOiAwLAogICAgLy8gICBjb29sZG93bjogMCwKICAgIC8vICAgbWV0aG9kczogW10sCiAgICAvLyAgIGFkbWluOiBmYWxzZSwKICAgIC8vICAgdXNlUm91bmRzOiBmYWxzZSwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBmYWxzZSwKICAgIC8vICAgY292ZXJGZWVzOiBmYWxzZSwKICAgIC8vICAgY2FuUmVjbGFpbTogZmFsc2UsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IDAsCiAgICAvLyAgIHN0YXJ0OiAwLAogICAgLy8gfTsKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmMwMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjEwCiAgICAvLyBtZXRob2RzOiBbXSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czo1LTE4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBlc2Nyb3c6IDAsCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiB1aW50OCgwKSwKICAgIC8vICAgbGFzdFZhbGlkOiAwLAogICAgLy8gICBjb29sZG93bjogMCwKICAgIC8vICAgbWV0aG9kczogW10sCiAgICAvLyAgIGFkbWluOiBmYWxzZSwKICAgIC8vICAgdXNlUm91bmRzOiBmYWxzZSwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBmYWxzZSwKICAgIC8vICAgY292ZXJGZWVzOiBmYWxzZSwKICAgIC8vICAgY2FuUmVjbGFpbTogZmFsc2UsCiAgICAvLyAgIGxhc3RDYWxsZWQ6IDAsCiAgICAvLyAgIHN0YXJ0OiAwLAogICAgLy8gfTsKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MDIKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIGxvZ2dlZEFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCAhPT0gMCwgRVJSX0JBRF9ERVBMT1lFUikKICAgIGdsb2JhbCBDYWxsZXJBcHBsaWNhdGlvbklECiAgICBibnogY3JlYXRlX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpCREVQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkJERVAKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoYWRtaW4gIT09IGNvbnRyb2xsZWRBZGRyZXNzLCBFUlJfQURNSU5fQ0FOTk9UX0JFX0NPTlRST0xMRUQpCiAgICBkaWcgNgogICAgZGlnIDgKICAgICE9CiAgICBibnogY3JlYXRlX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpBQ0JDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFDQkMKCmNyZWF0ZV9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIzCiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBieXRlYyAyOSAvLyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzE4CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICBkaWcgMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDMwIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcxOQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQWRtaW4gfSkKICAgIGJ5dGVjIDE0IC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzIwCiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gYWRtaW4KICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGRvbWFpbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0RvbWFpbiB9KTsKICAgIGJ5dGVjIDIyIC8vICJkb21haW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyMQogICAgLy8gdGhpcy5kb21haW4udmFsdWUgPSBkb21haW4KICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MjMKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGRpZyA3CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyMy03MjUKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIC8vICAgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICA6IGNvbnRyb2xsZWRBZGRyZXNzCiAgICBieiBjcmVhdGVfdGVybmFyeV9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyNAogICAgLy8gPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKCmNyZWF0ZV90ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyMi03MjUKICAgIC8vIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgPQogICAgLy8gICBjb250cm9sbGVkQWRkcmVzcyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICAvLyAgICAgPyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gICAgIDogY29udHJvbGxlZEFkZHJlc3MKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gZXNjcm93RmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzRXNjcm93RmFjdG9yeSB9KQogICAgYnl0ZWMgMjMgLy8gImVzY3Jvd19mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MjYKICAgIC8vIHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSA9IEFwcGxpY2F0aW9uKGVzY3Jvd0ZhY3RvcnkpCiAgICBkaWcgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBzcGVuZGluZ0FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzIH0pCiAgICBieXRlYyAxMCAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzI3CiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9IEdsb2JhbC56ZXJvQWRkcmVzczsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1CiAgICAvLyByZXZvY2F0aW9uID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVJldm9jYXRpb24gfSkKICAgIGJ5dGVjIDI0IC8vICJyZXZvY2F0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MjgKICAgIC8vIHRoaXMucmV2b2NhdGlvbi52YWx1ZSA9IEFwcGxpY2F0aW9uKHJldm9jYXRpb25BcHApCiAgICBkaWcgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBuaWNrbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c05pY2tuYW1lIH0pCiAgICBieXRlYyAzMSAvLyAibmlja25hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcyOQogICAgLy8gdGhpcy5uaWNrbmFtZS52YWx1ZSA9IG5pY2tuYW1lCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyBmYWN0b3J5QXBwID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNGYWN0b3J5QXBwIH0pCiAgICBieXRlYyAzMiAvLyAiZmFjdG9yeV9hcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjczMAogICAgLy8gdGhpcy5mYWN0b3J5QXBwLnZhbHVlID0gQXBwbGljYXRpb24oR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyByZWZlcnJlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlciB9KQogICAgcHVzaGJ5dGVzICJyZWZlcnJlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzMxCiAgICAvLyB0aGlzLnJlZmVycmVyLnZhbHVlID0gcmVmZXJyZXIKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGZhY3RvcnlVcGRhdGVTZXR0aW5ncyA9IEdsb2JhbFN0YXRlPEZhY3RvcnlVcGRhdGVTZXR0aW5ncz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1VwZGF0ZVNldHRpbmdzIH0pCiAgICBieXRlYyAyNSAvLyAidXBkYXRlX3NldHRpbmdzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3MzIKICAgIC8vIHRoaXMuZmFjdG9yeVVwZGF0ZVNldHRpbmdzLnZhbHVlID0geyBhbGxvd2VkOiB0cnVlLCBhdXRvbWF0aWM6IHRydWUgfQogICAgcHVzaGJ5dGVzIDB4YzAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MQogICAgLy8gc2FsdCA9IEdsb2JhbFN0YXRlPGJ5dGVzPDMyPj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NhbHQgfSkKICAgIHB1c2hieXRlcyAic2FsdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzMzCiAgICAvLyB0aGlzLnNhbHQudmFsdWUgPSBzYWx0CiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjcwMgogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV90ZXJuYXJ5X2ZhbHNlQDc6CiAgICBkaWcgNwogICAgYiBjcmVhdGVfdGVybmFyeV9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucmVnaXN0ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQ1CiAgICAvLyByZWdpc3Rlcihlc2Nyb3c6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NDYKICAgIC8vIGxldCBhcHA6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc0NwogICAgLy8gaWYgKGVzY3JvdyAhPT0gJycpIHsKICAgIGJ5dGVjXzAgLy8gIiIKICAgICE9CiAgICBieiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQ4CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3JvdykKICAgIGRpZyAxCiAgICBkdXAKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzQ5CiAgICAvLyBhcHAgPSB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxCgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc1Mi03NjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLnJlZ2lzdGVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhcHAKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGVzY3Jvd0ZhY3RvcnkgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0VzY3Jvd0ZhY3RvcnkgfSkKICAgIGJ5dGVjIDIzIC8vICJlc2Nyb3dfZmFjdG9yeSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc1NwogICAgLy8gYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIHB1c2hpbnQgMTIxMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc1NS03NTgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NTItNzYxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5yZWdpc3Rlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogQVJDNThXYWxsZXRJRHNCeUFjY291bnRzTWJyCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgYXBwCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzU5CiAgICAvLyBhcHAKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzUyLTc2MQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgRXNjcm93RmFjdG9yeS5wcm90b3R5cGUucmVnaXN0ZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZSwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEFSQzU4V2FsbGV0SURzQnlBY2NvdW50c01icgogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFwcAogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NjA3ZTcwNDYgLy8gbWV0aG9kICJyZWdpc3RlcihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc0NQogICAgLy8gcmVnaXN0ZXIoZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc2NQogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIHRoaXMuaXNBZG1pbigpIHx8CiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzY5LTc3MAogICAgLy8gdGhpcy5pc0FkbWluKCkgfHwKICAgIC8vICh0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZS5hbGxvd2VkICYmIFR4bi5zZW5kZXIgPT09IHRoaXMuZmFjdG9yeUFwcC52YWx1ZS5hZGRyZXNzKQogICAgYm56IHVwZGF0ZV9ib29sX3RydWVANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NzAKICAgIC8vICh0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZS5hbGxvd2VkICYmIFR4bi5zZW5kZXIgPT09IHRoaXMuZmFjdG9yeUFwcC52YWx1ZS5hZGRyZXNzKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5CiAgICAvLyBmYWN0b3J5VXBkYXRlU2V0dGluZ3MgPSBHbG9iYWxTdGF0ZTxGYWN0b3J5VXBkYXRlU2V0dGluZ3M+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNVcGRhdGVTZXR0aW5ncyB9KQogICAgYnl0ZWMgMjUgLy8gInVwZGF0ZV9zZXR0aW5ncyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyAodGhpcy5mYWN0b3J5VXBkYXRlU2V0dGluZ3MudmFsdWUuYWxsb3dlZCAmJiBUeG4uc2VuZGVyID09PSB0aGlzLmZhY3RvcnlBcHAudmFsdWUuYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieiB1cGRhdGVfYm9vbF9mYWxzZUA1CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGZhY3RvcnlBcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0ZhY3RvcnlBcHAgfSkKICAgIGJ5dGVjIDMyIC8vICJmYWN0b3J5X2FwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyAodGhpcy5mYWN0b3J5VXBkYXRlU2V0dGluZ3MudmFsdWUuYWxsb3dlZCAmJiBUeG4uc2VuZGVyID09PSB0aGlzLmZhY3RvcnlBcHAudmFsdWUuYWRkcmVzcykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYnogdXBkYXRlX2Jvb2xfZmFsc2VANQoKdXBkYXRlX2Jvb2xfdHJ1ZUA0OgogICAgaW50Y18xIC8vIDEKCnVwZGF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc2Ny03NzMKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgKAogICAgLy8gICAgIHRoaXMuaXNBZG1pbigpIHx8CiAgICAvLyAgICAgKHRoaXMuZmFjdG9yeVVwZGF0ZVNldHRpbmdzLnZhbHVlLmFsbG93ZWQgJiYgVHhuLnNlbmRlciA9PT0gdGhpcy5mYWN0b3J5QXBwLnZhbHVlLmFkZHJlc3MpCiAgICAvLyAgICksCiAgICAvLyAgIEVSUl9PTkxZX0FETUlOX0NBTl9VUERBVEUKICAgIC8vICkKICAgIGJueiB1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDgKICAgIHB1c2hieXRlcyAiRVJSOk9BQ1UiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T0FDVQoKdXBkYXRlX2FmdGVyX2Fzc2VydEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDI5IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3NjUKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdXBkYXRlX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHVwZGF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXREb21haW5bcm91dGluZ10oKSAtPiB2b2lkOgpzZXREb21haW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjc4NAogICAgLy8gc2V0RG9tYWluKGRvbWFpbjogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBkb21haW4gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNEb21haW4gfSk7CiAgICBieXRlYyAyMiAvLyAiZG9tYWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3ODYKICAgIC8vIHRoaXMuZG9tYWluLnZhbHVlID0gZG9tYWluCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3ODQKICAgIC8vIHNldERvbWFpbihkb21haW46IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnNldFJldm9jYXRpb25BcHBbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRSZXZvY2F0aW9uQXBwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3OTQKICAgIC8vIHNldFJldm9jYXRpb25BcHAoYXBwOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Nzk1CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKQogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gcmV2b2NhdGlvbiA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlSZXZvY2F0aW9uIH0pCiAgICBieXRlYyAyNCAvLyAicmV2b2NhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyB0aGlzLnJldm9jYXRpb24udmFsdWUgPSBBcHBsaWNhdGlvbihhcHApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo3OTQKICAgIC8vIHNldFJldm9jYXRpb25BcHAoYXBwOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXRBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MDQKICAgIC8vIHNldEFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MDUKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODA2CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gc2V0QWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0Tmlja25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXROaWNrbmFtZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODE0CiAgICAvLyBzZXROaWNrbmFtZShuaWNrbmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBuaWNrbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c05pY2tuYW1lIH0pCiAgICBieXRlYyAzMSAvLyAibmlja25hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgxNgogICAgLy8gdGhpcy5uaWNrbmFtZS52YWx1ZSA9IG5pY2tuYW1lCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MTQKICAgIC8vIHNldE5pY2tuYW1lKG5pY2tuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5zZXRBdmF0YXJbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRBdmF0YXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gc2V0QXZhdGFyKGF2YXRhcjogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgyNQogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCkKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIGF2YXRhciA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQXZhdGFyIH0pCiAgICBwdXNoYnl0ZXMgImF2YXRhciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODI2CiAgICAvLyB0aGlzLmF2YXRhci52YWx1ZSA9IEFzc2V0KGF2YXRhcikKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gc2V0QXZhdGFyKGF2YXRhcjogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0QmFubmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0QmFubmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MzQKICAgIC8vIHNldEJhbm5lcihiYW5uZXI6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MzUKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM3CiAgICAvLyBiYW5uZXIgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0Jhbm5lciB9KQogICAgcHVzaGJ5dGVzICJiYW5uZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjgzNgogICAgLy8gdGhpcy5iYW5uZXIudmFsdWUgPSBBc3NldChiYW5uZXIpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4MzQKICAgIC8vIHNldEJhbm5lcihiYW5uZXI6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnNldEJpb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEJpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODQ0CiAgICAvLyBzZXRCaW8oYmlvOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg0NQogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCkKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIGJpbyA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0JpbyB9KQogICAgcHVzaGJ5dGVzICJiaW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg0NgogICAgLy8gdGhpcy5iaW8udmFsdWUgPSBiaW8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg0NAogICAgLy8gc2V0QmlvKGJpbzogc3RyaW5nKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NTUKICAgIC8vIHNldEZhY3RvcnlVcGRhdGVTZXR0aW5ncyhhbGxvd2VkOiBib29sZWFuLCBhdXRvbWF0aWM6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyB0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZSA9IHsgYWxsb3dlZCwgYXV0b21hdGljIH0KICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5CiAgICAvLyBmYWN0b3J5VXBkYXRlU2V0dGluZ3MgPSBHbG9iYWxTdGF0ZTxGYWN0b3J5VXBkYXRlU2V0dGluZ3M+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNVcGRhdGVTZXR0aW5ncyB9KQogICAgYnl0ZWMgMjUgLy8gInVwZGF0ZV9zZXR0aW5ncyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyB0aGlzLmZhY3RvcnlVcGRhdGVTZXR0aW5ncy52YWx1ZSA9IHsgYWxsb3dlZCwgYXV0b21hdGljIH0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg1NQogICAgLy8gc2V0RmFjdG9yeVVwZGF0ZVNldHRpbmdzKGFsbG93ZWQ6IGJvb2xlYW4sIGF1dG9tYXRpYzogYm9vbGVhbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2NoYW5nZUFkbWluW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfY2hhbmdlQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg2NQogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODY2CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0FkbWluIH0pCiAgICBieXRlYyAxNCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg2NwogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg2NQogICAgLy8gYXJjNThfY2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODc3CiAgICAvLyBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbihuZXdBZG1pbjogQWNjb3VudCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4NzgKICAgIC8vIGNvbnN0IGtleSA9IGNsb25lKHRoaXMuY3VycmVudFBsdWdpbi52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3VycmVudFBsdWdpbiA9IEdsb2JhbFN0YXRlPFBsdWdpbktleT4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0N1cnJlbnRQbHVnaW4gfSkKICAgIGJ5dGVjIDI2IC8vICJjdXJyZW50X3BsdWdpbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBjb25zdCBrZXkgPSBjbG9uZSh0aGlzLmN1cnJlbnRQbHVnaW4udmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODc5CiAgICAvLyBjb25zdCB7IHBsdWdpbiwgZXNjcm93IH0gPSBrZXkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4ODEKICAgIC8vIGxvZ2dlZEFzc2VydChlc2Nyb3cgPT09ICcnLCBFUlJfQURNSU5fUExVR0lOU19DQU5OT1RfVVNFX0VTQ1JPV1MpOwogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgIGJueiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6QVBORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBUE5FCgphcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6ODgyCiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLCBFUlJfU0VOREVSX01VU1RfQkVfQURNSU5fUExVR0lOKTsKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpTTUFQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlNNQVAKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4ODQKICAgIC8vIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUuYXV0aEFkZHJlc3MgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg4NAogICAgLy8gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg4My04ODYKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzLAogICAgLy8gICBFUlJfUExVR0lOX0RPRVNfTk9UX0NPTlRST0xfV0FMTEVUCiAgICAvLyApOwogICAgYm56IGFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpQRENXIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBEQ1cKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo4ODkKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cyAmJiB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5hZG1pbiwKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9mYWxzZUAxMAogICAgZGlnIDMKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg4OC04OTEKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGhpcy5wbHVnaW5zKGtleSkuZXhpc3RzICYmIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmFkbWluLAogICAgLy8gICBFUlJfUExVR0lOX0RPRVNfTk9UX0hBVkVfQURNSU5fUFJJVklMRUdFUwogICAgLy8gKTsKICAgIGJueiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9hZnRlcl9hc3NlcnRAMTMKICAgIHB1c2hieXRlcyAiRVJSOlBEQVAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UERBUAoKYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0FkbWluIH0pCiAgICBieXRlYyAxNCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5MwogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluOwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg5NAogICAgLy8gaWYgKHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLmRlbGVnYXRpb25UeXBlID09PSBEZWxlZ2F0aW9uVHlwZVNlbGYpIHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gOAogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBieXRlYyAxNiAvLyAweDAxCiAgICA9PQogICAgYnogYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW5fYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjg3NwogICAgLy8gYXJjNThfcGx1Z2luQ2hhbmdlQWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3BsdWdpbkNoYW5nZUFkbWluX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9wbHVnaW5DaGFuZ2VBZG1pbl9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTA0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUuYXV0aEFkZHJlc3MgPT09IHRoaXMuZ2V0QXV0aEFkZHJlc3MoKSwgRVJSX0FVVEhfQUREUl9NSVNNQVRDSCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHNwZW5kaW5nQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MgfSkKICAgIGJ5dGVjIDEwIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MDQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZS5hdXRoQWRkcmVzcyA9PT0gdGhpcy5nZXRBdXRoQWRkcmVzcygpLCBFUlJfQVVUSF9BRERSX01JU01BVENIKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2ODIKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2ODIKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjgyLTY4MwogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPT09IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUKICAgIC8vICYmIHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBieiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyAmJiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyAmJiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2ODItNjgzCiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9PT0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZQogICAgLy8gJiYgdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGJ6IGFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzX3Rlcm5hcnlfZmFsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2ODQKICAgIC8vICkgPyBHbG9iYWwuemVyb0FkZHJlc3MgOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwNAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLmF1dGhBZGRyZXNzID09PSB0aGlzLmdldEF1dGhBZGRyZXNzKCksIEVSUl9BVVRIX0FERFJfTUlTTUFUQ0gpOwogICAgZGlnIDEKICAgID09CiAgICBibnogYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3NfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOkFVQU0iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QVVBTQoKYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3NfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gc3BlbmRpbmdBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcyB9KQogICAgYnl0ZWMgMTAgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwNQogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTA2CiAgICAvLyB0aGlzLmN1cnJlbnRQbHVnaW4udmFsdWUgPSB7IHBsdWdpbjogMCwgY2FsbGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgZXNjcm93OiAnJyB9CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAyYTAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGN1cnJlbnRQbHVnaW4gPSBHbG9iYWxTdGF0ZTxQbHVnaW5LZXk+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDdXJyZW50UGx1Z2luIH0pCiAgICBieXRlYyAyNiAvLyAiY3VycmVudF9wbHVnaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwNgogICAgLy8gdGhpcy5jdXJyZW50UGx1Z2luLnZhbHVlID0geyBwbHVnaW46IDAsIGNhbGxlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGVzY3JvdzogJycgfQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyByZWtleUluZGV4ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWtleUluZGV4IH0pCiAgICBieXRlYyAyMSAvLyAicmVrZXlfaW5kZXgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwNwogICAgLy8gdGhpcy5yZWtleUluZGV4LnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkwMwogICAgLy8gYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X2ZhbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY4NAogICAgLy8gKSA/IEdsb2JhbC56ZXJvQWRkcmVzcyA6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYiBhcmM1OF92ZXJpZnlBdXRoQWRkcmVzc190ZXJuYXJ5X21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVrZXlUbzoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MTYKICAgIC8vIGFyYzU4X3Jla2V5VG8oYWRkcmVzczogQWNjb3VudCwgZmxhc2g6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkxNwogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTE5LTkyNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MjEKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTI0CiAgICAvLyBub3RlOiAncmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50JwogICAgcHVzaGJ5dGVzICJyZWtleWluZyBhYnN0cmFjdGVkIGFjY291bnQiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTE5LTkyNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTE5LTkyNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzLAogICAgLy8gICAgIHJla2V5VG86IGFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIGFic3RyYWN0ZWQgYWNjb3VudCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTI4CiAgICAvLyBpZiAoZmxhc2gpIHRoaXMuYXNzZXJ0UmVrZXlzQmFjaygpOwogICAgYnogYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBsZXQgcmVrZXlzQmFjayA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKYXJjNThfcmVrZXlUb193aGlsZV90b3BANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgZGlnIDEKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIDwKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYmxvY2tAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzg5CiAgICAvLyBpZiAodGhpcy50eG5SZWtleXNCYWNrKHR4bikpIHsKICAgIGRpZyAxCiAgICBjYWxsc3ViIHR4blJla2V5c0JhY2sKICAgIGJ6IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM5MAogICAgLy8gcmVrZXlzQmFjayA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxCgphcmM1OF9yZWtleVRvX2Jsb2NrQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIGxvZ2dlZEFzc2VydChyZWtleXNCYWNrLCBFUlJfTUlTU0lOR19SRUtFWV9CQUNLKTsKICAgIGR1cAogICAgYm56IGFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAzMyAvLyAiRVJSOk5SS0IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TlJLQgoKYXJjNThfcmVrZXlUb19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5MTYKICAgIC8vIGFyYzU4X3Jla2V5VG8oYWRkcmVzczogQWNjb3VudCwgZmxhc2g6IGJvb2xlYW4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3Jla2V5VG9fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBhcmM1OF9yZWtleVRvX3doaWxlX3RvcEA2CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfY2FuQ2FsbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2NhbkNhbGw6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTQzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGxlbgogICAgcHVzaGludCA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCA0PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5NTEKICAgIC8vIGNvbnN0IGNhbGxlciA9IHRoaXMucmVzb2x2ZUNhbGxlclR5cGUodHlwZSwgYWRkcmVzcykKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgcmVzb2x2ZUNhbGxlclR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXIsIGVzY3JvdyB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAxMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gaWYgKCF0aGlzLnBsdWdpbnMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gcmV0dXJuIGZhbHNlOwogICAgaW50Y18wIC8vIDAKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5wbHVnaW5DYWxsQWxsb3dlZEAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTQzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBjb25zdCB7IG1ldGhvZHMsIHVzZVJvdW5kcywgbGFzdENhbGxlZCwgY29vbGRvd24sIHVzZUV4ZWN1dGlvbktleSB9ID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUgYXMgUmVhZG9ubHk8UGx1Z2luSW5mbz4KICAgIGR1cG4gMgogICAgcHVzaGludCAxNwogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDgKICAgIGR1cAogICAgcHVzaGludCAyNwogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIGJ1cnkgNQogICAgaW50Y18yIC8vIDIKICAgIGdldGJpdAogICAgc3dhcAogICAgcHVzaGludCAyOAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBpZiAodXNlRXhlY3V0aW9uS2V5KSB7CiAgICBieiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTUyCiAgICAvLyByZXR1cm4gdGhpcy5wbHVnaW5DYWxsQWxsb3dlZChwbHVnaW4sIGNhbGxlciwgZXNjcm93LCBtZXRob2QpOwogICAgYiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucGx1Z2luQ2FsbEFsbG93ZWRAMTUKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGxldCBtZXRob2RBbGxvd2VkID0gbWV0aG9kcy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlOwogICAgZHVwCiAgICBwdXNoaW50IDQ0CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgICEKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CgphcmM1OF9jYW5DYWxsX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIHB1c2hpbnQgNDQKICAgIGludGNfMiAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDYKICAgID4KICAgIGJ6IGFyYzU4X2NhbkNhbGxfYmxvY2tAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBpZiAobWV0aG9kc1tpXS5zZWxlY3RvciA9PT0gbWV0aG9kKSB7CiAgICBkaWcgNQogICAgcHVzaGludCAyMAogICAgKgogICAgcHVzaGludCA0NgogICAgKwogICAgZGlnIDEKICAgIHN3YXAKICAgIHB1c2hpbnQgMjAKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgNAogICAgZGlnIDIKICAgID09CiAgICBieiBhcmM1OF9jYW5DYWxsX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIG1ldGhvZEFsbG93ZWQgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGJ1cnkgNAoKYXJjNThfY2FuQ2FsbF9ibG9ja0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBkaWcgMgogICAgYnogYXJjNThfY2FuQ2FsbF90ZXJuYXJ5X2ZhbHNlQDEzCiAgICBnbG9iYWwgUm91bmQKCmFyYzU4X2NhbkNhbGxfdGVybmFyeV9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyAhdGhpcy5pc09uQ29vbGRvd24oZXBvY2hSZWYsIGxhc3RDYWxsZWQsIGNvb2xkb3duKSAmJgogICAgZGlnIDUKICAgIGRpZyA4CiAgICBjYWxsc3ViIGlzT25Db29sZG93bgogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjEtMzYyCiAgICAvLyAhdGhpcy5pc09uQ29vbGRvd24oZXBvY2hSZWYsIGxhc3RDYWxsZWQsIGNvb2xkb3duKSAmJgogICAgLy8gbWV0aG9kQWxsb3dlZAogICAgZGlnIDQKICAgICYmCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk1MgogICAgLy8gcmV0dXJuIHRoaXMucGx1Z2luQ2FsbEFsbG93ZWQocGx1Z2luLCBjYWxsZXIsIGVzY3JvdywgbWV0aG9kKTsKICAgIGIgYXJjNThfY2FuQ2FsbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnBsdWdpbkNhbGxBbGxvd2VkQDE1CgphcmM1OF9jYW5DYWxsX3Rlcm5hcnlfZmFsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBhcmM1OF9jYW5DYWxsX3Rlcm5hcnlfbWVyZ2VAMTQKCmFyYzU4X2NhbkNhbGxfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgogICAgYiBhcmM1OF9jYW5DYWxsX3doaWxlX3RvcEA2CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3Jla2V5VG9QbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk2NC05NzAKICAgIC8vIGFyYzU4X3Jla2V5VG9QbHVnaW4oCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICB0eXBlOiB1aW50NjQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBtZXRob2RPZmZzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgZnVuZHNSZXF1ZXN0OiBGdW5kc1JlcXVlc3RbXQogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC90eXBlcy50czo6RnVuZHNSZXF1ZXN0PgogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luCiAgICBwb3BuIDIKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvTmFtZWRQbHVnaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9yZWtleVRvTmFtZWRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMzctMTA0MgogICAgLy8gYXJjNThfcmVrZXlUb05hbWVkUGx1Z2luKAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHR5cGU6IHVpbnQ2NCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIG1ldGhvZE9mZnNldHM6IHVpbnQ2NFtdLAogICAgLy8gICBmdW5kc1JlcXVlc3Q6IEZ1bmRzUmVxdWVzdFtdKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdHlwZXMudHM6OkZ1bmRzUmVxdWVzdD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBuYW1lZFBsdWdpbnMgPSBCb3hNYXA8c3RyaW5nLCBQbHVnaW5LZXk+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhOYW1lZFBsdWdpbnMgfSk7CiAgICBieXRlYyAxNSAvLyAibiIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwNDQKICAgIC8vIHRoaXMubmFtZWRQbHVnaW5zKG5hbWUpLnZhbHVlLnBsdWdpbiwKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA0My0xMDQ5CiAgICAvLyB0aGlzLmFyYzU4X3Jla2V5VG9QbHVnaW4oCiAgICAvLyAgIHRoaXMubmFtZWRQbHVnaW5zKG5hbWUpLnZhbHVlLnBsdWdpbiwKICAgIC8vICAgdHlwZSwKICAgIC8vICAgZXNjcm93LAogICAgLy8gICBtZXRob2RPZmZzZXRzLAogICAgLy8gICBmdW5kc1JlcXVlc3QKICAgIC8vICk7CiAgICBjb3ZlciA0CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW4KICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDM3LTEwNDIKICAgIC8vIGFyYzU4X3Jla2V5VG9OYW1lZFBsdWdpbigKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICB0eXBlOiB1aW50NjQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBtZXRob2RPZmZzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgZnVuZHNSZXF1ZXN0OiBGdW5kc1JlcXVlc3RbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2FkZFBsdWdpbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2FkZFBsdWdpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTE3MS0xMTg1CiAgICAvLyBhcmM1OF9hZGRQbHVnaW4oCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICBjYWxsZXI6IEFjY291bnQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBhZG1pbjogYm9vbGVhbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGU6IFVpbnQ4LAogICAgLy8gICBsYXN0VmFsaWQ6IHVpbnQ2NCwKICAgIC8vICAgY29vbGRvd246IHVpbnQ2NCwKICAgIC8vICAgbWV0aG9kczogTWV0aG9kUmVzdHJpY3Rpb25bXSwKICAgIC8vICAgdXNlUm91bmRzOiBib29sZWFuLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXk6IGJvb2xlYW4sCiAgICAvLyAgIGNvdmVyRmVlczogYm9vbGVhbiwKICAgIC8vICAgY2FuUmVjbGFpbTogYm9vbGVhbiwKICAgIC8vICAgZGVmYXVsdFRvRXNjcm93OiBib29sZWFuCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpNZXRob2RSZXN0cmljdGlvbj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTE4NwogICAgLy8gJycsCiAgICBieXRlY18wIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExODYtMTIwMQogICAgLy8gdGhpcy5fYWRkUGx1Z2luKAogICAgLy8gICAnJywKICAgIC8vICAgcGx1Z2luLAogICAgLy8gICBjYWxsZXIsCiAgICAvLyAgIGVzY3JvdywKICAgIC8vICAgYWRtaW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlLAogICAgLy8gICBsYXN0VmFsaWQsCiAgICAvLyAgIGNvb2xkb3duLAogICAgLy8gICBtZXRob2RzLAogICAgLy8gICB1c2VSb3VuZHMsCiAgICAvLyAgIHVzZUV4ZWN1dGlvbktleSwKICAgIC8vICAgY292ZXJGZWVzLAogICAgLy8gICBjYW5SZWNsYWltLAogICAgLy8gICBkZWZhdWx0VG9Fc2Nyb3cKICAgIC8vICkKICAgIGNvdmVyIDEzCiAgICBjYWxsc3ViIF9hZGRQbHVnaW4KICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTcxLTExODUKICAgIC8vIGFyYzU4X2FkZFBsdWdpbigKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIGFkbWluOiBib29sZWFuLAogICAgLy8gICBkZWxlZ2F0aW9uVHlwZTogVWludDgsCiAgICAvLyAgIGxhc3RWYWxpZDogdWludDY0LAogICAgLy8gICBjb29sZG93bjogdWludDY0LAogICAgLy8gICBtZXRob2RzOiBNZXRob2RSZXN0cmljdGlvbltdLAogICAgLy8gICB1c2VSb3VuZHM6IGJvb2xlYW4sCiAgICAvLyAgIHVzZUV4ZWN1dGlvbktleTogYm9vbGVhbiwKICAgIC8vICAgY292ZXJGZWVzOiBib29sZWFuLAogICAgLy8gICBjYW5SZWNsYWltOiBib29sZWFuLAogICAgLy8gICBkZWZhdWx0VG9Fc2Nyb3c6IGJvb2xlYW4KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFzc2lnbkRvbWFpbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2lnbkRvbWFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIxMAogICAgLy8gYXNzaWduRG9tYWluKGNhbGxlcjogQWNjb3VudCwgZG9tYWluOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSwgRVJSX09OTFlfQURNSU5fQ0FOX0FERF9QTFVHSU4pCiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBhc3NpZ25Eb21haW5fYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk9BQVAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T0FBUAoKYXNzaWduRG9tYWluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIHJldHVybiBNaW5Eb21haW5LZXlzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZG9tYWluKS5sZW5ndGgpCiAgICBkdXBuIDIKICAgIGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIHJldHVybiBNaW5Eb21haW5LZXlzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZG9tYWluKS5sZW5ndGgpCiAgICBwdXNoaW50IDE1NzAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMTMKICAgIC8vIHRoaXMuX3BheU1ickZyb21Db250cm9sbGVkKHRoaXMuZG9tYWluS2V5c01icihkb21haW4pKQogICAgY2FsbHN1YiBfcGF5TWJyRnJvbUNvbnRyb2xsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyBkb21haW5LZXlzID0gQm94TWFwPEFjY291bnQsIHN0cmluZz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeERvbWFpbktleXMgfSkKICAgIGJ5dGVjIDE3IC8vICJkIgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjE1CiAgICAvLyB0aGlzLmRvbWFpbktleXMoY2FsbGVyKS52YWx1ZSA9IGRvbWFpbgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIxMAogICAgLy8gYXNzaWduRG9tYWluKGNhbGxlcjogQWNjb3VudCwgZG9tYWluOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZW1vdmVQbHVnaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9yZW1vdmVQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMjUKICAgIC8vIGFyYzU4X3JlbW92ZVBsdWdpbihwbHVnaW46IHVpbnQ2NCwgY2FsbGVyOiBBY2NvdW50LCBlc2Nyb3c6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIyNgogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluT3JSZXZva2UoKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbk9yUmV2b2tlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMjgKICAgIC8vIGNvbnN0IGtleTogUGx1Z2luS2V5ID0geyBwbHVnaW4sIGNhbGxlcjogY2FsbGVyLCBlc2Nyb3cgfQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAxMSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMjkKICAgIC8vIHRoaXMuX3JlcXVpcmVQbHVnaW4oa2V5KQogICAgY2FsbHN1YiBfcmVxdWlyZVBsdWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTIzMQogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyMjUKICAgIC8vIGFyYzU4X3JlbW92ZVBsdWdpbihwbHVnaW46IHVpbnQ2NCwgY2FsbGVyOiBBY2NvdW50LCBlc2Nyb3c6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2FkZE5hbWVkUGx1Z2luW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfYWRkTmFtZWRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNTMtMTI2OAogICAgLy8gYXJjNThfYWRkTmFtZWRQbHVnaW4oCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIGFkbWluOiBib29sZWFuLAogICAgLy8gICBkZWxlZ2F0aW9uVHlwZTogVWludDgsCiAgICAvLyAgIGxhc3RWYWxpZDogdWludDY0LAogICAgLy8gICBjb29sZG93bjogdWludDY0LAogICAgLy8gICBtZXRob2RzOiBNZXRob2RSZXN0cmljdGlvbltdLAogICAgLy8gICB1c2VSb3VuZHM6IGJvb2xlYW4sCiAgICAvLyAgIHVzZUV4ZWN1dGlvbktleTogYm9vbGVhbiwKICAgIC8vICAgY292ZXJGZWVzOiBib29sZWFuLAogICAgLy8gICBjYW5SZWNsYWltOiBib29sZWFuLAogICAgLy8gICBkZWZhdWx0VG9Fc2Nyb3c6IGJvb2xlYW4KICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpNZXRob2RSZXN0cmljdGlvbj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyNjktMTI4NAogICAgLy8gdGhpcy5fYWRkUGx1Z2luKAogICAgLy8gICBuYW1lLAogICAgLy8gICBwbHVnaW4sCiAgICAvLyAgIGNhbGxlciwKICAgIC8vICAgZXNjcm93LAogICAgLy8gICBhZG1pbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGUsCiAgICAvLyAgIGxhc3RWYWxpZCwKICAgIC8vICAgY29vbGRvd24sCiAgICAvLyAgIG1ldGhvZHMsCiAgICAvLyAgIHVzZVJvdW5kcywKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5LAogICAgLy8gICBjb3ZlckZlZXMsCiAgICAvLyAgIGNhblJlY2xhaW0sCiAgICAvLyAgIGRlZmF1bHRUb0VzY3JvdwogICAgLy8gKQogICAgY2FsbHN1YiBfYWRkUGx1Z2luCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI1My0xMjY4CiAgICAvLyBhcmM1OF9hZGROYW1lZFBsdWdpbigKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgYWRtaW46IGJvb2xlYW4sCiAgICAvLyAgIGRlbGVnYXRpb25UeXBlOiBVaW50OCwKICAgIC8vICAgbGFzdFZhbGlkOiB1aW50NjQsCiAgICAvLyAgIGNvb2xkb3duOiB1aW50NjQsCiAgICAvLyAgIG1ldGhvZHM6IE1ldGhvZFJlc3RyaWN0aW9uW10sCiAgICAvLyAgIHVzZVJvdW5kczogYm9vbGVhbiwKICAgIC8vICAgdXNlRXhlY3V0aW9uS2V5OiBib29sZWFuLAogICAgLy8gICBjb3ZlckZlZXM6IGJvb2xlYW4sCiAgICAvLyAgIGNhblJlY2xhaW06IGJvb2xlYW4sCiAgICAvLyAgIGRlZmF1bHRUb0VzY3JvdzogYm9vbGVhbgogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW5bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9yZW1vdmVOYW1lZFBsdWdpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5MgogICAgLy8gYXJjNThfcmVtb3ZlTmFtZWRQbHVnaW4obmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyOTMKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbk9yUmV2b2tlKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW5PclJldm9rZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIG5hbWVkUGx1Z2lucyA9IEJveE1hcDxzdHJpbmcsIFBsdWdpbktleT4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeE5hbWVkUGx1Z2lucyB9KTsKICAgIGJ5dGVjIDE1IC8vICJuIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMubmFtZWRQbHVnaW5zKG5hbWUpLmV4aXN0cywgRVJSX1BMVUdJTl9ET0VTX05PVF9FWElTVCk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhcmM1OF9yZW1vdmVOYW1lZFBsdWdpbl9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMjcgLy8gIkVSUjpOUExHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5QTEcKCmFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjk1CiAgICAvLyBjb25zdCBhcHAgPSBjbG9uZSh0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS52YWx1ZSkKICAgIGR1cG4gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI5NgogICAgLy8gdGhpcy5fcmVxdWlyZVBsdWdpbihhcHApOwogICAgY2FsbHN1YiBfcmVxdWlyZVBsdWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyOTgKICAgIC8vIGNvbnN0IG1ldGhvZHNMZW5ndGg6IHVpbnQ2NCA9IHRoaXMucGx1Z2lucyhhcHApLnZhbHVlLm1ldGhvZHMubGVuZ3RoCiAgICBkdXAKICAgIHB1c2hpbnQgNDQKICAgIGludGNfMiAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzAwCiAgICAvLyB0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS5kZWxldGUoKTsKICAgIHVuY292ZXIgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMDEKICAgIC8vIHRoaXMucGx1Z2lucyhhcHApLmRlbGV0ZSgpOwogICAgc3dhcAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gcmV0dXJuIE1pbk5hbWVkUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMobmFtZSkubGVuZ3RoKQogICAgZGlnIDMKICAgIGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIHJldHVybiBNaW5OYW1lZFBsdWdpbk1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKG5hbWUpLmxlbmd0aCkKICAgIGludGMgNSAvLyAxODkwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzAzCiAgICAvLyB0aGlzLl9yZWZ1bmRNYnJUb0NvbnRyb2xsZWQodGhpcy5uYW1lZFBsdWdpbnNNYnIobmFtZSkgKyB0aGlzLnBsdWdpbnNNYnIoYXBwLmVzY3JvdywgbWV0aG9kc0xlbmd0aCkpCiAgICBkaWcgMgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBwbHVnaW5zTWJyCiAgICArCiAgICBjYWxsc3ViIF9yZWZ1bmRNYnJUb0NvbnRyb2xsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxCiAgICAvLyBsYXN0VXNlckludGVyYWN0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdFVzZXJJbnRlcmFjdGlvbiB9KQogICAgYnl0ZWNfMyAvLyAibGFzdF91c2VyX2ludGVyYWN0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTAKICAgIC8vIHRoaXMubGFzdFVzZXJJbnRlcmFjdGlvbi52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gbGFzdENoYW5nZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RDaGFuZ2UgfSkKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhbmdlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMubGFzdENoYW5nZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEyOTIKICAgIC8vIGFyYzU4X3JlbW92ZU5hbWVkUGx1Z2luKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X25ld0VzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X25ld0VzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxMwogICAgLy8gYXJjNThfbmV3RXNjcm93KGVzY3Jvdzogc3RyaW5nKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxNAogICAgLy8gdGhpcy5fcmVxdWlyZUFkbWluKCk7CiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxNQogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLmVzY3Jvd3MoZXNjcm93KS5leGlzdHMsIEVSUl9FU0NST1dfQUxSRUFEWV9FWElTVFMpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9uZXdFc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOkVFU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RUVTQwoKYXJjNThfbmV3RXNjcm93X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoZXNjcm93ICE9PSAnJywgRVJSX0VTQ1JPV19OQU1FX1JFUVVJUkVEKTsKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAiIgogICAgIT0KICAgIGJueiBhcmM1OF9uZXdFc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOkVOUlEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RU5SUQoKYXJjNThfbmV3RXNjcm93X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzE3CiAgICAvLyByZXR1cm4gdGhpcy5uZXdFc2Nyb3coZXNjcm93KTsKICAgIGR1cAogICAgY2FsbHN1YiBuZXdFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxMwogICAgLy8gYXJjNThfbmV3RXNjcm93KGVzY3Jvdzogc3RyaW5nKTogdWludDY0IHsKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF90b2dnbGVFc2Nyb3dMb2NrW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfdG9nZ2xlRXNjcm93TG9jazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMyNQogICAgLy8gYXJjNThfdG9nZ2xlRXNjcm93TG9jayhlc2Nyb3c6IHN0cmluZyk6IEVzY3Jvd0luZm8gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMyNgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpLCBFUlJfRk9SQklEREVOKTsKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IGFyYzU4X3RvZ2dsZUVzY3Jvd0xvY2tfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF90b2dnbGVFc2Nyb3dMb2NrX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzI3CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3Jvdyk7CiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMyOQogICAgLy8gdGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWUubG9ja2VkID0gIXRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmxvY2tlZDsKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHB1c2hpbnQgNjQKICAgIGdldGJpdAogICAgIQogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzMzCiAgICAvLyByZXR1cm4gdGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWU7CiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMyNQogICAgLy8gYXJjNThfdG9nZ2xlRXNjcm93TG9jayhlc2Nyb3c6IHN0cmluZyk6IEVzY3Jvd0luZm8gewogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3JlY2xhaW1bcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9yZWNsYWltOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzQyCiAgICAvLyBhcmM1OF9yZWNsYWltKGVzY3Jvdzogc3RyaW5nLCByZWNsYWltczogRXNjcm93UmVjbGFpbVtdKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxNwogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dSZWNsYWltPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzQzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCksIEVSUl9GT1JCSURERU4pOwogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogYXJjNThfcmVjbGFpbV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTIgLy8gIkVSUjpGT1JCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZPUkIKCmFyYzU4X3JlY2xhaW1fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNDQKICAgIC8vIHRoaXMuX3JlcXVpcmVFc2Nyb3coZXNjcm93KTsKICAgIGRpZyAxCiAgICBkdXAKICAgIGNhbGxzdWIgX3JlcXVpcmVFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM0NQogICAgLy8gdGhpcy5yZWNsYWltKGVzY3JvdywgcmVjbGFpbXMsIHRydWUpOwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIHJlY2xhaW0KICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzQyCiAgICAvLyBhcmM1OF9yZWNsYWltKGVzY3Jvdzogc3RyaW5nLCByZWNsYWltczogRXNjcm93UmVjbGFpbVtdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcGx1Z2luUmVjbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3BsdWdpblJlY2xhaW06CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNTctMTM2MgogICAgLy8gYXJjNThfcGx1Z2luUmVjbGFpbSgKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIGNhbGxlcjogQWNjb3VudCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIHJlY2xhaW1zOiBFc2Nyb3dSZWNsYWltW10KICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxNwogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dSZWNsYWltPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzYzCiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXI6IGNhbGxlciwgZXNjcm93IH0KICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMTEgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzY1CiAgICAvLyB0aGlzLl9yZXF1aXJlUGx1Z2luKGtleSkKICAgIGNhbGxzdWIgX3JlcXVpcmVQbHVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNjYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5jYW5SZWNsYWltLCBFUlJfRk9SQklEREVOKQogICAgcHVzaGludCAyNwogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDQKICAgIGdldGJpdAogICAgYm56IGFyYzU4X3BsdWdpblJlY2xhaW1fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF9wbHVnaW5SZWNsYWltX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzY3CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3JvdykKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yZXF1aXJlRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzAKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzAtMTM3MQogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIGJueiBhcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfdHJ1ZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzEKICAgIC8vIFR4bi5zZW5kZXIgPT09IGNhbGxlciB8fAogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzAtMTM3MQogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIGJueiBhcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfdHJ1ZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzNzIKICAgIC8vIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgZGlnIDIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM3MC0xMzcyCiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIC8vIFR4bi5zZW5kZXIgPT09IGNhbGxlciB8fAogICAgLy8gY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICBieiBhcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfZmFsc2VANwoKYXJjNThfcGx1Z2luUmVjbGFpbV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgphcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM2OS0xMzc0CiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgLy8gICBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIC8vICAgY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyAgIEVSUl9GT1JCSURERU4KICAgIC8vICkKICAgIGJueiBhcmM1OF9wbHVnaW5SZWNsYWltX2FmdGVyX2Fzc2VydEAxMAogICAgYnl0ZWMgMTIgLy8gIkVSUjpGT1JCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZPUkIKCmFyYzU4X3BsdWdpblJlY2xhaW1fYWZ0ZXJfYXNzZXJ0QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzc2CiAgICAvLyB0aGlzLnJlY2xhaW0oZXNjcm93LCByZWNsYWltcywgIXRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmxvY2tlZCk7CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCA2NAogICAgZ2V0Yml0CiAgICAhCiAgICBkaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiByZWNsYWltCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM1Ny0xMzYyCiAgICAvLyBhcmM1OF9wbHVnaW5SZWNsYWltKAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgcmVjbGFpbXM6IEVzY3Jvd1JlY2xhaW1bXQogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcmM1OF9wbHVnaW5SZWNsYWltX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFyYzU4X3BsdWdpblJlY2xhaW1fYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfb3B0SW5Fc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9vcHRJbkVzY3JvdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM4NQogICAgLy8gYXJjNThfb3B0SW5Fc2Nyb3coZXNjcm93OiBzdHJpbmcsIGFzc2V0czogdWludDY0W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM4NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpLCBFUlJfRk9SQklEREVOKQogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogYXJjNThfb3B0SW5Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF9vcHRJbkVzY3Jvd19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM4NwogICAgLy8gdGhpcy5fcmVxdWlyZUVzY3Jvdyhlc2Nyb3cpCiAgICBkaWcgMQogICAgZHVwCiAgICBjYWxsc3ViIF9yZXF1aXJlRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzODgKICAgIC8vIHRoaXMuX3JlcXVpcmVVbmxvY2tlZEVzY3Jvdyhlc2Nyb3cpCiAgICBkdXAKICAgIGNhbGxzdWIgX3JlcXVpcmVVbmxvY2tlZEVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzg5CiAgICAvLyB0aGlzLm9wdEluRXNjcm93KGVzY3JvdywgYXNzZXRzKTsKICAgIGRpZyAxCiAgICBjYWxsc3ViIG9wdEluRXNjcm93CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTM4NQogICAgLy8gYXJjNThfb3B0SW5Fc2Nyb3coZXNjcm93OiBzdHJpbmcsIGFzc2V0czogdWludDY0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X3BsdWdpbk9wdEluRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDAxLTE0MDcKICAgIC8vIGFyYzU4X3BsdWdpbk9wdEluRXNjcm93KAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgYXNzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MDgKICAgIC8vIGNvbnN0IGtleTogUGx1Z2luS2V5ID0geyBwbHVnaW4sIGNhbGxlcjogY2FsbGVyLCBlc2Nyb3cgfQogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMTEgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEwCiAgICAvLyB0aGlzLl9yZXF1aXJlUGx1Z2luKGtleSkKICAgIGNhbGxzdWIgX3JlcXVpcmVQbHVnaW4KICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDExCiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3JvdykKICAgIGR1cAogICAgY2FsbHN1YiBfcmVxdWlyZUVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEyCiAgICAvLyB0aGlzLl9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93KQogICAgY2FsbHN1YiBfcmVxdWlyZVVubG9ja2VkRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTUKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBsdWdpbikuYWRkcmVzcyB8fAogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQxNS0xNDE2CiAgICAvLyBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIC8vIFR4bi5zZW5kZXIgPT09IGNhbGxlciB8fAogICAgYm56IGFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2Jvb2xfdHJ1ZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTYKICAgIC8vIFR4bi5zZW5kZXIgPT09IGNhbGxlciB8fAogICAgdHhuIFNlbmRlcgogICAgZGlnIDUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTUtMTQxNgogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIGJueiBhcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX3RydWVANAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDE3CiAgICAvLyBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGRpZyA0CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTUtMTQxNwogICAgLy8gVHhuLnNlbmRlciA9PT0gQXBwbGljYXRpb24ocGx1Z2luKS5hZGRyZXNzIHx8CiAgICAvLyBUeG4uc2VuZGVyID09PSBjYWxsZXIgfHwKICAgIC8vIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgYnogYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYm9vbF9mYWxzZUA1CgphcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgphcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MTQtMTQxOQogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwbHVnaW4pLmFkZHJlc3MgfHwKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gY2FsbGVyIHx8CiAgICAvLyAgIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICBFUlJfRk9SQklEREVOCiAgICAvLyApCiAgICBibnogYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDgKICAgIGJ5dGVjIDEyIC8vICJFUlI6Rk9SQiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGT1JCCgphcmM1OF9wbHVnaW5PcHRJbkVzY3Jvd19hZnRlcl9hc3NlcnRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQyMi0xNDI4CiAgICAvLyBtYXRjaCgKICAgIC8vICAgbWJyUGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICB9CiAgICAvLyApLAogICAgZHVwbiAyCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDI1CiAgICAvLyByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MjUKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQyMi0xNDI4CiAgICAvLyBtYXRjaCgKICAgIC8vICAgbWJyUGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICB9CiAgICAvLyApLAogICAgPT0KICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDI2CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQyMi0xNDI4CiAgICAvLyBtYXRjaCgKICAgIC8vICAgbWJyUGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICB9CiAgICAvLyApLAogICAgPT0KICAgICYmCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MjEtMTQzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICBtYXRjaCgKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgICAgfQogICAgLy8gICApLAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBibnogYXJjNThfcGx1Z2luT3B0SW5Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDEwCiAgICBwdXNoYnl0ZXMgIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2FmdGVyX2Fzc2VydEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzMgogICAgLy8gdGhpcy5vcHRJbkVzY3Jvdyhlc2Nyb3csIGFzc2V0cyk7CiAgICBkaWcgMwogICAgZGlnIDMKICAgIGNhbGxzdWIgb3B0SW5Fc2Nyb3cKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDAxLTE0MDcKICAgIC8vIGFyYzU4X3BsdWdpbk9wdEluRXNjcm93KAogICAgLy8gICBwbHVnaW46IHVpbnQ2NCwKICAgIC8vICAgY2FsbGVyOiBBY2NvdW50LAogICAgLy8gICBlc2Nyb3c6IHN0cmluZywKICAgIC8vICAgYXNzZXRzOiB1aW50NjRbXSwKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFyYzU4X3BsdWdpbk9wdEluRXNjcm93X2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2FkZEFsbG93YW5jZXNbcm91dGluZ10oKSAtPiB2b2lkOgphcmM1OF9hZGRBbGxvd2FuY2VzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQxCiAgICAvLyBhcmM1OF9hZGRBbGxvd2FuY2VzKGVzY3Jvdzogc3RyaW5nLCBhbGxvd2FuY2VzOiBBZGRBbGxvd2FuY2VJbmZvW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpBZGRBbGxvd2FuY2VJbmZvPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQyCiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQzCiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3Jvdyk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBfcmVxdWlyZUVzY3JvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQ0CiAgICAvLyB0aGlzLl9yZXF1aXJlVW5sb2NrZWRFc2Nyb3coZXNjcm93KTsKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yZXF1aXJlVW5sb2NrZWRFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXR1cm4gTWluQWxsb3dhbmNlTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBzd2FwCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHJldHVybiBNaW5BbGxvd2FuY2VNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIGludGMgNiAvLyAyNzcwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQ2CiAgICAvLyB0aGlzLl9wYXlNYnJGcm9tQ29udHJvbGxlZCh0aGlzLmFsbG93YW5jZXNNYnIoZXNjcm93KSAqIGFsbG93YW5jZXMubGVuZ3RoKQogICAgKgogICAgY2FsbHN1YiBfcGF5TWJyRnJvbUNvbnRyb2xsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ0OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG93YW5jZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9hZGRBbGxvd2FuY2VzX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQ4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb3dhbmNlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogYXJjNThfYWRkQWxsb3dhbmNlc19hZnRlcl93aGlsZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NDkKICAgIC8vIGNvbnN0IHsgYXNzZXQsIHR5cGUsIGFtb3VudCwgbWF4LCBpbnRlcnZhbCwgdXNlUm91bmRzIH0gPSBhbGxvd2FuY2VzW2ldOwogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgcHVzaGludCAzNAogICAgKgogICAgcHVzaGludCAzNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDEKICAgIGJ1cnkgOQogICAgZGlnIDEKICAgIGV4dHJhY3QgOSA4CiAgICBidXJ5IDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICBidXJ5IDEyCiAgICBkaWcgMQogICAgZXh0cmFjdCAyNSA4CiAgICBidXJ5IDExCiAgICBzd2FwCiAgICBwdXNoaW50IDI2NAogICAgZ2V0Yml0CiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1MAogICAgLy8gY29uc3Qga2V5OiBBbGxvd2FuY2VLZXkgPSB7IGVzY3JvdywgYXNzZXQgfQogICAgZGlnIDIKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgNgogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyAweDAwMGEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBhbGxvd2FuY2VzID0gQm94TWFwPEFsbG93YW5jZUtleSwgQWxsb3dhbmNlSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEFsbG93YW5jZXMgfSkgLy8gMzhfNTAwCiAgICBieXRlYyAxOSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1MQogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLmFsbG93YW5jZXMoa2V5KS5leGlzdHMsIEVSUl9BTExPV0FOQ0VfQUxSRUFEWV9FWElTVFMpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9hZGRBbGxvd2FuY2VzX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpFQUxXIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVBTFcKCmFyYzU4X2FkZEFsbG93YW5jZXNfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NTIKICAgIC8vIGNvbnN0IHN0YXJ0ID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcDsKICAgIGRpZyA1CiAgICBieiBhcmM1OF9hZGRBbGxvd2FuY2VzX3Rlcm5hcnlfZmFsc2VANwogICAgZ2xvYmFsIFJvdW5kCgphcmM1OF9hZGRBbGxvd2FuY2VzX3Rlcm5hcnlfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1NC0xNDYzCiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZSA9IHsKICAgIC8vICAgdHlwZSwKICAgIC8vICAgc3BlbnQ6IDAsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vICAgbGFzdDogMCwKICAgIC8vICAgbWF4LAogICAgLy8gICBpbnRlcnZhbCwKICAgIC8vICAgc3RhcnQsCiAgICAvLyAgIHVzZVJvdW5kcwogICAgLy8gfQogICAgZGlnIDcKICAgIGRpZyAxMQogICAgY29uY2F0CiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDU2CiAgICAvLyBzcGVudDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NTQtMTQ2MwogICAgLy8gdGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUgPSB7CiAgICAvLyAgIHR5cGUsCiAgICAvLyAgIHNwZW50OiAwLAogICAgLy8gICBhbW91bnQsCiAgICAvLyAgIGxhc3Q6IDAsCiAgICAvLyAgIG1heCwKICAgIC8vICAgaW50ZXJ2YWwsCiAgICAvLyAgIHN0YXJ0LAogICAgLy8gICB1c2VSb3VuZHMKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDgKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgOAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQ4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb3dhbmNlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGFyYzU4X2FkZEFsbG93YW5jZXNfd2hpbGVfdG9wQDIKCmFyYzU4X2FkZEFsbG93YW5jZXNfdGVybmFyeV9mYWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDUyCiAgICAvLyBjb25zdCBzdGFydCA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBiIGFyYzU4X2FkZEFsbG93YW5jZXNfdGVybmFyeV9tZXJnZUA4CgphcmM1OF9hZGRBbGxvd2FuY2VzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDQxCiAgICAvLyBhcmM1OF9hZGRBbGxvd2FuY2VzKGVzY3Jvdzogc3RyaW5nLCBhbGxvd2FuY2VzOiBBZGRBbGxvd2FuY2VJbmZvW10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZW1vdmVBbGxvd2FuY2VzW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVtb3ZlQWxsb3dhbmNlczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3NQogICAgLy8gYXJjNThfcmVtb3ZlQWxsb3dhbmNlcyhlc2Nyb3c6IHN0cmluZywgYXNzZXRzOiB1aW50NjRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NzYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSB8fCB0aGlzLmNhblJldm9rZSgpLCBFUlJfT05MWV9BRE1JTl9PUl9SRVZPQ0FUSU9OX0FQUF9DQU5fUkVNT1ZFX01FVEhPRF9SRVNUUklDVElPTik7CiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBhcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2Jvb2xfdHJ1ZUAzCiAgICBjYWxsc3ViIGNhblJldm9rZQogICAgYnogYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19ib29sX2ZhbHNlQDQKCmFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NzYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSB8fCB0aGlzLmNhblJldm9rZSgpLCBFUlJfT05MWV9BRE1JTl9PUl9SRVZPQ0FUSU9OX0FQUF9DQU5fUkVNT1ZFX01FVEhPRF9SRVNUUklDVElPTik7CiAgICBibnogYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19hZnRlcl9hc3NlcnRANwogICAgcHVzaGJ5dGVzICJFUlI6T0FSTSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpPQVJNCgphcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDc3CiAgICAvLyB0aGlzLl9yZXF1aXJlRXNjcm93KGVzY3Jvdyk7CiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIF9yZXF1aXJlRXNjcm93CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NzgKICAgIC8vIHRoaXMuX3JlcXVpcmVVbmxvY2tlZEVzY3Jvdyhlc2Nyb3cpOwogICAgZHVwCiAgICBjYWxsc3ViIF9yZXF1aXJlVW5sb2NrZWRFc2Nyb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXR1cm4gTWluQWxsb3dhbmNlTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBsZW4KICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICBpbnRjIDQgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcmV0dXJuIE1pbkFsbG93YW5jZU1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgaW50YyA2IC8vIDI3NzAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0ODAKICAgIC8vIHRoaXMuX3JlZnVuZE1iclRvQ29udHJvbGxlZCh0aGlzLmFsbG93YW5jZXNNYnIoZXNjcm93KSAqIGFzc2V0cy5sZW5ndGgpCiAgICBkaWcgMQogICAgKgogICAgY2FsbHN1YiBfcmVmdW5kTWJyVG9Db250cm9sbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCmFyYzU4X3JlbW92ZUFsbG93YW5jZXNfd2hpbGVfdG9wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgYnogYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19hZnRlcl93aGlsZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDg1CiAgICAvLyBhc3NldDogYXNzZXRzW2ldCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA1CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDgzLTE0ODYKICAgIC8vIGNvbnN0IGtleTogQWxsb3dhbmNlS2V5ID0gewogICAgLy8gICBlc2Nyb3csCiAgICAvLyAgIGFzc2V0OiBhc3NldHNbaV0KICAgIC8vIH0KICAgIGRpZyA0CiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDQKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gMHgwMDBhCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gYWxsb3dhbmNlcyA9IEJveE1hcDxBbGxvd2FuY2VLZXksIEFsbG93YW5jZUluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhBbGxvd2FuY2VzIH0pIC8vIDM4XzUwMAogICAgYnl0ZWMgMTkgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0ODcKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmFsbG93YW5jZXMoa2V5KS5leGlzdHMsIEVSUl9BTExPV0FOQ0VfRE9FU19OT1RfRVhJU1QpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMzQgLy8gIkVSUjpOQUxXIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5BTFcKCmFyYzU4X3JlbW92ZUFsbG93YW5jZXNfYWZ0ZXJfYXNzZXJ0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDg4CiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS5kZWxldGUoKQogICAgZGlnIDUKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDgyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYXNzZXRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBhcmM1OF9yZW1vdmVBbGxvd2FuY2VzX3doaWxlX3RvcEA4CgphcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2FmdGVyX3doaWxlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBsYXN0Q2hhbmdlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzTGFzdENoYW5nZSB9KQogICAgYnl0ZWMgNiAvLyAibGFzdF9jaGFuZ2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5sYXN0Q2hhbmdlLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ3NQogICAgLy8gYXJjNThfcmVtb3ZlQWxsb3dhbmNlcyhlc2Nyb3c6IHN0cmluZywgYXNzZXRzOiB1aW50NjRbXSk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXJjNThfcmVtb3ZlQWxsb3dhbmNlc19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcmM1OF9yZW1vdmVBbGxvd2FuY2VzX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2FkZEV4ZWN1dGlvbktleVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2FkZEV4ZWN1dGlvbktleToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUwMgogICAgLy8gYXJjNThfYWRkRXhlY3V0aW9uS2V5KGxlYXNlOiBieXRlczwzMj4sIGdyb3VwczogYnl0ZXM8MzI+W10sIGZpcnN0VmFsaWQ6IHVpbnQ2NCwgbGFzdFZhbGlkOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoaW50IDMyCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlc1szMl0+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MDMKICAgIC8vIHRoaXMuX3JlcXVpcmVBZG1pbigpCiAgICBjYWxsc3ViIF9yZXF1aXJlQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGJ5dGVjIDkgLy8gIngiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTA0CiAgICAvLyBpZiAoIXRoaXMuZXhlY3V0aW9ucyhsZWFzZSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhcmM1OF9hZGRFeGVjdXRpb25LZXlfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUwNS0xNTA5CiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlID0gewogICAgLy8gICBncm91cHM6IGNsb25lKGdyb3VwcyksCiAgICAvLyAgIGZpcnN0VmFsaWQsCiAgICAvLyAgIGxhc3RWYWxpZAogICAgLy8gfQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKCmFyYzU4X2FkZEV4ZWN1dGlvbktleV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTAyCiAgICAvLyBhcmM1OF9hZGRFeGVjdXRpb25LZXkobGVhc2U6IGJ5dGVzPDMyPiwgZ3JvdXBzOiBieXRlczwzMj5bXSwgZmlyc3RWYWxpZDogdWludDY0LCBsYXN0VmFsaWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXJjNThfYWRkRXhlY3V0aW9uS2V5X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTExCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5maXJzdFZhbGlkID09PSBmaXJzdFZhbGlkLCBFUlJfRVhFQ1VUSU9OX0tFWV9VUERBVEVfTVVTVF9NQVRDSF9GSVJTVF9WQUxJRCkKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICA9PQogICAgYm56IGFyYzU4X2FkZEV4ZWN1dGlvbktleV9hZnRlcl9hc3NlcnRANQogICAgcHVzaGJ5dGVzICJFUlI6RUtGViIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFS0ZWCgphcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MTIKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmxhc3RWYWxpZCA9PT0gbGFzdFZhbGlkLCBFUlJfRVhFQ1VUSU9OX0tFWV9VUERBVEVfTVVTVF9NQVRDSF9MQVNUX1ZBTElEKQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA9PQogICAgYm56IGFyYzU4X2FkZEV4ZWN1dGlvbktleV9hZnRlcl9hc3NlcnRANwogICAgcHVzaGJ5dGVzICJFUlI6RUtMViIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFS0xWCgphcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MTQKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzID0gWy4uLmNsb25lKHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzKSwgLi4uY2xvbmUoZ3JvdXBzKV0KICAgIGRpZyA0CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTE0CiAgICAvLyB0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyA9IFsuLi5jbG9uZSh0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLnZhbHVlLmdyb3VwcyksIC4uLmNsb25lKGdyb3VwcyldCiAgICBwdXNoaW50IDE4CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGRpZyA2CiAgICArCiAgICBkaWcgMgogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgZHVwCiAgICBkaWcgNwogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MTQKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzID0gWy4uLmNsb25lKHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUuZ3JvdXBzKSwgLi4uY2xvbmUoZ3JvdXBzKV0KICAgIHB1c2hpbnQgMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUxNAogICAgLy8gdGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5ncm91cHMgPSBbLi4uY2xvbmUodGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5ncm91cHMpLCAuLi5jbG9uZShncm91cHMpXQogICAgcHVzaGludCAzMgogICAgKgogICAgcHVzaGludCAyMAogICAgKwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgYm94X3NwbGljZQogICAgYiBhcmM1OF9hZGRFeGVjdXRpb25LZXlfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5W3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTI1CiAgICAvLyBhcmM1OF9yZW1vdmVFeGVjdXRpb25LZXkobGVhc2U6IGJ5dGVzPDMyPik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgYnl0ZWMgOSAvLyAieCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MjYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMobGVhc2UpLmV4aXN0cywgRVJSX0VYRUNVVElPTl9LRVlfTk9UX0ZPVU5EKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAzNSAvLyAiRVJSOk5FWEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVYSwoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTI3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5pc0FkbWluKCkgfHwgdGhpcy5leGVjdXRpb25zKGxlYXNlKS52YWx1ZS5sYXN0VmFsaWQgPCBHbG9iYWwucm91bmQsIEVSUl9BRE1JTl9PTkxZKQogICAgY2FsbHN1YiBpc0FkbWluCiAgICBibnogYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2Jvb2xfdHJ1ZUA1CiAgICBkdXAKICAgIHB1c2hpbnQgMTAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZ2xvYmFsIFJvdW5kCiAgICA8CiAgICBieiBhcmM1OF9yZW1vdmVFeGVjdXRpb25LZXlfYm9vbF9mYWxzZUA2CgphcmM1OF9yZW1vdmVFeGVjdXRpb25LZXlfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUyNwogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpIHx8IHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkudmFsdWUubGFzdFZhbGlkIDwgR2xvYmFsLnJvdW5kLCBFUlJfQURNSU5fT05MWSkKICAgIGJueiBhcmM1OF9yZW1vdmVFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDM2IC8vICJFUlI6QURNTiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBRE1OCgphcmM1OF9yZW1vdmVFeGVjdXRpb25LZXlfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1MjkKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhsZWFzZSkuZGVsZXRlKCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTI1CiAgICAvLyBhcmM1OF9yZW1vdmVFeGVjdXRpb25LZXkobGVhc2U6IGJ5dGVzPDMyPik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXJjNThfcmVtb3ZlRXhlY3V0aW9uS2V5X2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFyYzU4X3JlbW92ZUV4ZWN1dGlvbktleV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9nZXRBZG1pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTQyCiAgICAvLyByZXR1cm4gdGhpcy5hZG1pbi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNBZG1pbiB9KQogICAgYnl0ZWMgMTQgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTQyCiAgICAvLyByZXR1cm4gdGhpcy5hZG1pbi52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU0MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0UGx1Z2luc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldFBsdWdpbnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXRQbHVnaW5zX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBhcmM1OF9nZXRQbHVnaW5zX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCx1aW50OFszMl0sKGxlbit1dGY4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDIgb2YgKHVpbnQ2NCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDQKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXRQbHVnaW5zX2Zvcl9oZWFkZXJAMQoKYXJjNThfZ2V0UGx1Z2luc19hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvdHlwZXMudHM6OlBsdWdpbktleT4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1MwogICAgLy8gbGV0IHBsdWdpbnM6IFBsdWdpbkluZm9bXSA9IFtdCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NTQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CgphcmM1OF9nZXRQbHVnaW5zX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTU0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDYKICAgIGRpZyA1CiAgICA8CiAgICBieiBhcmM1OF9nZXRQbHVnaW5zX2FmdGVyX3doaWxlQDExCiAgICBkaWcgNgogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA5CiAgICB1bmNvdmVyIDIKICAgIC0KICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTU1CiAgICAvLyBpZiAodGhpcy5wbHVnaW5zKGtleXNbaV0pLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTU2CiAgICAvLyBwbHVnaW5zLnB1c2godGhpcy5wbHVnaW5zKGtleXNbaV0pLnZhbHVlKQogICAgZGlnIDgKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSA4CgphcmM1OF9nZXRQbHVnaW5zX2Jsb2NrQDEwOgogICAgZGlnIDUKICAgIGJ1cnkgNwogICAgYiBhcmM1OF9nZXRQbHVnaW5zX3doaWxlX3RvcEA2CgphcmM1OF9nZXRQbHVnaW5zX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1OQogICAgLy8gcGx1Z2lucy5wdXNoKGVtcHR5UGx1Z2luSW5mbygpKQogICAgY2FsbHN1YiBlbXB0eVBsdWdpbkluZm8KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDgKICAgIGIgYXJjNThfZ2V0UGx1Z2luc19ibG9ja0AxMAoKYXJjNThfZ2V0UGx1Z2luc19hZnRlcl93aGlsZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU1MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X2dldE5hbWVkUGx1Z2luc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldE5hbWVkUGx1Z2luczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTcwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCmFyYzU4X2dldE5hbWVkUGx1Z2luc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1dGY4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXROYW1lZFBsdWdpbnNfZm9yX2hlYWRlckAxCgphcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHN0cmluZz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU3MgogICAgLy8gbGV0IHBsdWdpbnM6IFBsdWdpbkluZm9bXSA9IFtdCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAoKYXJjNThfZ2V0TmFtZWRQbHVnaW5zX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTczCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBkaWcgNQogICAgPAogICAgZHVwCiAgICBidXJ5IDgKICAgIGJ6IGFyYzU4X2dldE5hbWVkUGx1Z2luc19hZnRlcl93aGlsZUAxMwogICAgZGlnIDYKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzQKICAgIC8vIGlmICh0aGlzLm5hbWVkUGx1Z2lucyhuYW1lc1tpXSkuZXhpc3RzKSB7CiAgICBkaWcgNQogICAgZGlnIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gbmFtZWRQbHVnaW5zID0gQm94TWFwPHN0cmluZywgUGx1Z2luS2V5Pih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4TmFtZWRQbHVnaW5zIH0pOwogICAgYnl0ZWMgMTUgLy8gIm4iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTc0CiAgICAvLyBpZiAodGhpcy5uYW1lZFBsdWdpbnMobmFtZXNbaV0pLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTc1CiAgICAvLyBjb25zdCBuYW1lS2V5ID0gY2xvbmUodGhpcy5uYW1lZFBsdWdpbnMobmFtZXNbaV0pLnZhbHVlKQogICAgZGlnIDEwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTc2CiAgICAvLyBpZiAodGhpcy5wbHVnaW5zKG5hbWVLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTc3CiAgICAvLyBwbHVnaW5zLnB1c2godGhpcy5wbHVnaW5zKG5hbWVLZXkpLnZhbHVlKQogICAgZGlnIDkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSA5CgphcmM1OF9nZXROYW1lZFBsdWdpbnNfYmxvY2tAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDgKICAgIGIgYXJjNThfZ2V0TmFtZWRQbHVnaW5zX3doaWxlX3RvcEA2CgphcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4MAogICAgLy8gcGx1Z2lucy5wdXNoKGVtcHR5UGx1Z2luSW5mbygpKQogICAgY2FsbHN1YiBlbXB0eVBsdWdpbkluZm8KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4MQogICAgLy8gY29udGludWUKICAgIGIgYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2Jsb2NrQDEyCgphcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU4MwogICAgLy8gcGx1Z2lucy5wdXNoKGVtcHR5UGx1Z2luSW5mbygpKQogICAgY2FsbHN1YiBlbXB0eVBsdWdpbkluZm8KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDkKICAgIGIgYXJjNThfZ2V0TmFtZWRQbHVnaW5zX2Jsb2NrQDEyCgphcmM1OF9nZXROYW1lZFBsdWdpbnNfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgOQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9nZXRFc2Nyb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfZ2V0RXNjcm93czoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTk0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCmFyYzU4X2dldEVzY3Jvd3NfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTk0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFyYzU4X2dldEVzY3Jvd3NfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisobGVuK3V0ZjhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGFyYzU4X2dldEVzY3Jvd3NfZm9yX2hlYWRlckAxCgphcmM1OF9nZXRFc2Nyb3dzX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTk0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzdHJpbmc+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTYKICAgIC8vIGxldCByZXN1bHQ6IEVzY3Jvd0luZm9bXSA9IFtdCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBlc2Nyb3dzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgphcmM1OF9nZXRFc2Nyb3dzX3doaWxlX3RvcEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTk3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZXNjcm93cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDcKICAgIGRpZyA1CiAgICA8CiAgICBkdXAKICAgIGJ1cnkgOAogICAgYnogYXJjNThfZ2V0RXNjcm93c19hZnRlcl93aGlsZUAxMQogICAgZGlnIDYKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTgKICAgIC8vIGlmICh0aGlzLmVzY3Jvd3MoZXNjcm93c1tpXSkuZXhpc3RzKSB7CiAgICBkaWcgNQogICAgZGlnIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5OAogICAgLy8gaWYgKHRoaXMuZXNjcm93cyhlc2Nyb3dzW2ldKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjNThfZ2V0RXNjcm93c19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5OQogICAgLy8gcmVzdWx0LnB1c2godGhpcy5lc2Nyb3dzKGVzY3Jvd3NbaV0pLnZhbHVlKQogICAgZGlnIDkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkaWcgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5OQogICAgLy8gcmVzdWx0LnB1c2godGhpcy5lc2Nyb3dzKGVzY3Jvd3NbaV0pLnZhbHVlKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICByZXBsYWNlMiAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgOQoKYXJjNThfZ2V0RXNjcm93c19ibG9ja0AxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTU5NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGVzY3Jvd3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA4CiAgICBiIGFyYzU4X2dldEVzY3Jvd3Nfd2hpbGVfdG9wQDYKCmFyYzU4X2dldEVzY3Jvd3NfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MDIKICAgIC8vIHJlc3VsdC5wdXNoKGVtcHR5RXNjcm93SW5mbygpKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICByZXBsYWNlMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czoyMi0yNQogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgaWQ6IDAsCiAgICAvLyAgIGxvY2tlZDogZmFsc2UKICAgIC8vIH07CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGNvbmNhdAogICAgYnVyeSA5CiAgICBiIGFyYzU4X2dldEVzY3Jvd3NfYmxvY2tAMTAKCmFyYzU4X2dldEVzY3Jvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE1OTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgOQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9nZXRBbGxvd2FuY2VzW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjNThfZ2V0QWxsb3dhbmNlczoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTYKICAgIC8vIGxldCByZXN1bHQ6IEFsbG93YW5jZUluZm9bXSA9IFtdCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYxNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmFyYzU4X2dldEFsbG93YW5jZXNfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IGFyYzU4X2dldEFsbG93YW5jZXNfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjE4CiAgICAvLyBjb25zdCBrZXk6IEFsbG93YW5jZUtleSA9IHsgZXNjcm93LCBhc3NldDogYXNzZXRzW2ldIH0KICAgIGRpZyA0CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIDB4MDAwYQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzIKICAgIC8vIGFsbG93YW5jZXMgPSBCb3hNYXA8QWxsb3dhbmNlS2V5LCBBbGxvd2FuY2VJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4QWxsb3dhbmNlcyB9KSAvLyAzOF81MDAKICAgIGJ5dGVjIDE5IC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjE5CiAgICAvLyBpZiAodGhpcy5hbGxvd2FuY2VzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzU4X2dldEFsbG93YW5jZXNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MjAKICAgIC8vIHJlc3VsdC5wdXNoKHRoaXMuYWxsb3dhbmNlcyhrZXkpLnZhbHVlKQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkaWcgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyMAogICAgLy8gcmVzdWx0LnB1c2godGhpcy5hbGxvd2FuY2VzKGtleSkudmFsdWUpCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIHJlcGxhY2UyIDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAyCgphcmM1OF9nZXRBbGxvd2FuY2VzX2Jsb2NrQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXRBbGxvd2FuY2VzX3doaWxlX3RvcEAyCgphcmM1OF9nZXRBbGxvd2FuY2VzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3V0aWxzLnRzOjMwCiAgICAvLyB0eXBlOiB1aW50OCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHVpbnQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC91dGlscy50czoyOS0zOAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgdHlwZTogdWludDgoMCksCiAgICAvLyAgIG1heDogMCwKICAgIC8vICAgYW1vdW50OiAwLAogICAgLy8gICBzcGVudDogMCwKICAgIC8vICAgaW50ZXJ2YWw6IDAsCiAgICAvLyAgIGxhc3Q6IDAsCiAgICAvLyAgIHN0YXJ0OiAwLAogICAgLy8gICB1c2VSb3VuZHM6IGZhbHNlCiAgICAvLyB9OwogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYyMwogICAgLy8gcmVzdWx0LnB1c2goZW1wdHlBbGxvd2FuY2VJbmZvKCkpCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIHJlcGxhY2UyIDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICBiIGFyYzU4X2dldEFsbG93YW5jZXNfYmxvY2tANgoKYXJjNThfZ2V0QWxsb3dhbmNlc19hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjE0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0RXhlY3V0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldEV4ZWN1dGlvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGJ5dGVzWzMyXT4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYzNgogICAgLy8gbGV0IHJlc3VsdDogRXhlY3V0aW9uSW5mb1tdID0gW10KICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBsZWFzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXRFeGVjdXRpb25zX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjM3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVhc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiBhcmM1OF9nZXRFeGVjdXRpb25zX2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTYzOAogICAgLy8gaWYgKHRoaXMuZXhlY3V0aW9ucyhsZWFzZXNbaV0pLmV4aXN0cykgewogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgcHVzaGludCAzMgogICAgKgogICAgcHVzaGludCAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjM4CiAgICAvLyBpZiAodGhpcy5leGVjdXRpb25zKGxlYXNlc1tpXSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzU4X2dldEV4ZWN1dGlvbnNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MzkKICAgIC8vIHJlc3VsdC5wdXNoKHRoaXMuZXhlY3V0aW9ucyhsZWFzZXNbaV0pLnZhbHVlKQogICAgZGlnIDQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBieXRlYyAxMyAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAyCgphcmM1OF9nZXRFeGVjdXRpb25zX2Jsb2NrQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2MzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBsZWFzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBhcmM1OF9nZXRFeGVjdXRpb25zX3doaWxlX3RvcEAyCgphcmM1OF9nZXRFeGVjdXRpb25zX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY0MgogICAgLy8gcmVzdWx0LnB1c2goZW1wdHlFeGVjdXRpb25JbmZvKCkpCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAyCiAgICBiIGFyYzU4X2dldEV4ZWN1dGlvbnNfYmxvY2tANgoKYXJjNThfZ2V0RXhlY3V0aW9uc19hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfZ2V0RG9tYWluS2V5c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzU4X2dldERvbWFpbktleXM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjUzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFjY291bnQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NTUKICAgIC8vIGxldCByZXN1bHQ6IHN0cmluZ1tdID0gW10KICAgIGJ5dGVjIDcgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgphcmM1OF9nZXREb21haW5LZXlzX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjU2CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiBhcmM1OF9nZXREb21haW5LZXlzX2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY1NwogICAgLy8gaWYgKHRoaXMuZG9tYWluS2V5cyhhZGRyZXNzZXNbaV0pLmV4aXN0cykgewogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgcHVzaGludCAzMgogICAgKgogICAgcHVzaGludCAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gZG9tYWluS2V5cyA9IEJveE1hcDxBY2NvdW50LCBzdHJpbmc+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhEb21haW5LZXlzIH0pCiAgICBieXRlYyAxNyAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY1NwogICAgLy8gaWYgKHRoaXMuZG9tYWluS2V5cyhhZGRyZXNzZXNbaV0pLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmM1OF9nZXREb21haW5LZXlzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjU4CiAgICAvLyByZXN1bHQucHVzaCh0aGlzLmRvbWFpbktleXMoYWRkcmVzc2VzW2ldKS52YWx1ZSkKICAgIGRpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBidXJ5IDIKCmFyYzU4X2dldERvbWFpbktleXNfYmxvY2tANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY1NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGFyYzU4X2dldERvbWFpbktleXNfd2hpbGVfdG9wQDIKCmFyYzU4X2dldERvbWFpbktleXNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYxCiAgICAvLyByZXN1bHQucHVzaCgiIikKICAgIGRpZyAxCiAgICBieXRlYyA3IC8vIDB4MDAwMAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgYnVyeSAyCiAgICBiIGFyYzU4X2dldERvbWFpbktleXNfYmxvY2tANgoKYXJjNThfZ2V0RG9tYWluS2V5c19hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjUzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQubWJyW3JvdXRpbmddKCkgLT4gdm9pZDoKbWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjc1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIHJldHVybiBNaW5Fc2Nyb3dzTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBkaWcgMwogICAgbGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICBpbnRjIDQgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gcmV0dXJuIE1pbkVzY3Jvd3NNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIHB1c2hpbnQgNjUwMAogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4NQogICAgLy8gcGx1Z2luczogdGhpcy5wbHVnaW5zTWJyKGVzY3JvdywgbWV0aG9kQ291bnQpLAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBwbHVnaW5zTWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gcmV0dXJuIE1pbk5hbWVkUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMobmFtZSkubGVuZ3RoKQogICAgdW5jb3ZlciA0CiAgICBsZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyByZXR1cm4gQm94Q29zdFBlckJ5dGUgKiBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyByZXR1cm4gTWluTmFtZWRQbHVnaW5NQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhuYW1lKS5sZW5ndGgpCiAgICBpbnRjIDUgLy8gMTg5MDAKICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcmV0dXJuIE1pbkFsbG93YW5jZU1CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgaW50YyA2IC8vIDI3NzAwCiAgICB1bmNvdmVyIDUKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gTWluRG9tYWluS2V5c01CUiArIHRoaXMuX2NhbGNCQ1BCKEJ5dGVzKGRvbWFpbikubGVuZ3RoKQogICAgcHVzaGludCAxNTcwMAogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICB1bmNvdmVyIDUKICAgIHB1c2hpbnQgMTI4MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyByZXR1cm4gTWluRXhlY3V0aW9uc01CUiArIHRoaXMuX2NhbGNCQ1BCKGdyb3VwcyAqIDMyKQogICAgcHVzaGludCAyMDUwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OTEKICAgIC8vIGVzY3Jvd0V4aXN0czogdGhpcy5lc2Nyb3dzKGVzY3JvdykuZXhpc3RzLAogICAgYm94X2xlbgogICAgY292ZXIgNgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OTQKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlICsKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OTMtMTY5NQogICAgLy8gTmV3Q29zdEZvckFSQzU4ICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlICsKICAgIC8vIEFSQzU4V2FsbGV0SURzQnlBY2NvdW50c01iciArCiAgICBwdXNoaW50IDE2MjEwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjkzLTE2OTYKICAgIC8vIE5ld0Nvc3RGb3JBUkM1OCArCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZSArCiAgICAvLyBBUkM1OFdhbGxldElEc0J5QWNjb3VudHNNYnIgKwogICAgLy8gZXNjcm93cwogICAgZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY4NC0xNjk4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBwbHVnaW5zOiB0aGlzLnBsdWdpbnNNYnIoZXNjcm93LCBtZXRob2RDb3VudCksCiAgICAvLyAgIG5hbWVkUGx1Z2luczogdGhpcy5uYW1lZFBsdWdpbnNNYnIocGx1Z2luKSwKICAgIC8vICAgZXNjcm93cywKICAgIC8vICAgYWxsb3dhbmNlczogdGhpcy5hbGxvd2FuY2VzTWJyKGVzY3JvdyksCiAgICAvLyAgIGRvbWFpbktleXM6IHRoaXMuZG9tYWluS2V5c01icihwbHVnaW4pLAogICAgLy8gICBleGVjdXRpb25zOiB0aGlzLmV4ZWN1dGlvbnNNYnIoZ3JvdXBzKSwKICAgIC8vICAgZXNjcm93RXhpc3RzOiB0aGlzLmVzY3Jvd3MoZXNjcm93KS5leGlzdHMsCiAgICAvLyAgIG5ld0VzY3Jvd01pbnRDb3N0OiAoCiAgICAvLyAgICAgTmV3Q29zdEZvckFSQzU4ICsKICAgIC8vICAgICBHbG9iYWwubWluQmFsYW5jZSArCiAgICAvLyAgICAgQVJDNThXYWxsZXRJRHNCeUFjY291bnRzTWJyICsKICAgIC8vICAgICBlc2Nyb3dzCiAgICAvLyAgICkKICAgIC8vIH0KICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY3NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuX3JlcXVpcmVBZG1pbigpIC0+IHZvaWQ6Cl9yZXF1aXJlQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuaXNBZG1pbigpLCBFUlJfQURNSU5fT05MWSkKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IF9yZXF1aXJlQWRtaW5fYWZ0ZXJfYXNzZXJ0QDIKICAgIGJ5dGVjIDM2IC8vICJFUlI6QURNTiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBRE1OCgpfcmVxdWlyZUFkbWluX2FmdGVyX2Fzc2VydEAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuX3JlcXVpcmVBZG1pbk9yUmV2b2tlKCkgLT4gdm9pZDoKX3JlcXVpcmVBZG1pbk9yUmV2b2tlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSB8fCB0aGlzLmNhblJldm9rZSgpLCBFUlJfT05MWV9BRE1JTl9PUl9SRVZPQ0FUSU9OX0FQUF9DQU5fUkVNT1ZFX1BMVUdJTikKICAgIGNhbGxzdWIgaXNBZG1pbgogICAgYm56IF9yZXF1aXJlQWRtaW5PclJldm9rZV9ib29sX3RydWVAMgogICAgY2FsbHN1YiBjYW5SZXZva2UKICAgIGJ6IF9yZXF1aXJlQWRtaW5PclJldm9rZV9ib29sX2ZhbHNlQDMKCl9yZXF1aXJlQWRtaW5PclJldm9rZV9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpfcmVxdWlyZUFkbWluT3JSZXZva2VfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmlzQWRtaW4oKSB8fCB0aGlzLmNhblJldm9rZSgpLCBFUlJfT05MWV9BRE1JTl9PUl9SRVZPQ0FUSU9OX0FQUF9DQU5fUkVNT1ZFX1BMVUdJTikKICAgIGJueiBfcmVxdWlyZUFkbWluT3JSZXZva2VfYWZ0ZXJfYXNzZXJ0QDYKICAgIHB1c2hieXRlcyAiRVJSOk9BUlAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T0FSUAoKX3JlcXVpcmVBZG1pbk9yUmV2b2tlX2FmdGVyX2Fzc2VydEA2OgogICAgcmV0c3ViCgpfcmVxdWlyZUFkbWluT3JSZXZva2VfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JlcXVpcmVBZG1pbk9yUmV2b2tlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9yZXF1aXJlRXNjcm93KGVzY3JvdzogYnl0ZXMpIC0+IHZvaWQ6Cl9yZXF1aXJlRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIHByaXZhdGUgX3JlcXVpcmVFc2Nyb3coZXNjcm93OiBzdHJpbmcpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXNjcm93cyhlc2Nyb3cpLmV4aXN0cywgRVJSX0VTQ1JPV19ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9yZXF1aXJlRXNjcm93X2FmdGVyX2Fzc2VydEAyCiAgICBwdXNoYnl0ZXMgIkVSUjpORVNDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5FU0MKCl9yZXF1aXJlRXNjcm93X2FmdGVyX2Fzc2VydEAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuX3JlcXVpcmVVbmxvY2tlZEVzY3Jvdyhlc2Nyb3c6IGJ5dGVzKSAtPiB2b2lkOgpfcmVxdWlyZVVubG9ja2VkRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMjUKICAgIC8vIHByaXZhdGUgX3JlcXVpcmVVbmxvY2tlZEVzY3Jvdyhlc2Nyb3c6IHN0cmluZyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmxvY2tlZCwgRVJSX0VTQ1JPV19MT0NLRUQpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcHVzaGludCA2NAogICAgZ2V0Yml0CiAgICBieiBfcmVxdWlyZVVubG9ja2VkRXNjcm93X2FmdGVyX2Fzc2VydEAyCiAgICBwdXNoYnl0ZXMgIkVSUjpFU0NMIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVTQ0wKCl9yZXF1aXJlVW5sb2NrZWRFc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5fcmVxdWlyZVBsdWdpbihrZXk6IGJ5dGVzKSAtPiBieXRlczoKX3JlcXVpcmVQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzMAogICAgLy8gcHJpdmF0ZSBfcmVxdWlyZVBsdWdpbihrZXk6IFBsdWdpbktleSk6IHZvaWQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gcGx1Z2lucyA9IEJveE1hcDxQbHVnaW5LZXksIFBsdWdpbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhQbHVnaW5zIH0pOwogICAgYnl0ZWNfMiAvLyAicCIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cywgRVJSX1BMVUdJTl9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9yZXF1aXJlUGx1Z2luX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlYyAyNyAvLyAiRVJSOk5QTEciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TlBMRwoKX3JlcXVpcmVQbHVnaW5fYWZ0ZXJfYXNzZXJ0QDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9wYXlNYnJGcm9tQ29udHJvbGxlZChhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKX3BheU1ickZyb21Db250cm9sbGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIHByaXZhdGUgX3BheU1ickZyb21Db250cm9sbGVkKGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyBpZiAodGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gaWYgKHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgIT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgICE9CiAgICBieiBfcGF5TWJyRnJvbUNvbnRyb2xsZWRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjM3LTI0MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjM3LTI0MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKX3BheU1ickZyb21Db250cm9sbGVkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9yZWZ1bmRNYnJUb0NvbnRyb2xsZWQoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6Cl9yZWZ1bmRNYnJUb0NvbnRyb2xsZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gcHJpdmF0ZSBfcmVmdW5kTWJyVG9Db250cm9sbGVkKGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjQ5CiAgICAvLyBpZiAodGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gaWYgKHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgIT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgICE9CiAgICBieiBfcmVmdW5kTWJyVG9Db250cm9sbGVkX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNTAtMjU1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjUwLTI1NAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYW1vdW50CiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI1MC0yNTUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpfcmVmdW5kTWJyVG9Db250cm9sbGVkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnBsdWdpbnNNYnIoZXNjcm93OiBieXRlcywgbWV0aG9kQ291bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpwbHVnaW5zTWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjMKICAgIC8vIHByaXZhdGUgcGx1Z2luc01icihlc2Nyb3c6IHN0cmluZywgbWV0aG9kQ291bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjY0CiAgICAvLyByZXR1cm4gTWluUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoKE1ldGhvZFJlc3RyaWN0aW9uQnl0ZUxlbmd0aCAqIG1ldGhvZENvdW50KSArIEJ5dGVzKGVzY3JvdykubGVuZ3RoKQogICAgcHVzaGludCAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIHJldHVybiBCb3hDb3N0UGVyQnl0ZSAqIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyNjQKICAgIC8vIHJldHVybiBNaW5QbHVnaW5NQlIgKyB0aGlzLl9jYWxjQkNQQigoTWV0aG9kUmVzdHJpY3Rpb25CeXRlTGVuZ3RoICogbWV0aG9kQ291bnQpICsgQnl0ZXMoZXNjcm93KS5sZW5ndGgpCiAgICBwdXNoaW50IDM4OTAwCiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5uZXdFc2Nyb3coZXNjcm93OiBieXRlcykgLT4gdWludDY0OgpuZXdFc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gcHJpdmF0ZSBuZXdFc2Nyb3coZXNjcm93OiBzdHJpbmcpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gcmV0dXJuIE1pbkVzY3Jvd3NNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICBpbnRjIDQgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gcmV0dXJuIE1pbkVzY3Jvd3NNQlIgKyB0aGlzLl9jYWxjQkNQQihCeXRlcyhlc2Nyb3cpLmxlbmd0aCkKICAgIHB1c2hpbnQgNjUwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIHRoaXMuX3BheU1ickZyb21Db250cm9sbGVkKHRoaXMuZXNjcm93c01icihlc2Nyb3cpKQogICAgY2FsbHN1YiBfcGF5TWJyRnJvbUNvbnRyb2xsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzAwLTMxMAogICAgLy8gY29uc3QgaWQgPSBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5uZXc+KHsKICAgIC8vICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICBhcHBJZDogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICAgIGFtb3VudDogTmV3Q29zdEZvckFSQzU4ICsgR2xvYmFsLm1pbkJhbGFuY2UsCiAgICAvLyAgICAgICByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MKICAgIC8vICAgICB9KSwKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMDUKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gYW1vdW50OiBOZXdDb3N0Rm9yQVJDNTggKyBHbG9iYWwubWluQmFsYW5jZSwKICAgIHB1c2hpbnQgMTUwMDAwCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmVzY3Jvd0ZhY3RvcnkudmFsdWUuYWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTUxCiAgICAvLyBlc2Nyb3dGYWN0b3J5ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNFc2Nyb3dGYWN0b3J5IH0pCiAgICBieXRlYyAyMyAvLyAiZXNjcm93X2ZhY3RvcnkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMwNC0zMDgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYW1vdW50OiBOZXdDb3N0Rm9yQVJDNTggKyBHbG9iYWwubWluQmFsYW5jZSwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMuZXNjcm93RmFjdG9yeS52YWx1ZS5hZGRyZXNzCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzAwLTMxMAogICAgLy8gY29uc3QgaWQgPSBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5uZXc+KHsKICAgIC8vICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICBhcHBJZDogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICAgIGFtb3VudDogTmV3Q29zdEZvckFSQzU4ICsgR2xvYmFsLm1pbkJhbGFuY2UsCiAgICAvLyAgICAgICByZWNlaXZlcjogdGhpcy5lc2Nyb3dGYWN0b3J5LnZhbHVlLmFkZHJlc3MKICAgIC8vICAgICB9KSwKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgcHVzaGJ5dGVzIDB4ZDg1Y2YxODQgLy8gbWV0aG9kICJuZXcocGF5KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gdGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWUgPSB7IGlkLCBsb2NrZWQ6IGZhbHNlIH0KICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlID0geyBpZCwgbG9ja2VkOiBmYWxzZSB9CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gcmV0dXJuIGlkOwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuaXNBZG1pbigpIC0+IHVpbnQ2NDoKaXNBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlIHx8CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0FkbWluIH0pCiAgICBieXRlYyAxNCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSB8fAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMC0zMjEKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUgfHwKICAgIC8vICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICBibnogaXNBZG1pbl9ib29sX3RydWVAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGRvbWFpbktleXMgPSBCb3hNYXA8QWNjb3VudCwgc3RyaW5nPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RG9tYWluS2V5cyB9KQogICAgYnl0ZWMgMTcgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gKHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS5leGlzdHMgJiYgdGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLnZhbHVlID09PSB0aGlzLmRvbWFpbi52YWx1ZSkKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyBkb21haW5LZXlzID0gQm94TWFwPEFjY291bnQsIHN0cmluZz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeERvbWFpbktleXMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGlzQWRtaW5fYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gZG9tYWluS2V5cyA9IEJveE1hcDxBY2NvdW50LCBzdHJpbmc+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhEb21haW5LZXlzIH0pCiAgICBieXRlYyAxNyAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzIxCiAgICAvLyAodGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLmV4aXN0cyAmJiB0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikudmFsdWUgPT09IHRoaXMuZG9tYWluLnZhbHVlKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGRvbWFpbktleXMgPSBCb3hNYXA8QWNjb3VudCwgc3RyaW5nPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RG9tYWluS2V5cyB9KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gKHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS5leGlzdHMgJiYgdGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLnZhbHVlID09PSB0aGlzLmRvbWFpbi52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGRvbWFpbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0RvbWFpbiB9KTsKICAgIGJ5dGVjIDIyIC8vICJkb21haW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gKHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS5leGlzdHMgJiYgdGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLnZhbHVlID09PSB0aGlzLmRvbWFpbi52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYnogaXNBZG1pbl9ib29sX2ZhbHNlQDQKCmlzQWRtaW5fYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozMTktMzIyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlIHx8CiAgICAvLyAgICh0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikuZXhpc3RzICYmIHRoaXMuZG9tYWluS2V5cyhUeG4uc2VuZGVyKS52YWx1ZSA9PT0gdGhpcy5kb21haW4udmFsdWUpCiAgICAvLyApCiAgICByZXRzdWIKCmlzQWRtaW5fYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzE5LTMyMgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSB8fAogICAgLy8gICAodGhpcy5kb21haW5LZXlzKFR4bi5zZW5kZXIpLmV4aXN0cyAmJiB0aGlzLmRvbWFpbktleXMoVHhuLnNlbmRlcikudmFsdWUgPT09IHRoaXMuZG9tYWluLnZhbHVlKQogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuY2FuUmV2b2tlKCkgLT4gdWludDY0OgpjYW5SZXZva2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgPT09IHRoaXMucmV2b2NhdGlvbi52YWx1ZS5hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIHJldm9jYXRpb24gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5UmV2b2NhdGlvbiB9KQogICAgYnl0ZWMgMjQgLy8gInJldm9jYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgPT09IHRoaXMucmV2b2NhdGlvbi52YWx1ZS5hZGRyZXNzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnJlc29sdmVDYWxsZXJUeXBlKHR5cGU6IHVpbnQ2NCwgYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpyZXNvbHZlQ2FsbGVyVHlwZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBwcml2YXRlIHJlc29sdmVDYWxsZXJUeXBlKHR5cGU6IHVpbnQ2NCwgYWRkcmVzczogQWNjb3VudCk6IEFjY291bnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gaWYgKHR5cGUgPT09IENhbGxlclR5cGVHbG9iYWwpIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiByZXNvbHZlQ2FsbGVyVHlwZV9hZnRlcl9pZl9lbHNlQDIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgpyZXNvbHZlQ2FsbGVyVHlwZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gaWYgKHR5cGUgPT09IENhbGxlclR5cGVBZG1pbikgcmV0dXJuIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYnogcmVzb2x2ZUNhbGxlclR5cGVfYWZ0ZXJfaWZfZWxzZUA0CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgcmV0c3ViCgpyZXNvbHZlQ2FsbGVyVHlwZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gcmV0dXJuIGFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQudHhuUmVrZXlzQmFjayh0eG46IHVpbnQ2NCkgLT4gdWludDY0Ogp0eG5SZWtleXNCYWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIHByaXZhdGUgdHhuUmVrZXlzQmFjayh0eG46IGd0eG4uVHJhbnNhY3Rpb24pOiBib29sZWFuIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIHR4bi5zZW5kZXIgPT09IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgJiYKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIHR4bi5zZW5kZXIgPT09IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUgJiYKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjktMzcwCiAgICAvLyB0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmCiAgICAvLyB0eG4ucmVrZXlUbyA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGJ6IHR4blJla2V5c0JhY2tfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gdHhuLnJla2V5VG8gPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNjktMzcwCiAgICAvLyB0eG4uc2VuZGVyID09PSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlICYmCiAgICAvLyB0eG4ucmVrZXlUbyA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGJ6IHR4blJla2V5c0JhY2tfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gcmV0dXJuIHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgp0eG5SZWtleXNCYWNrX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzc2CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzYtMzc3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGJ6IHR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzYtMzc3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGJ6IHR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3OAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3Ni0zNzgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDEKICAgIGJ6IHR4blJla2V5c0JhY2tfYm9vbF9mYWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3OQogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzYtMzc5CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiB0eG5SZWtleXNCYWNrX2Jvb2xfZmFsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozODAKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDI4IC8vIG1ldGhvZCAiYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzYtMzgwCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3RvcignYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQnKQogICAgYnogdHhuUmVrZXlzQmFja19ib29sX2ZhbHNlQDkKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjM3NS0zODEKICAgIC8vIHJldHVybiAoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAxCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IoJ2FyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkJykKICAgIC8vICkKICAgIHJldHN1YgoKdHhuUmVrZXlzQmFja19ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozNzUtMzgxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMQogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKCdhcmM1OF92ZXJpZnlBdXRoQWRkcmVzcygpdm9pZCcpCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5pc09uQ29vbGRvd24oZXBvY2hSZWY6IHVpbnQ2NCwgbGFzdENhbGxlZDogdWludDY0LCBjb29sZG93bjogdWludDY0KSAtPiB1aW50NjQ6CmlzT25Db29sZG93bjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mzk4CiAgICAvLyBwcml2YXRlIGlzT25Db29sZG93bihlcG9jaFJlZjogdWludDY0LCBsYXN0Q2FsbGVkOiB1aW50NjQsIGNvb2xkb3duOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGlmIChjb29sZG93biA9PT0gMCB8fCBsYXN0Q2FsbGVkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGlzT25Db29sZG93bl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IGlzT25Db29sZG93bl9hZnRlcl9pZl9lbHNlQDMKCmlzT25Db29sZG93bl9pZl9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgppc09uQ29vbGRvd25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MDMKICAgIC8vIGlmIChlcG9jaFJlZiA8IGxhc3RDYWxsZWQpIHsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiBpc09uQ29vbGRvd25fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gcmV0dXJuIHRydWUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzT25Db29sZG93bl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gcmV0dXJuIChlcG9jaFJlZiAtIGxhc3RDYWxsZWQpIDwgY29vbGRvd24KICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LnBsdWdpbkNoZWNrKGtleTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKcGx1Z2luQ2hlY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gcHJpdmF0ZSBwbHVnaW5DaGVjayhrZXk6IFBsdWdpbktleSk6IFBsdWdpblZhbGlkYXRpb24gewogICAgcHJvdG8gMSAyCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIGNvbnN0IGV4aXN0cyA9IHRoaXMucGx1Z2lucyhrZXkpLmV4aXN0czsKICAgIGJveF9sZW4KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBpZiAoIWV4aXN0cykgewogICAgYm56IHBsdWdpbkNoZWNrX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MTQtNDE5CiAgICAvLyByZXR1cm4gewogICAgLy8gICBleGlzdHM6IGZhbHNlLAogICAgLy8gICBleHBpcmVkOiB0cnVlLAogICAgLy8gICBvbkNvb2xkb3duOiB0cnVlLAogICAgLy8gICBoYXNNZXRob2RSZXN0cmljdGlvbnM6IGZhbHNlLAogICAgLy8gfQogICAgcHVzaGJ5dGVzIDB4NjAKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGx1Z2luQ2hlY2tfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGNvbnN0IHsgdXNlUm91bmRzLCBsYXN0VmFsaWQsIGNvb2xkb3duLCBsYXN0Q2FsbGVkLCBtZXRob2RzIH0gPSB0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZSBhcyBSZWFkb25seTxQbHVnaW5JbmZvPgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA5CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBwdXNoaW50IDE3CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBwdXNoaW50IDI3CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgMjgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgYnogcGx1Z2luQ2hlY2tfdGVybmFyeV9mYWxzZUA0CiAgICBnbG9iYWwgUm91bmQKCnBsdWdpbkNoZWNrX3Rlcm5hcnlfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDI3CiAgICAvLyBleHBpcmVkOiBlcG9jaFJlZiA+IGxhc3RWYWxpZCwKICAgIGR1cAogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDI4CiAgICAvLyBvbkNvb2xkb3duOiB0aGlzLmlzT25Db29sZG93bihlcG9jaFJlZiwgbGFzdENhbGxlZCwgY29vbGRvd24pLAogICAgc3dhcAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBjYWxsc3ViIGlzT25Db29sZG93bgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0MjkKICAgIC8vIGhhc01ldGhvZFJlc3RyaWN0aW9uczogbWV0aG9kcy5sZW5ndGggPiAwLAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgNDQKICAgIGludGNfMiAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDI1LTQzMAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZXhpc3RzLAogICAgLy8gICBleHBpcmVkOiBlcG9jaFJlZiA+IGxhc3RWYWxpZCwKICAgIC8vICAgb25Db29sZG93bjogdGhpcy5pc09uQ29vbGRvd24oZXBvY2hSZWYsIGxhc3RDYWxsZWQsIGNvb2xkb3duKSwKICAgIC8vICAgaGFzTWV0aG9kUmVzdHJpY3Rpb25zOiBtZXRob2RzLmxlbmd0aCA+IDAsCiAgICAvLyB9CiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwbHVnaW5DaGVja190ZXJuYXJ5X2ZhbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYiBwbHVnaW5DaGVja190ZXJuYXJ5X21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5vcHRJbkVzY3Jvdyhlc2Nyb3c6IGJ5dGVzLCBhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKb3B0SW5Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gcHJpdmF0ZSBvcHRJbkVzY3Jvdyhlc2Nyb3c6IHN0cmluZywgYXNzZXRzOiB1aW50NjRbXSk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gZXNjcm93cyA9IEJveE1hcDxzdHJpbmcsIEVzY3Jvd0luZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFc2Nyb3dzIH0pCiAgICBieXRlYyA0IC8vICJlIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUwCiAgICAvLyBjb25zdCBlc2Nyb3dBZGRyZXNzID0gQXBwbGljYXRpb24odGhpcy5lc2Nyb3dzKGVzY3JvdykudmFsdWUuaWQpLmFkZHJlc3MKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU1Mi01NTgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NTQKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU1NAogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTU2CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIGFzc2V0cy5sZW5ndGgKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA0CiAgICAqCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTUyLTU1NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NTItNTU4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCm9wdEluRXNjcm93X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogb3B0SW5Fc2Nyb3dfYWZ0ZXJfd2hpbGVANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjEtNTY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBzZW5kZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0c1tpXQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2NgogICAgLy8geGZlckFzc2V0OiBhc3NldHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTY1CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU2MS01NjcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHNlbmRlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXRzW2ldCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjEtNTY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBzZW5kZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0c1tpXQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NjAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhc3NldHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgb3B0SW5Fc2Nyb3dfd2hpbGVfdG9wQDIKCm9wdEluRXNjcm93X2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQucmVjbGFpbShlc2Nyb3c6IGJ5dGVzLCByZWNsYWltczogYnl0ZXMsIGFsbG93Q2xvc2VPdXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnJlY2xhaW06CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU3MgogICAgLy8gcHJpdmF0ZSByZWNsYWltKGVzY3Jvdzogc3RyaW5nLCByZWNsYWltczogRXNjcm93UmVjbGFpbVtdLCBhbGxvd0Nsb3NlT3V0OiBib29sZWFuKTogdm9pZCB7CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBlc2Nyb3dzID0gQm94TWFwPHN0cmluZywgRXNjcm93SW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEVzY3Jvd3MgfSkKICAgIGJ5dGVjIDQgLy8gImUiCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzMKICAgIC8vIGNvbnN0IHNlbmRlciA9IEFwcGxpY2F0aW9uKHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmlkKS5hZGRyZXNzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU3NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJlY2xhaW1zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKcmVjbGFpbV93aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA3CiAgICA+CiAgICBieiByZWNsYWltX2FmdGVyX3doaWxlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU3NgogICAgLy8gaWYgKHJlY2xhaW1zW2ldLmFzc2V0ID09PSAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNwogICAgcHVzaGludCAxNwogICAgKgogICAgcHVzaGludCAxNwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgYm56IHJlY2xhaW1fZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc3LTU4MQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYW1vdW50OiByZWNsYWltc1tpXS5hbW91bnQKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NzkKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc5CiAgICAvLyByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4MAogICAgLy8gYW1vdW50OiByZWNsYWltc1tpXS5hbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgNgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc3LTU4MQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYW1vdW50OiByZWNsYWltc1tpXS5hbW91bnQKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCnJlY2xhaW1fYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTc1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA3CiAgICBiIHJlY2xhaW1fd2hpbGVfdG9wQDEKCnJlY2xhaW1fZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4NQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gY29udHJvbGxlZEFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MgfSk7CiAgICBieXRlY18xIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4NQogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTg2CiAgICAvLyBhc3NldEFtb3VudDogcmVjbGFpbXNbaV0uYW1vdW50LAogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU4MwogICAgLy8gY29uc3QgeGZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjU5MAogICAgLy8gaWYgKGFsbG93Q2xvc2VPdXQgJiYgcmVjbGFpbXNbaV0uY2xvc2VPdXQpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogcmVjbGFpbV9hZnRlcl9pZl9lbHNlQDgKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDEyOAogICAgZ2V0Yml0CiAgICBieiByZWNsYWltX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIHhmZXIuc2V0KHsgYXNzZXRDbG9zZVRvOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyB4ZmVyLnNldCh7IGFzc2V0Q2xvc2VUbzogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSB9KTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDUKCnJlY2xhaW1fYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIHhmZXIuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgNAogICAgYnogcmVjbGFpbV9uZXh0X2ZpZWxkQDEwCiAgICBmcmFtZV9kaWcgNQogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KCnJlY2xhaW1fbmV4dF9maWVsZEAxMDoKICAgIGZyYW1lX2RpZyAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyA2CiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1ODMtNTg4CiAgICAvLyBjb25zdCB4ZmVyID0gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogcmVjbGFpbXNbaV0uYW1vdW50LAogICAgLy8gICB4ZmVyQXNzZXQ6IHJlY2xhaW1zW2ldLmFzc2V0CiAgICAvLyB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyB4ZmVyLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIGIgcmVjbGFpbV9hZnRlcl9pZl9lbHNlQDEyCgpyZWNsYWltX2FmdGVyX3doaWxlQDEzOgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW4ocGx1Z2luOiB1aW50NjQsIHR5cGU6IHVpbnQ2NCwgZXNjcm93OiBieXRlcywgbWV0aG9kT2Zmc2V0czogYnl0ZXMsIGZ1bmRzUmVxdWVzdDogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTY0LTk3MAogICAgLy8gYXJjNThfcmVrZXlUb1BsdWdpbigKICAgIC8vICAgcGx1Z2luOiB1aW50NjQsCiAgICAvLyAgIHR5cGU6IHVpbnQ2NCwKICAgIC8vICAgZXNjcm93OiBzdHJpbmcsCiAgICAvLyAgIG1ldGhvZE9mZnNldHM6IHVpbnQ2NFtdLAogICAgLy8gICBmdW5kc1JlcXVlc3Q6IEZ1bmRzUmVxdWVzdFtdCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDUgMgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMTEKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTcyCiAgICAvLyBjb25zdCBjYWxsZXIgPSB0aGlzLnJlc29sdmVDYWxsZXJUeXBlKHR5cGUsIFR4bi5zZW5kZXIpCiAgICBmcmFtZV9kaWcgLTQKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgcmVzb2x2ZUNhbGxlclR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBjb25zdCBrZXk6IFBsdWdpbktleSA9IHsgcGx1Z2luLCBjYWxsZXIsIGVzY3JvdyB9CiAgICBmcmFtZV9kaWcgLTUKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDExIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTc2CiAgICAvLyBpZiAodHlwZSA9PT0gQ2FsbGVyVHlwZUFkbWluKSB7CiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTc3CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKQogICAgY2FsbHN1YiBfcmVxdWlyZUFkbWluCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyB0aGlzLl9yZXF1aXJlUGx1Z2luKGtleSkKICAgIGZyYW1lX2RpZyA0MgogICAgY2FsbHN1YiBfcmVxdWlyZVBsdWdpbgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gY3VycmVudFBsdWdpbiA9IEdsb2JhbFN0YXRlPFBsdWdpbktleT4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0N1cnJlbnRQbHVnaW4gfSkKICAgIGJ5dGVjIDI2IC8vICJjdXJyZW50X3BsdWdpbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTgxCiAgICAvLyB0aGlzLmN1cnJlbnRQbHVnaW4udmFsdWUgPSBjbG9uZShrZXkpCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODIKICAgIC8vIGNvbnN0IHsgZXNjcm93OiBlc2Nyb3dJRCB9ID0gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODQKICAgIC8vIGlmIChlc2Nyb3dJRCAhPT0gMCkgewogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODYKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID0gc3BlbmRpbmdBcHAuYWRkcmVzcwogICAgZnJhbWVfZGlnIDE3CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gc3BlbmRpbmdBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcyB9KQogICAgYnl0ZWMgMTAgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk4NgogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPSBzcGVuZGluZ0FwcC5hZGRyZXNzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYwMAogICAgLy8gY29uc3QgZXNjcm93SUQgPSB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZDsKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjAxCiAgICAvLyBjb25zdCBlc2Nyb3dBZGRyZXNzID0gQXBwbGljYXRpb24oZXNjcm93SUQpLmFkZHJlc3M7CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDIKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjAzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZnVuZHNSZXF1ZXN0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMjAKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fd2hpbGVfdG9wQDk1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBmdW5kc1JlcXVlc3RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgMjAKICAgID4KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYwNwogICAgLy8gYXNzZXQ6IGZ1bmRzUmVxdWVzdHNbaV0uYXNzZXQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyMAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjA1LTYwOAogICAgLy8gY29uc3QgYWxsb3dhbmNlS2V5OiBBbGxvd2FuY2VLZXkgPSB7CiAgICAvLyAgIGVzY3JvdywKICAgIC8vICAgYXNzZXQ6IGZ1bmRzUmVxdWVzdHNbaV0uYXNzZXQKICAgIC8vIH0KICAgIGl0b2IKICAgIGJ5dGVjIDE4IC8vIDB4MDAwYQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzIKICAgIC8vIGFsbG93YW5jZXMgPSBCb3hNYXA8QWxsb3dhbmNlS2V5LCBBbGxvd2FuY2VJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4QWxsb3dhbmNlcyB9KSAvLyAzOF81MDAKICAgIGJ5dGVjIDE5IC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmFsbG93YW5jZXMoa2V5KS5leGlzdHMsIEVSUl9BTExPV0FOQ0VfRE9FU19OT1RfRVhJU1QpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAOTgKICAgIGJ5dGVjIDM0IC8vICJFUlI6TkFMVyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOQUxXCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA5ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjM1CiAgICAvLyBjb25zdCB7IHR5cGUsIHNwZW50LCBhbW91bnQsIGxhc3QsIG1heCwgaW50ZXJ2YWwsIHN0YXJ0LCB1c2VSb3VuZHMgfSA9IHRoaXMuYWxsb3dhbmNlcyhrZXkpLnZhbHVlCiAgICBmcmFtZV9kaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgZXh0cmFjdCAwIDEKICAgIGZyYW1lX2J1cnkgMTEKICAgIGR1cAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMzMKICAgIGR1cAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAxMgogICAgZHVwCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAyMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGR1cAogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMjEKICAgIGR1cAogICAgcHVzaGludCA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMzQKICAgIHB1c2hpbnQgMzkyCiAgICBnZXRiaXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzYKICAgIC8vIGNvbnN0IG5ld0xhc3QgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDEwMAogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9idXJ5IDI5CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMTAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MzgKICAgIC8vIGlmICh0eXBlID09PSBTcGVuZEFsbG93YW5jZVR5cGVGbGF0KSB7CiAgICBmcmFtZV9kaWcgMTEKICAgIGJ5dGVjIDE2IC8vIDB4MDEKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAxMDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjM5CiAgICAvLyBjb25zdCBsZWZ0b3ZlcjogdWludDY0ID0gYW1vdW50IC0gc3BlbnQ7CiAgICBmcmFtZV9kaWcgMTIKICAgIGZyYW1lX2RpZyAzMwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NDAKICAgIC8vIGxvZ2dlZEFzc2VydChsZWZ0b3ZlciA+PSBmdW5kUmVxdWVzdC5hbW91bnQsIEVSUl9BTExPV0FOQ0VfRVhDRUVERUQpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM5CiAgICA+PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDEwNAogICAgYnl0ZWMgMjAgLy8gIkVSUjpBTEVYIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMRVgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDEwNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZS5zcGVudCArPSBmdW5kUmVxdWVzdC5hbW91bnQKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM5CiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDE3CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjY2CiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZS5sYXN0ID0gbmV3TGFzdAogICAgZnJhbWVfZGlnIDI5CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCAzMwogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGlmIChmdW5kc1JlcXVlc3RzW2ldLmFzc2V0ICE9PSAwKSB7CiAgICBmcmFtZV9kaWcgMzcKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDEyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MTMtNjIwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogZXNjcm93QWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogZnVuZHNSZXF1ZXN0c1tpXS5hbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBmdW5kc1JlcXVlc3RzW2ldLmFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGNvbnRyb2xsZWRBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzIH0pOwogICAgYnl0ZWNfMSAvLyAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MTUKICAgIC8vIHNlbmRlcjogdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYxNwogICAgLy8gYXNzZXRBbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50LAogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM3CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjEzLTYxOQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogZnVuZHNSZXF1ZXN0c1tpXS5hc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjEzLTYyMAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGZ1bmRzUmVxdWVzdHNbaV0uYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogZnVuZHNSZXF1ZXN0c1tpXS5hc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjAzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZnVuZHNSZXF1ZXN0cy5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDIwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyMAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEA5NQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MjItNjI4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGVzY3Jvd0FkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBmdW5kc1JlcXVlc3RzW2ldLmFtb3VudAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYyNAogICAgLy8gc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjI0CiAgICAvLyBzZW5kZXI6IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2MjYKICAgIC8vIGFtb3VudDogZnVuZHNSZXF1ZXN0c1tpXS5hbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjIyLTYyNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogZnVuZHNSZXF1ZXN0c1tpXS5hbW91bnQKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjIyLTYyOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiBlc2Nyb3dBZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogZnVuZHNSZXF1ZXN0c1tpXS5hbW91bnQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyMwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NDIKICAgIC8vIH0gZWxzZSBpZiAodHlwZSA9PT0gU3BlbmRBbGxvd2FuY2VUeXBlV2luZG93KSB7CiAgICBmcmFtZV9kaWcgMTEKICAgIHB1c2hieXRlcyAweDAyCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY3MAogICAgLy8gaWYgKHVzZVJvdW5kcykgewogICAgZnJhbWVfZGlnIDQwCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY3MQogICAgLy8gcmV0dXJuIEdsb2JhbC5yb3VuZCAtICgoR2xvYmFsLnJvdW5kIC0gc3RhcnQpICUgaW50ZXJ2YWwpCiAgICBnbG9iYWwgUm91bmQKICAgIGR1cAogICAgZnJhbWVfZGlnIDM0CiAgICAtCiAgICBmcmFtZV9kaWcgMjEKICAgICUKICAgIC0KCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5nZXRMYXRlc3RXaW5kb3dTdGFydEAxMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0NQogICAgLy8gaWYgKGN1cnJlbnRXaW5kb3dTdGFydCA+IGxhc3QpIHsKICAgIGZyYW1lX2RpZyAyMwogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0NgogICAgLy8gbG9nZ2VkQXNzZXJ0KGFtb3VudCA+PSBmdW5kUmVxdWVzdC5hbW91bnQsIEVSUl9BTExPV0FOQ0VfRVhDRUVERUQpOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMTIKICAgIDw9CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMTA5CiAgICBieXRlYyAyMCAvLyAiRVJSOkFMRVgiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QUxFWAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMTA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIHRoaXMuYWxsb3dhbmNlcyhrZXkpLnZhbHVlLnNwZW50ID0gZnVuZFJlcXVlc3QuYW1vdW50CiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCAxNwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjAKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDExMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjUwCiAgICAvLyBjb25zdCBsZWZ0b3ZlcjogdWludDY0ID0gYW1vdW50IC0gc3BlbnQ7CiAgICBmcmFtZV9kaWcgMTIKICAgIGZyYW1lX2RpZyAzMwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NTEKICAgIC8vIGxvZ2dlZEFzc2VydChsZWZ0b3ZlciA+PSBmdW5kUmVxdWVzdC5hbW91bnQsIEVSUl9BTExPV0FOQ0VfRVhDRUVERUQpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM2CiAgICA+PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExMgogICAgYnl0ZWMgMjAgLy8gIkVSUjpBTEVYIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMRVgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjUyCiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZS5zcGVudCArPSBmdW5kUmVxdWVzdC5hbW91bnQKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM2CiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDE3CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTIwCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NzMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gc3RhcnQpICUgaW50ZXJ2YWwpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2RpZyAzNAogICAgLQogICAgZnJhbWVfZGlnIDIxCiAgICAlCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY0MwogICAgLy8gY29uc3QgY3VycmVudFdpbmRvd1N0YXJ0ID0gdGhpcy5nZXRMYXRlc3RXaW5kb3dTdGFydCh1c2VSb3VuZHMsIHN0YXJ0LCBpbnRlcnZhbCkKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmdldExhdGVzdFdpbmRvd1N0YXJ0QDEyNwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9lbHNlX2JvZHlAMTEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIH0gZWxzZSBpZiAodHlwZSA9PT0gU3BlbmRBbGxvd2FuY2VUeXBlRHJpcCkgewogICAgZnJhbWVfZGlnIDExCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjU1CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBmcmFtZV9kaWcgNDAKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMTYKICAgIGdsb2JhbCBSb3VuZAogICAgZnJhbWVfYnVyeSAxNgoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDExNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjU2CiAgICAvLyBjb25zdCBwYXNzZWQ6IHVpbnQ2NCA9IGVwb2NoUmVmIC0gbGFzdAogICAgZnJhbWVfZGlnIDE2CiAgICBmcmFtZV9kaWcgMjMKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjYwCiAgICAvLyBjb25zdCBhY2NydWVkOiB1aW50NjQgPSBzcGVudCArICgocGFzc2VkIC8gaW50ZXJ2YWwpICogYW1vdW50KQogICAgZnJhbWVfZGlnIDIxCiAgICAvCiAgICBmcmFtZV9kaWcgMTIKICAgICoKICAgIGZyYW1lX2RpZyAzMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo2NjEKICAgIC8vIGNvbnN0IGF2YWlsYWJsZTogdWludDY0ID0gYWNjcnVlZCA+IG1heCA/IG1heCA6IGFjY3J1ZWQKICAgIGR1cAogICAgZnJhbWVfZGlnIDI1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgID4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gbG9nZ2VkQXNzZXJ0KGF2YWlsYWJsZSA+PSBmdW5kUmVxdWVzdC5hbW91bnQsIEVSUl9BTExPV0FOQ0VfRVhDRUVERUQpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICA+PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExOQogICAgYnl0ZWMgMjAgLy8gIkVSUjpBTEVYIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMRVgKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDExOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjY0CiAgICAvLyB0aGlzLmFsbG93YW5jZXMoa2V5KS52YWx1ZS5zcGVudCA9IChhdmFpbGFibGUgLSBmdW5kUmVxdWVzdC5hbW91bnQpCiAgICBmcmFtZV9kaWcgMTMKICAgIGZyYW1lX2RpZyAzOAogICAgLQogICAgaXRvYgogICAgZnJhbWVfZGlnIDYKICAgIHB1c2hpbnQgMTcKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDEyMAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NjU1CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBmcmFtZV9idXJ5IDE2CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUAxMTcKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUAxMDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gY29uc3QgbmV3TGFzdCA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBmcmFtZV9idXJ5IDI5CiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUAxMDEKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIGNvbnN0IHsgdXNlUm91bmRzLCB1c2VFeGVjdXRpb25LZXkgfSA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGludCAyNwogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBnZXRiaXQKICAgIGZyYW1lX2J1cnkgNDAKICAgIGludGNfMiAvLyAyCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDQzCiAgICAvLyBpZiAodXNlRXhlY3V0aW9uS2V5ICYmICF0aGlzLmlzQWRtaW4oKSkgewogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDM2CiAgICBjYWxsc3ViIGlzQWRtaW4KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGJ5dGVjIDkgLy8gIngiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLmV4aXN0cywgRVJSX0VYRUNVVElPTl9LRVlfTk9UX0ZPVU5EKTsKICAgIHR4biBMZWFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGV4ZWN1dGlvbnMgPSBCb3hNYXA8Ynl0ZXM8MzI+LCBFeGVjdXRpb25JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXhlY3V0aW9ucyB9KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLmV4aXN0cywgRVJSX0VYRUNVVElPTl9LRVlfTk9UX0ZPVU5EKTsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDI0CiAgICBieXRlYyAzNSAvLyAiRVJSOk5FWEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVYSwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS52YWx1ZS5maXJzdFZhbGlkIDw9IEdsb2JhbC5yb3VuZCwgRVJSX0VYRUNVVElPTl9OT1RfUkVBRFkpOwogICAgdHhuIExlYXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDQ1CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leGVjdXRpb25zKFR4bi5sZWFzZSkudmFsdWUuZmlyc3RWYWxpZCA8PSBHbG9iYWwucm91bmQsIEVSUl9FWEVDVVRJT05fTk9UX1JFQURZKTsKICAgIGludGNfMiAvLyAyCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGdsb2JhbCBSb3VuZAogICAgPD0KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAyNgogICAgcHVzaGJ5dGVzICJFUlI6RVhOUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFWE5SCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGJ5dGVjIDkgLy8gIngiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ0NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLnZhbHVlLmxhc3RWYWxpZCA+PSBHbG9iYWwucm91bmQsIEVSUl9FWEVDVVRJT05fRVhQSVJFRCk7CiAgICB0eG4gTGVhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4ZWN1dGlvbnMoVHhuLmxlYXNlKS52YWx1ZS5sYXN0VmFsaWQgPj0gR2xvYmFsLnJvdW5kLCBFUlJfRVhFQ1VUSU9OX0VYUElSRUQpOwogICAgcHVzaGludCAxMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBnbG9iYWwgUm91bmQKICAgID49CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMjgKICAgIHB1c2hieXRlcyAiRVJSOkVYWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RVhYUAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gZXhlY3V0aW9ucyA9IEJveE1hcDxieXRlczwzMj4sIEV4ZWN1dGlvbkluZm8+KHsga2V5UHJlZml4OiBBYnN0cmFjdEFjY291bnRCb3hQcmVmaXhFeGVjdXRpb25zIH0pCiAgICBieXRlYyA5IC8vICJ4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIGNvbnN0IGdyb3VwcyA9IHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLnZhbHVlLmdyb3VwcyBhcyBSZWFkb25seTxieXRlczwzMj5bXT47CiAgICB0eG4gTGVhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gbGV0IGZvdW5kR3JvdXAgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ1MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMjAKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fd2hpbGVfdG9wQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA4CiAgICBwdXNoaW50IDE4CiAgICBpbnRjXzIgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAyMAogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl93aGlsZUAzMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIGlmIChncm91cHNbaV0gPT09IEdsb2JhbC5ncm91cElkKSB7CiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMjAKICAgICsKICAgIGZyYW1lX2RpZyA4CiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZ2xvYmFsIEdyb3VwSUQKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyBmb3VuZEdyb3VwID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDE4CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ1MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDIwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyMAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEAyOQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl93aGlsZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDU3CiAgICAvLyBsb2dnZWRBc3NlcnQoZm91bmRHcm91cCwgRVJSX0dST1VQX05PVF9GT1VORCk7CiAgICBmcmFtZV9kaWcgMTgKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAzNQogICAgcHVzaGJ5dGVzICJFUlI6TkdSUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOR1JQCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGJ5dGVjIDkgLy8gIngiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ1OAogICAgLy8gdGhpcy5leGVjdXRpb25zKFR4bi5sZWFzZSkuZGVsZXRlKCk7CiAgICB0eG4gTGVhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBleGVjdXRpb25zID0gQm94TWFwPGJ5dGVzPDMyPiwgRXhlY3V0aW9uSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeEV4ZWN1dGlvbnMgfSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIHRoaXMuZXhlY3V0aW9ucyhUeG4ubGVhc2UpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgaW5pdGlhbENoZWNrID0gdGhpcy5wbHVnaW5DaGVjayhrZXkpOwogICAgZnJhbWVfZGlnIDQyCiAgICBjYWxsc3ViIHBsdWdpbkNoZWNrCiAgICBmcmFtZV9idXJ5IDQyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGxvZ2dlZEFzc2VydChpbml0aWFsQ2hlY2suZXhpc3RzLCBFUlJfUExVR0lOX0RPRVNfTk9UX0VYSVNUKTsKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEAzOAogICAgYnl0ZWMgMjcgLy8gIkVSUjpOUExHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5QTEcKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDM4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGxvZ2dlZEFzc2VydCghaW5pdGlhbENoZWNrLmV4cGlyZWQsIEVSUl9QTFVHSU5fRVhQSVJFRCk7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANDAKICAgIGJ5dGVjIDM3IC8vICJFUlI6UEVYUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQRVhQCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsb2dnZWRBc3NlcnQoIWluaXRpYWxDaGVjay5vbkNvb2xkb3duLCBFUlJfUExVR0lOX09OX0NPT0xET1dOKTsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZ2V0Yml0CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA0MgogICAgYnl0ZWMgMzggLy8gIkVSUjpQQ0xEIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBDTEQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDQyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjctNDY5CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcwogICAgLy8gICA/IEdsb2JhbC5yb3VuZAogICAgLy8gICA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBmcmFtZV9kaWcgNDAKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA0NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjgKICAgIC8vID8gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2J1cnkgMTYKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA0NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyBsZXQgcmVrZXlzQmFjayA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBsZXQgbWV0aG9kSW5kZXg6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjIKICAgIGZyYW1lX2RpZyA0MgogICAgZnJhbWVfYnVyeSA0CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3doaWxlX3RvcEA0NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDc0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAoVHhuLmdyb3VwSW5kZXggKyAxKTsgaSA8IEdsb2JhbC5ncm91cFNpemU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDIyCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICA8CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Jsb2NrQDkwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ3NwogICAgLy8gaWYgKHRoaXMudHhuUmVrZXlzQmFjayh0eG4pKSB7CiAgICBmcmFtZV9kaWcgMjIKICAgIGNhbGxzdWIgdHhuUmVrZXlzQmFjawogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gcmVrZXlzQmFjayA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAzMgoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ibG9ja0A5MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTA4CiAgICAvLyBsb2dnZWRBc3NlcnQocmVrZXlzQmFjaywgRVJSX01JU1NJTkdfUkVLRVlfQkFDSyk7CiAgICBmcmFtZV9kaWcgMzIKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA5MgogICAgYnl0ZWMgMzMgLy8gIkVSUjpOUktCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5SS0IKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDkyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5OTUKICAgIC8vIGlmICh0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5jb3ZlckZlZXMpIHsKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAzCiAgICBnZXRiaXQKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fZWxzZV9ib2R5QDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk5NwogICAgLy8gY29uc3QgbWF4RmVlOiB1aW50NjQgPSAoTUFYX0lOTkVSX1RYTl9DT1VOVCArIE1BWF9PVVRFUl9UWE5fQ09VTlQpICogR2xvYmFsLm1pblR4bkZlZQogICAgcHVzaGludCAyNzIKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5OTgKICAgIC8vIGNvbnN0IHJlaW1idXJzZW1lbnQgPSBUeG4uZmVlIDwgbWF4RmVlID8gVHhuLmZlZSA6IG1heEZlZQogICAgdHhuIEZlZQogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDEyCiAgICB0eG4gRmVlCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMDAtMTAwOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHJlaW1idXJzZW1lbnQsCiAgICAvLyAgICAgcmVrZXlUbzogcGx1Z2luQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgbm90ZTogJ3Jla2V5aW5nIHRvIHBsdWdpbiBhcHAgJiByZWltYnVyc2luZyBjYWxsZXInCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAyCiAgICAvLyBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBzcGVuZGluZ0FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzIH0pCiAgICBieXRlYyAxMCAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAwMgogICAgLy8gc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMDMKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDA1CiAgICAvLyByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIGZyYW1lX2RpZyAtNQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDA2CiAgICAvLyBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcicKICAgIHB1c2hieXRlcyAicmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlciIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAwLTEwMDcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiByZWltYnVyc2VtZW50LAogICAgLy8gICAgIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwICYgcmVpbWJ1cnNpbmcgY2FsbGVyJwogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDAwLTEwMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHNlbmRlcjogdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiByZWltYnVyc2VtZW50LAogICAgLy8gICAgIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgLy8gICAgIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwICYgcmVpbWJ1cnNpbmcgY2FsbGVyJwogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gcmVrZXlJbmRleCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVrZXlJbmRleCB9KQogICAgYnl0ZWMgMjEgLy8gInJla2V5X2luZGV4IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDIxCiAgICAvLyB0aGlzLnJla2V5SW5kZXgudmFsdWUgPSBUeG4uZ3JvdXBJbmRleAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMjMKICAgIC8vIGlmICh0aGlzLnBsdWdpbnMoa2V5KS52YWx1ZS5kZWxlZ2F0aW9uVHlwZSA9PT0gRGVsZWdhdGlvblR5cGVTZWxmKSB7CiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18zIC8vIDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgMTYgLy8gMHgwMQogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGxhc3RVc2VySW50ZXJhY3Rpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0VXNlckludGVyYWN0aW9uIH0pCiAgICBieXRlY18zIC8vICJsYXN0X3VzZXJfaW50ZXJhY3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5sYXN0VXNlckludGVyYWN0aW9uLnZhbHVlID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUAxOToKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VAMTI6CiAgICBmcmFtZV9kaWcgMjYKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDEzCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAxMC0xMDE3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDEyCiAgICAvLyBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBzcGVuZGluZ0FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzIH0pCiAgICBieXRlYyAxMCAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAxMgogICAgLy8gc2VuZGVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMTQKICAgIC8vIHJla2V5VG86IHBsdWdpbkFwcC5hZGRyZXNzLAogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwMTUKICAgIC8vIG5vdGU6ICdyZWtleWluZyB0byBwbHVnaW4gYXBwJwogICAgcHVzaGJ5dGVzICJyZWtleWluZyB0byBwbHVnaW4gYXBwIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGR1cAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAxMC0xMDE2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTAxMC0xMDE3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBzZW5kZXI6IHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICByZWtleVRvOiBwbHVnaW5BcHAuYWRkcmVzcywKICAgIC8vICAgICBub3RlOiAncmVrZXlpbmcgdG8gcGx1Z2luIGFwcCcKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDE3CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ4MgogICAgLy8gaWYgKHR4bi50eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKSB7CiAgICBmcmFtZV9kaWcgMjIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYKICAgICE9CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANTEKICAgIGZyYW1lX2RpZyA0CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Jsb2NrQDg4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IChUeG4uZ3JvdXBJbmRleCArIDEpOyBpIDwgR2xvYmFsLmdyb3VwU2l6ZTsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMjIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIyCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl93aGlsZV90b3BANDYKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA1MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDg2CiAgICAvLyBsb2dnZWRBc3NlcnQodHhuLmFwcElkLmlkID09PSBrZXkucGx1Z2luLCBFUlJfQ0FOTk9UX0NBTExfT1RIRVJfQVBQU19EVVJJTkdfUkVLRVkpOwogICAgZnJhbWVfZGlnIDIyCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBmcmFtZV9kaWcgNDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1MwogICAgcHVzaGJ5dGVzICJFUlI6Q0NPUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpDQ09SCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyBsb2dnZWRBc3NlcnQodHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wLCBFUlJfSU5WQUxJRF9PTkNPTVBMRVRFKTsKICAgIGZyYW1lX2RpZyAyMgogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1NQogICAgcHVzaGJ5dGVzICJFUlI6SU9DTiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJT0NOCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBsb2dnZWRBc3NlcnQodHhuLm51bUFwcEFyZ3MgPiAxLCBFUlJfSU5WQUxJRF9TRU5ERVJfQVJHKTsKICAgIGZyYW1lX2RpZyAyMgogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1NwogICAgcHVzaGJ5dGVzICJFUlI6SVNBRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJU0FHCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA1NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBsb2dnZWRBc3NlcnQoQXBwbGljYXRpb24oYnRvaSh0eG4uYXBwQXJncygxKSkpID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQsIEVSUl9JTlZBTElEX1NFTkRFUl9WQUxVRSk7CiAgICBmcmFtZV9kaWcgMjIKICAgIGludGNfMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnRvaQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU5CiAgICBwdXNoYnl0ZXMgIkVSUjpJU1ZMIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklTVkwKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDU5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0OTMKICAgIC8vIGNvbnN0IHsgZXhwaXJlZCwgb25Db29sZG93biwgaGFzTWV0aG9kUmVzdHJpY3Rpb25zIH0gPSB0aGlzLnBsdWdpbkNoZWNrKGtleSk7CiAgICBmcmFtZV9kaWcgNDIKICAgIGNhbGxzdWIgcGx1Z2luQ2hlY2sKICAgIGZyYW1lX2J1cnkgNDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2J1cnkgMzEKICAgIHN3YXAKICAgIHB1c2hpbnQgMwogICAgZ2V0Yml0CiAgICBmcmFtZV9idXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KCFleHBpcmVkLCBFUlJfUExVR0lOX0VYUElSRUQpOwogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9hc3NlcnRANjEKICAgIGJ5dGVjIDM3IC8vICJFUlI6UEVYUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQRVhQCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBsb2dnZWRBc3NlcnQoIW9uQ29vbGRvd24sIEVSUl9QTFVHSU5fT05fQ09PTERPV04pOwogICAgZnJhbWVfZGlnIDMxCiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2MwogICAgYnl0ZWMgMzggLy8gIkVSUjpQQ0xEIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBDTEQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfYXNzZXJ0QDYzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0OTgKICAgIC8vIGlmIChoYXNNZXRob2RSZXN0cmljdGlvbnMpIHsKICAgIGZyYW1lX2RpZyAxOQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDg3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjQ5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KG1ldGhvZEluZGV4IDwgbWV0aG9kT2Zmc2V0cy5sZW5ndGgsIEVSUl9NQUxGT1JNRURfT0ZGU0VUUyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgMjcKICAgID4KICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2NgogICAgcHVzaGJ5dGVzICJFUlI6TU9GRiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpNT0ZGCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBjb25zdCB7IG1ldGhvZEFsbG93ZWQsIG1ldGhvZE9uQ29vbGRvd24gfSA9IHRoaXMubWV0aG9kQ2hlY2soa2V5LCB0eG4sIG1ldGhvZE9mZnNldHNbbWV0aG9kSW5kZXhdKTsKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyNwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KGxlbih0eG4uYXBwQXJncygwKSkgPT09IDQsIEVSUl9JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfTEVOR1RIKQogICAgZnJhbWVfZGlnIDIyCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMAogICAgbGVuCiAgICBwdXNoaW50IDQKICAgID09CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzUKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2OAogICAgcHVzaGJ5dGVzICJFUlI6SU1TTCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJTVNMCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2Fzc2VydEA2ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTIyCiAgICAvLyBjb25zdCBzZWxlY3RvckFyZyA9IHR4bi5hcHBBcmdzKDApLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSkKICAgIGZyYW1lX2RpZyAzNQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgZnJhbWVfZGlnIDQyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyNAogICAgLy8gY29uc3QgeyB1c2VSb3VuZHMgfSA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMjcKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyNQogICAgLy8gY29uc3QgeyBzZWxlY3RvciwgY29vbGRvd24sIGxhc3RDYWxsZWQgfSA9IHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlLm1ldGhvZHNbb2Zmc2V0XQogICAgZnJhbWVfZGlnIDMwCiAgICBwdXNoaW50IDIwCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgIHB1c2hpbnQgNDYKICAgICsKICAgIHB1c2hpbnQgMjAKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBmcmFtZV9idXJ5IDkKICAgIGR1cAogICAgcHVzaGludCA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAxNQogICAgcHVzaGludCAxMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTI3CiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA3MAogICAgZ2xvYmFsIFJvdW5kCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VANzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyOAogICAgLy8gY29uc3QgbWV0aG9kT25Db29sZG93biA9IHRoaXMuaXNPbkNvb2xkb3duKGVwb2NoUmVmLCBsYXN0Q2FsbGVkLCBjb29sZG93bikKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfZGlnIDE1CiAgICBjYWxsc3ViIGlzT25Db29sZG93bgogICAgZnJhbWVfYnVyeSAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIGlmIChzZWxlY3RvciA9PT0gc2VsZWN0b3JBcmcgJiYgIW1ldGhvZE9uQ29vbGRvd24pIHsKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9kaWcgMTAKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANzkKICAgIGZyYW1lX2RpZyAyOAogICAgYm56IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaWZfZWxzZUA3OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MzIKICAgIC8vIGlmIChjb29sZG93biA+IDApIHsKICAgIGZyYW1lX2RpZyAxNQogICAgYnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDc4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUzMwogICAgLy8gY29uc3QgbGFzdENhbGxlZCA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBmcmFtZV9kaWcgNDAKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9mYWxzZUA3NgogICAgZ2xvYmFsIFJvdW5kCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfbWVyZ2VANzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUzNAogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUubWV0aG9kc1tvZmZzZXRdLmxhc3RDYWxsZWQgPSBsYXN0Q2FsbGVkCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMTQKICAgIHB1c2hpbnQgNTgKICAgICsKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUzNy01NDAKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIG1ldGhvZEFsbG93ZWQ6IHRydWUsCiAgICAvLyAgIG1ldGhvZE9uQ29vbGRvd24KICAgIC8vIH0KICAgIHB1c2hieXRlcyAweDgwCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfZGlnIDI4CiAgICBzZXRiaXQKCnNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5tZXRob2RDaGVja0A4MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBjb25zdCB7IG1ldGhvZEFsbG93ZWQsIG1ldGhvZE9uQ29vbGRvd24gfSA9IHRoaXMubWV0aG9kQ2hlY2soa2V5LCB0eG4sIG1ldGhvZE9mZnNldHNbbWV0aG9kSW5kZXhdKTsKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgZnJhbWVfYnVyeSAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGxvZ2dlZEFzc2VydChtZXRob2RBbGxvd2VkICYmICFtZXRob2RPbkNvb2xkb3duLCBFUlJfTUVUSE9EX09OX0NPT0xET1dOKTsKICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fYm9vbF9mYWxzZUA4MwogICAgZnJhbWVfZGlnIDI4CiAgICBibnogc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDgzCiAgICBpbnRjXzEgLy8gMQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDg0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGxvZ2dlZEFzc2VydChtZXRob2RBbGxvd2VkICYmICFtZXRob2RPbkNvb2xkb3duLCBFUlJfTUVUSE9EX09OX0NPT0xET1dOKTsKICAgIGJueiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VAODcKICAgIHB1c2hieXRlcyAiRVJSOk1DTEQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TUNMRAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDg3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIHBsdWdpbnMgPSBCb3hNYXA8UGx1Z2luS2V5LCBQbHVnaW5JbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4UGx1Z2lucyB9KTsKICAgIGJ5dGVjXzIgLy8gInAiCiAgICBmcmFtZV9kaWcgNDIKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUwNAogICAgLy8gdGhpcy5wbHVnaW5zKGtleSkudmFsdWUubGFzdENhbGxlZCA9IGVwb2NoUmVmCiAgICBmcmFtZV9kaWcgMTYKICAgIGl0b2IKICAgIHB1c2hpbnQgMjgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUwNQogICAgLy8gbWV0aG9kSW5kZXggKz0gMTsKICAgIGZyYW1lX2RpZyAyNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMjcKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ibG9ja0A4OAoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX2ZhbHNlQDgzOgogICAgaW50Y18wIC8vIDAKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9ib29sX21lcmdlQDg0CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VANzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUzMwogICAgLy8gY29uc3QgbGFzdENhbGxlZCA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA3NwoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pZl9lbHNlQDc5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo1NDMtNTQ2CiAgICAvLyByZXR1cm4gewogICAgLy8gICBtZXRob2RBbGxvd2VkOiBmYWxzZSwKICAgIC8vICAgbWV0aG9kT25Db29sZG93bjogdHJ1ZQogICAgLy8gfQogICAgcHVzaGJ5dGVzIDB4NDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBjb25zdCB7IG1ldGhvZEFsbG93ZWQsIG1ldGhvZE9uQ29vbGRvd24gfSA9IHRoaXMubWV0aG9kQ2hlY2soa2V5LCB0eG4sIG1ldGhvZE9mZnNldHNbbWV0aG9kSW5kZXhdKTsKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Lm1ldGhvZENoZWNrQDgwCgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX3Rlcm5hcnlfZmFsc2VANzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjUyNwogICAgLy8gY29uc3QgZXBvY2hSZWYgPSB1c2VSb3VuZHMgPyBHbG9iYWwucm91bmQgOiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBiIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50LmFyYzU4X3Jla2V5VG9QbHVnaW5fdGVybmFyeV9tZXJnZUA3MQoKc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X2ZhbHNlQDQ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcDsKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIGIgc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQuYXJjNThfcmVrZXlUb1BsdWdpbl90ZXJuYXJ5X21lcmdlQDQ1CgpzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2Vsc2VfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo5ODkKICAgIC8vIHRoaXMuc3BlbmRpbmdBZGRyZXNzLnZhbHVlID0gdGhpcy5jb250cm9sbGVkQWRkcmVzcy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb250cm9sbGVkQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcyB9KTsKICAgIGJ5dGVjXzEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OTg5CiAgICAvLyB0aGlzLnNwZW5kaW5nQWRkcmVzcy52YWx1ZSA9IHRoaXMuY29udHJvbGxlZEFkZHJlc3MudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gc3BlbmRpbmdBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcyB9KQogICAgYnl0ZWMgMTAgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjk4OQogICAgLy8gdGhpcy5zcGVuZGluZ0FkZHJlc3MudmFsdWUgPSB0aGlzLmNvbnRyb2xsZWRBZGRyZXNzLnZhbHVlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjpBYnN0cmFjdGVkQWNjb3VudC5hcmM1OF9yZWtleVRvUGx1Z2luX2FmdGVyX2lmX2Vsc2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Ll9hZGRQbHVnaW4obmFtZTogYnl0ZXMsIHBsdWdpbjogdWludDY0LCBjYWxsZXI6IGJ5dGVzLCBlc2Nyb3c6IGJ5dGVzLCBhZG1pbjogdWludDY0LCBkZWxlZ2F0aW9uVHlwZTogYnl0ZXMsIGxhc3RWYWxpZDogdWludDY0LCBjb29sZG93bjogdWludDY0LCBtZXRob2RzOiBieXRlcywgdXNlUm91bmRzOiB1aW50NjQsIHVzZUV4ZWN1dGlvbktleTogdWludDY0LCBjb3ZlckZlZXM6IHVpbnQ2NCwgY2FuUmVjbGFpbTogdWludDY0LCBkZWZhdWx0VG9Fc2Nyb3c6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9hZGRQbHVnaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwNzAtMTA4NQogICAgLy8gcHJpdmF0ZSBfYWRkUGx1Z2luKAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHBsdWdpbjogdWludDY0LAogICAgLy8gICBjYWxsZXI6IEFjY291bnQsCiAgICAvLyAgIGVzY3Jvdzogc3RyaW5nLAogICAgLy8gICBhZG1pbjogYm9vbGVhbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGU6IFVpbnQ4LAogICAgLy8gICBsYXN0VmFsaWQ6IHVpbnQ2NCwKICAgIC8vICAgY29vbGRvd246IHVpbnQ2NCwKICAgIC8vICAgbWV0aG9kczogTWV0aG9kUmVzdHJpY3Rpb25bXSwKICAgIC8vICAgdXNlUm91bmRzOiBib29sZWFuLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXk6IGJvb2xlYW4sCiAgICAvLyAgIGNvdmVyRmVlczogYm9vbGVhbiwKICAgIC8vICAgY2FuUmVjbGFpbTogYm9vbGVhbiwKICAgIC8vICAgZGVmYXVsdFRvRXNjcm93OiBib29sZWFuCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDE0IDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDUKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDg2CiAgICAvLyB0aGlzLl9yZXF1aXJlQWRtaW4oKTsKICAgIGNhbGxzdWIgX3JlcXVpcmVBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMDg4CiAgICAvLyBjb25zdCBpc05hbWVkID0gbmFtZSAhPT0gJycKICAgIGZyYW1lX2RpZyAtMTQKICAgIGJ5dGVjXzAgLy8gIiIKICAgICE9CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA4OQogICAgLy8gaWYgKGlzTmFtZWQpIHsKICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gbmFtZWRQbHVnaW5zID0gQm94TWFwPHN0cmluZywgUGx1Z2luS2V5Pih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4TmFtZWRQbHVnaW5zIH0pOwogICAgYnl0ZWMgMTUgLy8gIm4iCiAgICBmcmFtZV9kaWcgLTE0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5MAogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLm5hbWVkUGx1Z2lucyhuYW1lKS5leGlzdHMsIEVSUl9QTFVHSU5fQUxSRUFEWV9FWElTVFMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAzOSAvLyAiRVJSOkVQTEciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6RVBMRwoKX2FkZFBsdWdpbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjEwOTUKICAgIC8vIGRlbGVnYXRpb25UeXBlID09PSBEZWxlZ2F0aW9uVHlwZVNlbGYgJiYKICAgIGZyYW1lX2RpZyAtOQogICAgYnl0ZWMgMTYgLy8gMHgwMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5NS0xMDk2CiAgICAvLyBkZWxlZ2F0aW9uVHlwZSA9PT0gRGVsZWdhdGlvblR5cGVTZWxmICYmCiAgICAvLyBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcwogICAgYnogX2FkZFBsdWdpbl9ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5NgogICAgLy8gY2FsbGVyID09PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMTIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5NS0xMDk2CiAgICAvLyBkZWxlZ2F0aW9uVHlwZSA9PT0gRGVsZWdhdGlvblR5cGVTZWxmICYmCiAgICAvLyBjYWxsZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcwogICAgYnogX2FkZFBsdWdpbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpfYWRkUGx1Z2luX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTA5My0xMDk5CiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgICEoCiAgICAvLyAgICAgZGVsZWdhdGlvblR5cGUgPT09IERlbGVnYXRpb25UeXBlU2VsZiAmJgogICAgLy8gICAgIGNhbGxlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICAvLyAgICksCiAgICAvLyAgIEVSUl9aRVJPX0FERFJFU1NfREVMRUdBVElPTl9UWVBFCiAgICAvLyApCiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxMAogICAgcHVzaGJ5dGVzICJFUlI6WkFEVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpaQURUCgpfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEwMi0xMTAzCiAgICAvLyB1c2VFeGVjdXRpb25LZXkgJiYKICAgIC8vIGNhbGxlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ6IF9hZGRQbHVnaW5fYm9vbF9mYWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTAzCiAgICAvLyBjYWxsZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTAyLTExMDMKICAgIC8vIHVzZUV4ZWN1dGlvbktleSAmJgogICAgLy8gY2FsbGVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGJ6IF9hZGRQbHVnaW5fYm9vbF9mYWxzZUAxMwogICAgaW50Y18xIC8vIDEKCl9hZGRQbHVnaW5fYm9vbF9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEwMC0xMTA2CiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgICEoCiAgICAvLyAgICAgdXNlRXhlY3V0aW9uS2V5ICYmCiAgICAvLyAgICAgY2FsbGVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MKICAgIC8vICAgKSwKICAgIC8vICAgRVJSX1VTSU5HX0VYRUNVVElPTl9LRVlfUkVRVUlSRVNfR0xPQkFMCiAgICAvLyApCiAgICBieiBfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxNgogICAgcHVzaGJ5dGVzICJFUlI6VUVLRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpVRUtHCgpfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEwOQogICAgLy8gaWYgKGRlZmF1bHRUb0VzY3JvdykgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2FkZFBsdWdpbl9pZl9ib2R5QDE3CiAgICBmcmFtZV9kaWcgLTExCiAgICBmcmFtZV9idXJ5IDEKCl9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExNAogICAgLy8gY29uc3Qga2V5OiBQbHVnaW5LZXkgPSB7IHBsdWdpbiwgY2FsbGVyLCBlc2Nyb3c6IGVzY3Jvd0tleSB9CiAgICBmcmFtZV9kaWcgLTEzCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMTEgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBwbHVnaW5zID0gQm94TWFwPFBsdWdpbktleSwgUGx1Z2luSW5mbz4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeFBsdWdpbnMgfSk7CiAgICBieXRlY18yIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE2CiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMucGx1Z2lucyhrZXkpLmV4aXN0cywgRVJSX1BMVUdJTl9BTFJFQURZX0VYSVNUUykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2FkZFBsdWdpbl9hZnRlcl9hc3NlcnRAMjIKICAgIGJ5dGVjIDM5IC8vICJFUlI6RVBMRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpFUExHCgpfYWRkUGx1Z2luX2FmdGVyX2Fzc2VydEAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExOAogICAgLy8gbGV0IG1ldGhvZEluZm9zOiBNZXRob2RJbmZvW10gPSBbXQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgYnl0ZWMgNyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTE5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FkZFBsdWdpbl93aGlsZV90b3BAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgLTYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNwogICAgPgogICAgYnogX2FkZFBsdWdpbl9hZnRlcl93aGlsZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTIwCiAgICAvLyBtZXRob2RJbmZvcy5wdXNoKHsgLi4ubWV0aG9kc1tpXSwgbGFzdENhbGxlZDogMCB9KQogICAgZnJhbWVfZGlnIC02CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAxMgogICAgKgogICAgcHVzaGludCAxMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBzd2FwCiAgICBleHRyYWN0IDQgOAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTEyMAogICAgLy8gbWV0aG9kSW5mb3MucHVzaCh7IC4uLm1ldGhvZHNbaV0sIGxhc3RDYWxsZWQ6IDAgfSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgcmVwbGFjZTIgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDcKICAgIGIgX2FkZFBsdWdpbl93aGlsZV90b3BAMjMKCl9hZGRQbHVnaW5fYWZ0ZXJfd2hpbGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIGxldCB0b3RhbE1icjogdWludDY0ID0gdGhpcy5wbHVnaW5zTWJyKGVzY3Jvd0tleSwgbWV0aG9kSW5mb3MubGVuZ3RoKQogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY2FsbHN1YiBwbHVnaW5zTWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMjQKICAgIC8vIGlmIChpc05hbWVkKSB7CiAgICBmcmFtZV9kaWcgOAogICAgYnogX2FkZFBsdWdpbl9hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gcmV0dXJuIE1pbk5hbWVkUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMobmFtZSkubGVuZ3RoKQogICAgZnJhbWVfZGlnIC0xNAogICAgbGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gcmV0dXJuIEJveENvc3RQZXJCeXRlICogbGVuCiAgICBpbnRjIDQgLy8gNDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gcmV0dXJuIE1pbk5hbWVkUGx1Z2luTUJSICsgdGhpcy5fY2FsY0JDUEIoQnl0ZXMobmFtZSkubGVuZ3RoKQogICAgaW50YyA1IC8vIDE4OTAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMjUKICAgIC8vIHRvdGFsTWJyICs9IHRoaXMubmFtZWRQbHVnaW5zTWJyKG5hbWUpCiAgICArCgpfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMjcKICAgIC8vIHRoaXMuX3BheU1ickZyb21Db250cm9sbGVkKHRvdGFsTWJyKQogICAgY2FsbHN1YiBfcGF5TWJyRnJvbUNvbnRyb2xsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6Mjg4CiAgICAvLyBpZiAoZXNjcm93ID09PSAnJykgewogICAgZnJhbWVfZGlnIC0xMQogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoyODkKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpfYWRkUGx1Z2luX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czo6QWJzdHJhY3RlZEFjY291bnQubWF5YmVOZXdFc2Nyb3dAMzk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExMzAKICAgIC8vIGNvbnN0IGVwb2NoUmVmID0gdXNlUm91bmRzID8gR2xvYmFsLnJvdW5kIDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcDsKICAgIGZyYW1lX2RpZyAtNQogICAgYnogX2FkZFBsdWdpbl90ZXJuYXJ5X2ZhbHNlQDI5CiAgICBnbG9iYWwgUm91bmQKCl9hZGRQbHVnaW5fdGVybmFyeV9tZXJnZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTE0MgogICAgLy8gY2FuUmVjbGFpbTogZXNjcm93ICE9PSAnJyA/IGNhblJlY2xhaW0gOiBmYWxzZSwKICAgIGZyYW1lX2RpZyAtMTEKICAgIGJ5dGVjXzAgLy8gIiIKICAgICE9CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0yCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTMyLTExNDUKICAgIC8vIHRoaXMucGx1Z2lucyhrZXkpLnZhbHVlID0gewogICAgLy8gICBlc2Nyb3c6IGVzY3Jvd0lELAogICAgLy8gICBhZG1pbiwKICAgIC8vICAgZGVsZWdhdGlvblR5cGUsCiAgICAvLyAgIGxhc3RWYWxpZCwKICAgIC8vICAgY29vbGRvd24sCiAgICAvLyAgIG1ldGhvZHM6IGNsb25lKG1ldGhvZEluZm9zKSwKICAgIC8vICAgdXNlUm91bmRzLAogICAgLy8gICB1c2VFeGVjdXRpb25LZXksCiAgICAvLyAgIGNvdmVyRmVlcywKICAgIC8vICAgY2FuUmVjbGFpbTogZXNjcm93ICE9PSAnJyA/IGNhblJlY2xhaW0gOiBmYWxzZSwKICAgIC8vICAgbGFzdENhbGxlZDogMCwKICAgIC8vICAgc3RhcnQ6IGVwb2NoUmVmLAogICAgLy8gfQogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTgKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC03CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmMKICAgIGNvbmNhdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xMAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfZGlnIC01CiAgICBzZXRiaXQKICAgIGludGNfMiAvLyAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICBmcmFtZV9kaWcgLTMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTQ3CiAgICAvLyBpZiAoaXNOYW1lZCkgewogICAgZnJhbWVfZGlnIDgKICAgIGJ6IF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIG5hbWVkUGx1Z2lucyA9IEJveE1hcDxzdHJpbmcsIFBsdWdpbktleT4oeyBrZXlQcmVmaXg6IEFic3RyYWN0QWNjb3VudEJveFByZWZpeE5hbWVkUGx1Z2lucyB9KTsKICAgIGJ5dGVjIDE1IC8vICJuIgogICAgZnJhbWVfZGlnIC0xNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjExNDgKICAgIC8vIHRoaXMubmFtZWRQbHVnaW5zKG5hbWUpLnZhbHVlID0gY2xvbmUoa2V5KQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CgpfYWRkUGx1Z2luX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGFzdFVzZXJJbnRlcmFjdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0xhc3RVc2VySW50ZXJhY3Rpb24gfSkKICAgIGJ5dGVjXzMgLy8gImxhc3RfdXNlcl9pbnRlcmFjdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLmxhc3RVc2VySW50ZXJhY3Rpb24udmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIGxhc3RDaGFuZ2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNMYXN0Q2hhbmdlIH0pCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYW5nZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmxhc3RDaGFuZ2UudmFsdWUgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2FkZFBsdWdpbl90ZXJuYXJ5X2ZhbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTMwCiAgICAvLyBjb25zdCBlcG9jaFJlZiA9IHVzZVJvdW5kcyA/IEdsb2JhbC5yb3VuZCA6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXA7CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBiIF9hZGRQbHVnaW5fdGVybmFyeV9tZXJnZUAzMAoKX2FkZFBsdWdpbl9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGVzY3Jvd3MgPSBCb3hNYXA8c3RyaW5nLCBFc2Nyb3dJbmZvPih7IGtleVByZWZpeDogQWJzdHJhY3RBY2NvdW50Qm94UHJlZml4RXNjcm93cyB9KQogICAgYnl0ZWMgNCAvLyAiZSIKICAgIGZyYW1lX2RpZyAtMTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjkyCiAgICAvLyByZXR1cm4gdGhpcy5lc2Nyb3dzKGVzY3JvdykuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MjkyLTI5NAogICAgLy8gcmV0dXJuIHRoaXMuZXNjcm93cyhlc2Nyb3cpLmV4aXN0cwogICAgLy8gICA/IHRoaXMuZXNjcm93cyhlc2Nyb3cpLnZhbHVlLmlkCiAgICAvLyAgIDogdGhpcy5uZXdFc2Nyb3coZXNjcm93KQogICAgYnogX2FkZFBsdWdpbl90ZXJuYXJ5X2ZhbHNlQDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gPyB0aGlzLmVzY3Jvd3MoZXNjcm93KS52YWx1ZS5pZAogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKCl9hZGRQbHVnaW5fdGVybmFyeV9tZXJnZUAzODoKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTI5CiAgICAvLyBjb25zdCBlc2Nyb3dJRCA9IHRoaXMubWF5YmVOZXdFc2Nyb3coZXNjcm93KTsKICAgIGIgX2FkZFBsdWdpbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6OkFic3RyYWN0ZWRBY2NvdW50Lm1heWJlTmV3RXNjcm93QDM5CgpfYWRkUGx1Z2luX3Rlcm5hcnlfZmFsc2VAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvYWNjb3VudC9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gOiB0aGlzLm5ld0VzY3Jvdyhlc2Nyb3cpCiAgICBmcmFtZV9kaWcgLTExCiAgICBjYWxsc3ViIG5ld0VzY3JvdwogICAgYiBfYWRkUGx1Z2luX3Rlcm5hcnlfbWVyZ2VAMzgKCl9hZGRQbHVnaW5faWZfYm9keUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L2NvbnRyYWN0LmFsZ28udHM6MTExMAogICAgLy8gbG9nZ2VkQXNzZXJ0KGVzY3JvdyAhPT0gJycsIEVSUl9FU0NST1dfUkVRVUlSRURfVE9fQkVfU0VUX0FTX0RFRkFVTFQpCiAgICBmcmFtZV9kaWcgLTExCiAgICBieXRlY18wIC8vICIiCiAgICAhPQogICAgYm56IF9hZGRQbHVnaW5fYWZ0ZXJfYXNzZXJ0QDE5CiAgICBwdXNoYnl0ZXMgIkVSUjpFUlNEIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkVSU0QKCl9hZGRQbHVnaW5fYWZ0ZXJfYXNzZXJ0QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L2FjY291bnQvY29udHJhY3QuYWxnby50czoxMTExCiAgICAvLyBlc2Nyb3dLZXkgPSAnJwogICAgYnl0ZWNfMCAvLyAiIgogICAgZnJhbWVfYnVyeSAxCiAgICBiIF9hZGRQbHVnaW5fYWZ0ZXJfaWZfZWxzZUAyMAoKX2FkZFBsdWdpbl9ib29sX2ZhbHNlQDEzOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2FkZFBsdWdpbl9ib29sX21lcmdlQDE0CgpfYWRkUGx1Z2luX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hZGRQbHVnaW5fYm9vbF9tZXJnZUA4Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAHAAECCJAD1JMBtNgBJigAEmNvbnRyb2xsZWRfYWRkcmVzcwFwFWxhc3RfdXNlcl9pbnRlcmFjdGlvbgFlBBUffHULbGFzdF9jaGFuZ2UCAAABAAF4EHNwZW5kaW5nX2FkZHJlc3MCACoIRVJSOkZPUkICAAIFYWRtaW4BbgEBAWQCAAoBYQhFUlI6QUxFWAtyZWtleV9pbmRleAZkb21haW4OZXNjcm93X2ZhY3RvcnkKcmV2b2NhdGlvbg91cGRhdGVfc2V0dGluZ3MOY3VycmVudF9wbHVnaW4IRVJSOk5QTEcEbMP2Bgd2ZXJzaW9uCWFraXRhX2RhbwhuaWNrbmFtZQtmYWN0b3J5X2FwcAhFUlI6TlJLQghFUlI6TkFMVwhFUlI6TkVYSwhFUlI6QURNTghFUlI6UEVYUAhFUlI6UENMRAhFUlI6RVBMRzEYQAAEJxUiZ4AE6pGA3TYaAI4BAS8xGRREMRhBARiCCwS9YJnlBHeHhn0ELXcRtwRAGm2ABJ+RzM0EF9i8tAQ4VlirBF7wtBUEXFiVPATSS3VWBBR7bNYnHIIbBMlaXT0Es2I0pQRa3zOPBEikRWYEVnJGLgRXpR2IBO70SP0EVy/R6gTjULnUBAqMssIEJbcTygTrrxSgBGogXPwErhpNygRkTS3sBL9NfFcE1d04KwRc6+1DBNWGha8EE7xE5ASJp2gmBAV5TX0EokA93wQC/kUVBEG9xoAEiCuxwgQXYMZSNhoAjicCRwLqAwMDFQMnA0ADWANwA4wDswPOBHsEzgVRBjUGfQbXB2gHrAf6CJgJAAlICZMJzAp0Cq8LagxXDQUNzQ4RDh0O5w+3EHIRHhGaEgQAgATp7S5vNhoAjgEBPwAxGYEEEjEYEERCAoaKAgGL/lcCAIv/JAtLAUxZSlkkCFiJigMBi/0iWUkkCyQIi/0kSwJSi/8kC69Qi/0Vi/1PA08CUov+UFBMi/8ISRZXBgBMJAtJIosEiwIMQQAjiwNJFlcGAIsAiwRJTgRPAl1JjABLAVkkCAiMAyQIjARC/9WLAYsAUIwAiYoDASiL/SJZSYv/CBZXBgBMi/1XAgBMJAuL/yQLIosFiwMMQQAciwKLBUlOAlmLBAgWVwYAiwFMUIwBJAiMBUL/3IsCFYwAIowFiwWLBAxBAByL/osFSU4CWYsACBZXBgCLAUxQjAEkCIwFQv/ciwKLA4sAUosBTFCL/hWL/osETwJSUIwAiYoBAYv/FkmTJQ5EVwcBiSKI/+0iFklPAlBLAVBLAVCAAwAsAFBLAVBMUCcHUIk2GgFJIlkkCEsBFRJEVwIANhoCSRUlEkQXNhoDSRWBIBJENhoESRWBIBJENhoFSSJZJAhLARUSRFcCADYaBkkVJRJEFzYaB0kVJRJEFzYaCEkiWSQISwEVEkRXAgA2GglJFYEgEkQ2GgpJFYEgEkQyDUAADIAIRVJSOkJERVCwAEsGSwgTQAAMgAhFUlI6QUNCQ7AAJx1LCmcnHksJZycOSwdnJxZLBmdLBzIDEkEARTIKKUxnJxdLBWcnCjIDZycYSwRnJx9LA2cnIDINZ4AIcmVmZXJyZXJLAmcnGYABwGeABHNhbHRLAWcrMgdnJwYyB2cjQ0sHQv+4NhoBSSJZJAhLARUSRFcCAEkiTCgTQQAQSwFJiBBsJwRMUL5EIltFAbEiJxdlRElyCESBxF6yCLIHI7IQIrIBtksBFkyyGIAEYH5wRrIashqBBrIQIrIBsyNDNhoBSSJZJAhLARUSRFcCAIgRLEAAGCInGWVEIlNBACUxACInIGVEcghEEkEAFyNAAAyACEVSUjpPQUNVsAAnHUsBZyNDIkL/5jYaAUkiWSQISwEVEkRXAgCID6gnFkxnI0M2GgFJFSUSRBeID5YnGExnI0M2GgFJFSUSRBeID4QnHkxnI0M2GgFJIlkkCEsBFRJEVwIAiA9rJx9MZyNDNhoBSRUlEkQXiA9ZgAZhdmF0YXJMZyNDNhoBSRUlEkQXiA9BgAZiYW5uZXJMZyNDNhoBSSJZJAhLARUSRFcCAIgPIoADYmlvTGcjQzYaAUkVIxJEIlM2GgJJFSMSRCJTiA8CJwgiTwNUI08CVCcZTGcjQzYaAUkVgSASRIgO5icOTGcrMgdnJwYyB2cjQyI2GgFJFYEgEkQiJxplTElPAkRJIltMSYEoWUsBFVJXAgAoEkAADIAIRVJSOkFQTkWwADEASwFyCEQSQAAMgAhFUlI6U01BULAAIillRHMCREsBcghEEkAADIAIRVJSOlBEQ1ewACpLAlBJRQW9RQFBADZLA4EbI7oiU0EAKyNAAAyACEVSUjpQREFQsAAnDksDZ0sDJSO6JxASQQAEKzIHZycGMgdnI0MiQv/SIicKZURJcwJMTgJEIillRBJBADoiKWVEMgoSQQAwMgNLARJAAAyACEVSUjpBVUFNsAAnCjIDZzIKIhZMUIAEACoAAFAnGkxnJxUiZyNDMgpC/80oSTYaAUkVgSASRDYaAkkVIxJEIlOIDb+xIillRIAbcmVrZXlpbmcgYWJzdHJhY3RlZCBhY2NvdW50sgVLArIgTwKyB7IAI7IQIrIBs0EAJCJFATEWIwhFAksBMgQMQQALSwGIDvxBABEjRQFJQAAEJyGwACsyB2cjQ0sBIwhFAkL/1ihHBDYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVgSASRDYaBEkiWSQISwEVEkRXAgA2GgVJTgUVgQQSRE4CiA6HTwIWTFBLARUWVwYCTwJQTCcLUExQKkxQSb1FAUAADiInCCJPAlQnBUxQsCNDRwKBESW6F0UISYEbI7pJI1NFBSRTTIEcJboXRQZBAAQiQv/PSYEsJLoXFEUEIkUGSYEsJLoXSwYNQQAaSwWBFAuBLghLAUyBFLpXAARLAhJBAB0jRQRLAkEAEDIGSwVLCIgOXhRLBBBC/4gyB0L/7UsFIwhFBkL/tzYaAUkVJRJEFzYaAkkVJRJEFzYaA0kiWSQISwEVEkRXAgA2GgRJIlklCyQISwEVEkQ2GgVJIlmBEAskCEsBFRJEiA+uRgIjQzYaAUkiWSQISwEVEkRXAgA2GgJJFSUSRBc2GgNJIlkkCEsBFRJEVwIANhoESSJZJQskCEsBFRJENhoFSSJZgRALJAhLARUSRCcPTwVQIiW6F04EiA9URgIjQzYaAUkVJRJEFzYaAkkVgSASRDYaA0kiWSQISwEVEkRXAgA2GgRJFSMSRCJTNhoFSRUjEkQ2GgZJFSUSRBc2GgdJFSUSRBc2GghJIlmBDAskCEsBFRJENhoJSRUjEkQiUzYaCkkVIxJEIlM2GgtJFSMSRCJTNhoMSRUjEkQiUzYaDUkVIxJEIlMoTg2IFF5II0M2GgFJFYEgEkQ2GgJJIlkkCEsBFRJEVwIAiAxcQAAMgAhFUlI6T0FBULAARwIVIQQLgdR6CIgLfScRSwNQSbxITL8jQzYaAUkVJRJEFzYaAkkVgSASRDYaA0kiWSQISwEVEkRXAgCICt9PAhZPAlBLARUWVwYCTwJQTCcLUExQiAsfKkxQvEgrMgdnJwYyB2cjQzYaAUkiWSQISwEVEkRXAgA2GgJJFSUSRBc2GgNJFYEgEkQ2GgRJIlkkCEsBFRJEVwIANhoFSRUjEkQiUzYaBkkVIxJENhoHSRUlEkQXNhoISRUlEkQXNhoJSSJZgQwLJAhLARUSRDYaCkkVIxJEIlM2GgtJFSMSRCJTNhoMSRUjEkQiUzYaDUkVIxJEIlM2Gg5JFSMSRCJTiBMuSCNDNhoBSSJZJAhLARUSRFcCAEmICgQnD0xQSb1FAUAABCcbsABHAr5EiApHKksBUEmBLCS6F08DvEhMvEhLAxUhBAshBQhLAoEoWUsDFU8ETgJSVwIATwKICnAIiApMKzIHZycGMgdnI0M2GgFJIlkkCEsBFRJEVwIASYgJkScETFC9RQFBAAyACEVSUjpFRVNDsABJKBNAAAyACEVSUjpFTlJRsABJiAo2FicFTFCwI0M2GgFJIlkkCEsBFRJEVwIAiAqFQAAEJwywAEcCiAlqJwRMUEm+RIFAUxRLASUjuiJPAlRLASVPArsrMgdnJwYyB2e+SCcFTFCwI0M2GgFJIlkkCEsBFRJEVwIANhoCRwIiWYERCyQITBUSRIgKKkAABCcMsABLAUmICQ5LASOIC7RII0M2GgFJFSUSRBdJNhoCSU4CSRWBIBJENhoDSSJZJAhLARUSRFcCAElOAzYaBElOBEkiWYERCyQITBUSRE8CFk8CUEsBFRZXBgJPAlBMJwtQTFCICOkqTFCBGyO6gQRTQAAEJwywAEsBiAibMQBLBHIIRBJAABAxAEsDEkAACEsCMgMSQQAfI0AABCcMsAAnBEsCSU4CUL5EgUBTFEsCTIgLEEgjQyJC/942GgFJIlkkCEsBFRJEVwIANhoCRwIiWSULJAhMFRJEiAlKQAAEJwywAEsBSYgILkmICEVLAYgKa0gjQzYaAUkVJRJEFzYaAklOAkkVgSASRDYaA0kiWSQISwEVEkRXAgBJTgM2GgRJTgRJIllJTgUlCyQITBUSRDEWIwlJTgQ4ECMSREsCFk8CUEsBFRZXBgJLAlBMJwtQTFCIB/lISYgHvIgH1DEATHIIRBJAABAxAEsFEkAACEsEMgMSQQA0I0AABCcMsABHAjgHIillRBJMOAgyEEsECxIQQAAMgAhFUlI6SVBBWbAASwNLA4gJtEgjQyJC/8kiRwQoNhoBSSJZJAhLARUSRFcCAEk2GgJJTgJJIllJTgNJgSILJAhPAhUSRIgHDEsBiAczSwGIB0lMFUlOAiEECyEGCAuIB2siSUsDDEEAkksDVwIASwGBIguBIlhJVwAISwFXCAFFCUsBVwkIRQ1LAVcRCEUMSwFXGQhFC0yBiAJTRQdLAhZXBgJLBlAnEk8CUExQJxNMUElFCb1FAUEADIAIRVJSOkVBTFewAEsFQQArMgZLB0sLUEsMUCIWTEsBUEsLUExQTBZQJwgiSwhUUEsITL9JIwhFAUL/bDIHQv/SKzIHZycGMgdnI0MiKEk2GgFJIlkkCEsBFRJEVwIANhoCRwIiWUlOAiULJAhMFRJEiAdhQAAGiAeFQQB5I0AADIAIRVJSOk9BUk2wAEsCSYgGM0mIBkoVSUUFIQQLIQYISwELiAaPIkUFSwRLAQxBADlLAVcCAEsFJQslWEsEFlcGAksEUCcSTwJQTFAnE0xQSUUHvUUBQAAEJyKwAEsFvEhLBCMIRQVC/78rMgdnJwYyB2cjQyJC/4Q2GgFJFYEgEkQ2GgJJTgJJIllJTgOBIAtJTgMkCEwVEkQ2GgNJFSUSRBdMNhoESRUlEkQXTgKIBWcnCUxQSU4CvUUBQAAgFoACABJMUEsCFlBLBVBLAUm8SEy/KzIHZycGMgdnI0NLASQluhcSQAAMgAhFUlI6RUtGVrAASYEKJboXSwISQAAMgAhFUlI6RUtMVrAASwRXAgBLAUmBEiS6F0sBvUhLBghLAkzTSUsHCBZXBgJLAoESTwK7gSALgRQIIk8D0kL/kzYaAUkVgSASRCcJTFBJvUUBQAAEJyOwAIgF+EAADEmBCiW6FzIGDEEAFiNAAAQnJLAASbxIKzIHZycGMgdnI0MiQv/nIicOZUQnBUxQsCNDIkkoSTYaAUkiWUlOAiQLTEkVTFcCACJJSwUMQQAzRwIkC0sDSU8CWUlLB0lOBBJESwEVUkkVSwGBKFlJgSoSRExSIlmBLAgIRQUjCEUBQv/GSwMkCEsDEkQnB0UIIkUHSwZLBQxBAFpLBkkkC0sDSU8CWUsBFU8DIwhJRQpJJAtLBExZSwlPAglNUipMUElFCr1FAUEAGEsIvkQnDUxQSwhMI4jx1UUISwVFB0L/sYjyXycNTFBLCEwjiPG+RQhC/+YnBUsIULAjQyJHAihJNhoBRwIiWUlOAiQLTEkVTFcCACJJSwUMQQAkRwIkC0sDSU8CWUlLB0lOBBJESwEVUiJZJAgIRQUjCEUBQv/VSwMkCEsDEkQnB0UJIkUISwdLBQxJRQhBAGpLBkRLBUsIiPDMVwIAJw9MUElFDL1FAUEAPUsKvkQqTFBJRQu9RQFBABpLCb5EJw1MUEsJTCOI8RpFCUsHIwhFCEL/sYjxoicNTFBLCUwjiPEBRQlC/+SI8Y8nDUxQSwlMI4jw7kUJQv/RJwVLCVCwI0MiSShJNhoBRwIiWUlOAiQLTEkVTFcCACJJSwUMQQAkRwIkC0sDSU8CWUlLB0lOBBJESwEVUiJZJAgIRQUjCEUBQv/VSwMkCEsDEkQnB0UJIkUISwdLBQxJRQhBAFZLBkRLBUsIiO/9VwIAJwRMUElFC71FAUEAHksJvkRLCUkiWSMIFlcGAFwATFBFCUsHIwhFCEL/vUsISSJZIwgWVwYAXACACQAAAAAAAAAAAFBFCUL/2ScFSwlQsCNDIjYaAUkiWSQISwEVEkRXAgA2GgJHAiJZSU4CJQskCEwVEkQiFicHIklLBAxBAHVLBFcCAEsBJQslWEsGSRUWVwYCTFAnEk8CUExQJxNMUElFCL1FAUEAHUsGvkRLAkkiWSMIFlcGAFwATFBFAkkjCEUBQv+zIojwNEsDSU4CUEsBUEsBUEsBUEsBUExQJwhQSwJJIlkjCBZXBgBcAExQRQJC/8knBUsCULAjQyI2GgFHAiJZSU4CgSALJAhMFRJEJwciSUsDDEEAVksDVwIASwGBIAuBIFgnCUxQSUUGvUUBQQAZSwS+RCcNTFBLAkwjiO8zRQJJIwhFAUL/xksBgBYAAgASAAAAAAAAAAAAAAAAAAAAAAAAI4jvC0UCQv/VJwVLAlCwI0MiNhoBRwIiWUlOAoEgCyQITBUSRCcHIklLAwxBAERLA1cCAEsBgSALgSBYJxFMUElFBr1FAUEAHUsEvkRJFRZXBgJMUEsCTCOI7kxFAkkjCEUBQv/CSwEnByOI7jpFAkL/6ycFSwJQsCNDNhoBSSJZJAhLARUSRFcCADYaAkkVJRJEFzYaA0kiWSQISwEVEkRXAgA2GgRJFSUSRBdLAxUhBAuB5DJLAQhLBU8FiAEYTwQVIQQLIQVLAQghBk8FCIHUek8DCE8FgYBkC4GUoAEIJwRPB1C9TgZIMgGBtPIJCEsHCE8FFk8FFlBPBhZQTwQWUE8CFlBPAhZQJwgiTwRUUEwWUCcFTFCwI0OIAThAAAQnJLAAiYgBLUAABogBUUEAESNAAAyACEVSUjpPQVJQsACJIkL/7IoBACcEi/9QvUUBQAAMgAhFUlI6TkVTQ7AAiYoBACcEi/9QvkSBQFNBAAyACEVSUjpFU0NMsACJigEBKov/UL1FAUAABCcbsACL/4mKAQAiKWVEMgoTQQAWsSIpZUQyCov/sgiyB7IAI7IQIrIBs4mKAQAiKWVEMgoTQQASsSIpZUSL/7IIsgcjshAisgGziYoCAYEUi/8Li/4VCCEEC4H0rwIIiYoBAYv/FSEEC4HkMgiI/5exIillRIHwkwkyAQgiJxdlRElyCESyB0yyCEsBsgAjshAisgG2shiyAIAE2FzxhLIagQayECKyAbO0PklXBABMVwAEJwUSREkVJRJEF0kWJwhQJwSL/1BMv4kxACInDmVEEkAAGycRMQBQvUUBQQASJxExAFC+RCInFmVEEkEAAiOJIokxACInGGVEcghEEomKAgGL/iMSQQADMgOJi/4kEkEAAzIKiYv/iYoBAYv/OAAiKWVEEkEADIv/OCAyChJBAAIjiYv/OBCBBhJBACeL/zgYMggSQQAdi/84GyMSQQAUi/84GUAADYv/IsIaJxwSQQACI4kiiYoDAYv/QQAFi/5AAAIiiYv9i/4MQQACI4mL/Yv+CYv/DImKAQIoRwIqi/9QSb1JTwJIQAAKgAFgi/+MAYwAiYsDSYEJJboXjAJJgREluheMAEmBGyO6I1NMgRwluheMAUEAMTIGSYsCDUyLAYsAiP+PiwOBLCS6FyINJwgiiwRUI08EVCRPA1SBA08CVIv/jAGMAIkyB0L/zIoCAScEi/5QvkQiW3IITElPAkSxIillRDIQi/8iWUlOBAuyCLIAsgcjshAisgGzIosCiwEMQQApsYv/VwIAiwJJTgIlC1uyESKyEosASbIUsgCBBLIQIrIBsyMIjAJC/8+L/4wAiYoDASJJKEcCIicEi/1QvkQiW3IIRCKL/iJZiwcNQQCFi/5XAgCLB4ERC4ERWEmMACJbSYwCQAAhsSIpZUSLACVbsgiyB4sGsgAjshAisgGziwcjCIwHQv+9IillTIwBRIsAJVuMAyKMBIv/QQASiwCBgAFTQQAJIillRCOMBIwFsYsEQQAEiwWyFYsCshGLA7ISiwGyFIsGsgCBBLIQIrIBs0L/q4v+jACJigUCIkcLKEcci/wxAIj934v7FkxQi/0VFlcGAov9UElPAicLUExQi/wkEkEAA4j8TYsqiPysSYwqJxpLAWcqTFBJjAUiJboXSYwRQQVDixFyCEQnCkxnJwSL/VC+RCJbcghMjAJEIowUi/8iWYsUDUEBsIv/VwIAixSBEAuBEFhJjAAiW0mMJRYnEkxQiylQJxNMUEmMBr1FAUAABCcisACLBr5ESVcAAYwLSYERW4whSYEJW4wMSYEhW4wXSSNbjBlJgRlbjBVJgSlbjCKBiANTSYwoQQFEMgaMHYsLJxASQQB0iwyLIQmLACVbSYwnD0AABCcUsACLBkm+RIERW4snCBaBEUy7ix0WiwaBIU8Cu4slQQAmsSIpZUSLACVbiyWyEbISiwKyFLIAgQSyECKyAbOLFCMIjBRC/yyxIillRIsAJVuyCIsCsgeyACOyECKyAbNC/9yLC4ABAhJBAGeLKEEAVTIGSYsiCYsVGAmLFw1BAB6LAElXCAiMASVbiwwOQAAEJxSwAIsGgRGLAbtC/3SLDIshCYsAJVtJjCQPQAAEJxSwAIsGSb5EgRFbiyQIFoERTLtC/00yB0mLIgmLFRgJQv+oiwuAAQMSQf83iyhBAD8yBowQixCLFwmLFQqLDAuLIQhJixlJTgMNTE4CTUmMDYsAJVtJjCYPQAAEJxSwAIsNiyYJFosGgRFPArtC/vMyB4wQQv++MgeMHUL+uYsFgRsjukkjU4woJFNBAJ6I+4NAAJgnCTEGUL1FAUAABCcjsAAnCTEGUCQluhcyBg5AAAyACEVSUjpFWE5SsAAnCTEGUIEKJboXMgYPQAAMgAhFUlI6RVhYULAAJwkxBlCMCCKMEiKMFIsIgRIkuheLFA1BACCLFIEgC4EUCIsITIEgujILEkEAAyOMEosUIwiMFEL/04sSQAAMgAhFUlI6TkdSULAAJwkxBlC8SIsqiPujjCpJjAMiU0AABCcbsACLAyNTQQAEJyWwAIsDJFNBAAQnJrAAiyhBAosyBowQIowgIowbMRYjCIwWiyqMBIsWMgQMQQALixaI+ulBANMjjCCLIEAABCchsAAqiwRQSYwHgRsjuoEDU0EAgIGQAjIAC0mMGjEBDUEAbDEBsSInCmVEMQCL+3IIRIArcmVrZXlpbmcgdG8gcGx1Z2luIGFwcCAmIHJlaW1idXJzaW5nIGNhbGxlcrIFsiBPArIIsgeyACOyECKyAbMnFTEWZ4sHJSO6JxASQQAEKzIHZ4v+i/+MAYwAiYsaQv+RsSInCmVEi/tyCESAFnJla2V5aW5nIHRvIHBsdWdpbiBhcHCyBbIgSbIHsgAjshAisgGzQv+oixY4EIEGE0EADYsEixYjCIwWjARC/waLFjgYiyoiWxJAAAyACEVSUjpDQ09SsACLFjgZQQAMgAhFUlI6SU9DTrAAixY4GyMNQAAMgAhFUlI6SVNBR7AAixYjwhoXMggSQAAMgAhFUlI6SVNWTLAAiyqI+g+MKkkjU0sBJFOMH0yBA1OME0EABCclsACLH0EABCcmsACLE0EAz4v+IlmLGw1AAAyACEVSUjpNT0ZGsACL/lcCAIsbJQtbjB6LFiLCGkmMChWBBBJJjCNAAAyACEVSUjpJTVNMsACLI0QqiypQSYwFSYEbI7ojU0lOAowoix6BFAtJjA6BLgiBFLpJVwAEjAlJgQRbjA+BDFuMGEEAfTIGixiLD4j5RowciwmLChJBAGSLHEAAX4sPQQATiyhBAFAyBhaLDoE6CIsFTE8Cu4ABgCOLHFRJIlNMI1OMHEEALIscQAAnI0AADIAIRVJSOk1DTESwACqLKklOAlCLEBaBHEy7ixsjCIwbQv6MIkL/1jIHQv+tgAFAQv+6MgdC/4AyB4wQQv1yIillRCcKTGdC/IeKDgEiRwUoSYj214vyKBNJQQAPJw+L8lC9RQFBAAQnJ7AAi/cnEBJBAYSL9DIDEkEBfCNBAAyACEVSUjpaQURUsACL/EEBY4v0MgMTQQFbI0EADIAIRVJSOlVFS0ewAIv/QAEti/WMAYvzFov0UIsBSRUWVwYCTFBMJwtQTFBJjAIqTFBJjAS9RQFBAAQnJ7AAIhaMACcHjAUijAeL+iJZiwcNQQA0i/pXAgCLB0lOAoEMC4EMWElXAARMVwQIUIsAUIsFSSJZIwgWVwYAXABMUIwFIwiMB0L/wosFIlmLAUyI9rqLCEEACovyFSEECyEFCAiI9mSL9SgSQQBzIowGi/tBAGYyBov1KBMii/5PAk2LBhaL91CL+BZQi/kWUIACACxQJwgii/ZUI4v7VCSL/FSBA4v9VIEETwNUUIsAUEwWUIsFUIsESbxITL+LCEEACycPi/JQSbxIiwK/KzIHZycGMgdni/qMAIkyB0L/lycEi/VQSYwDvUUBQQALiwO+RCJbjAZC/3eL9Yj2JUL/84v1KBNAAAyACEVSUjpFUlNEsAAojAFC/r4iQv6iIkL+gQ==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
33
33
  var BinaryStateValue = class {
34
34
  constructor(value) {
35
35
  this.value = value;
@@ -15597,7 +15597,7 @@ var PaySiloFactoryPluginSDK = class extends BaseSDK {
15597
15597
  // src/generated/PollPluginContractClient.ts
15598
15598
  import { AppClient as _AppClient18 } from "@algorandfoundation/algokit-utils/app-client";
15599
15599
  import { AppFactory as _AppFactory18 } from "@algorandfoundation/algokit-utils/app-factory";
15600
- var APP_SPEC18 = { "name": "PollPluginContract", "structs": {}, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version" }, { "type": "uint64", "name": "factory" }, { "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "new", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxes", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "pollAppID" }, { "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "pollAppID" }, { "type": "uint64[]", "name": "votes" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 2, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "factory": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cG9sbF9mYWN0b3J5" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [440], "errorMessage": "Bytes has valid prefix" }, { "pc": [1001], "errorMessage": "ERR:NDAO" }, { "pc": [525, 767], "errorMessage": "ERR:NPLF" }, { "pc": [146, 358, 510, 517, 728, 752, 759, 772, 985], "errorMessage": "application exists" }, { "pc": [354, 514, 756, 781, 972], "errorMessage": "check GlobalState exists" }, { "pc": [295, 646], "errorMessage": "invalid array encoding" }, { "pc": [153, 252, 265, 309, 493, 601, 616, 660], "errorMessage": "invalid array length header" }, { "pc": [219, 469, 583], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [502], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [160, 258], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [680], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes>" }, { "pc": [329], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [609], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [171, 180, 210, 237, 245, 337, 459, 480, 574, 593, 965], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [229], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [445], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [654], "errorMessage": "invalid tail pointer for (len+(len+uint8[])[])" }, { "pc": [303], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMgogICAgYnl0ZWNibG9jayAicG9sbF9mYWN0b3J5IiAiYWtpdGFfZGFvIiAic3BlbmRpbmdfYWRkcmVzcyIgMHgxNTFmN2M3NSAiRVJSOk5QTEYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsUGx1Z2luQ29udHJhY3QgZXh0ZW5kcyBBa2l0YUJhc2VDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDkKICAgIHB1c2hieXRlc3MgMHgwZGZkZDlhMSAweDIzZDNhMmUxIDB4OWI3MDk2MTcgMHgzM2U5MmM5NCAweDg1NGRlZGUwIC8vIG1ldGhvZCAibmV3KHVpbnQ2NCxib29sLHVpbnQ4LHVpbnQ2NCx1aW50NjQsc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImRlbGV0ZUJveGVzKHVpbnQ2NCxib29sLHVpbnQ2NCxhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAidm90ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0W10sYnl0ZVtdW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBuZXcgZGVsZXRlQm94ZXMgdm90ZSB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVANwogICAgZXJyCgptYWluX29wVXBfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQxCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsUGx1Z2luQ29udHJhY3QgZXh0ZW5kcyBBa2l0YUJhc2VDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHg4OGM5NDBmOCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWtleUFkZHJlc3MocmVrZXlCYWNrOiB1aW50NjQsIHdhbGxldDogdWludDY0KSAtPiBieXRlczoKcmVrZXlBZGRyZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjUKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZWtleUFkZHJlc3MocmVrZXlCYWNrOiBib29sZWFuLCB3YWxsZXQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzI2CiAgICAvLyBpZiAoIXJla2V5QmFjaykgewogICAgZnJhbWVfZGlnIC0yCiAgICBibnogcmVrZXlBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjcKICAgIC8vIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgpyZWtleUFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMzAKICAgIC8vIHJldHVybiB3YWxsZXQuYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBmYWN0b3J5ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBQb2xsUGx1Z2luR2xvYmFsU3RhdGVLZXlGYWN0b3J5IH0pCiAgICBieXRlY18wIC8vICJwb2xsX2ZhY3RvcnkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjkKICAgIC8vIHRoaXMuZmFjdG9yeS52YWx1ZSA9IEFwcGxpY2F0aW9uKGZhY3RvcnkpCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czozMAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5uZXdbcm91dGluZ10oKSAtPiB2b2lkOgpuZXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MzUtNDQKICAgIC8vIG5ldygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpuZXdfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IG5ld19hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdXRmOFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbmV3X2Zvcl9oZWFkZXJAMQoKbmV3X2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzdHJpbmc+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMTIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzIgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTAtNTIKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIHBvbGwuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBwb2xsLmdsb2JhbEJ5dGVzKSArCiAgICBwdXNoaW50IDgxMzUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo1MC01MwogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBmYWN0b3J5ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBQb2xsUGx1Z2luR2xvYmFsU3RhdGVLZXlGYWN0b3J5IH0pCiAgICBieXRlY18wIC8vICJwb2xsX2ZhY3RvcnkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjItNzUKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBQb2xsRmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZmFjdG9yeS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdHlwZSwKICAgIC8vICAgICBlbmRUaW1lLAogICAgLy8gICAgIG1heFNlbGVjdGVkLAogICAgLy8gICAgIHF1ZXN0aW9uLAogICAgLy8gICAgIG9wdGlvbnMsCiAgICAvLyAgICAgZ2F0ZUlECiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTYtNjAKICAgIC8vIGNvbnN0IG1iclBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogYW1vdW50LAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo2Mi03NQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIFBvbGxGYWN0b3J5LnByb3RvdHlwZS5uZXc+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogdGhpcy5mYWN0b3J5LnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICB0eXBlLAogICAgLy8gICAgIGVuZFRpbWUsCiAgICAvLyAgICAgbWF4U2VsZWN0ZWQsCiAgICAvLyAgICAgcXVlc3Rpb24sCiAgICAvLyAgICAgb3B0aW9ucywKICAgIC8vICAgICBnYXRlSUQKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo3NAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjItNzUKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBQb2xsRmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZmFjdG9yeS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdHlwZSwKICAgIC8vICAgICBlbmRUaW1lLAogICAgLy8gICAgIG1heFNlbGVjdGVkLAogICAgLy8gICAgIHF1ZXN0aW9uLAogICAgLy8gICAgIG9wdGlvbnMsCiAgICAvLyAgICAgZ2F0ZUlECiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MTE5YmM2OTggLy8gbWV0aG9kICJuZXcocGF5LHVpbnQ4LHVpbnQ2NCx1aW50NjQsc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5kZWxldGVCb3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZUJveGVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBkZWxldGVCb3hlcyh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCBhZGRyZXNzZXM6IEFjY291bnRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzIgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGxvZ2dlZEFzc2VydChBcHBsaWNhdGlvbihwb2xsQXBwSUQpLmNyZWF0b3IgPT09IHRoaXMuZmFjdG9yeS52YWx1ZS5hZGRyZXNzLCBFUlJfQ1JFQVRPUl9OT1RfUE9MTF9GQUNUT1JZKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogUG9sbFBsdWdpbkdsb2JhbFN0YXRlS2V5RmFjdG9yeSB9KQogICAgYnl0ZWNfMCAvLyAicG9sbF9mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBsb2dnZWRBc3NlcnQoQXBwbGljYXRpb24ocG9sbEFwcElEKS5jcmVhdG9yID09PSB0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgRVJSX0NSRUFUT1JfTk9UX1BPTExfRkFDVE9SWSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA0IC8vICJFUlI6TlBMRiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOUExGCgpkZWxldGVCb3hlc19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo4My04OAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZGVsZXRlQm94ZXM+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMwogICAgZGlnIDUKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo4My04OAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZGVsZXRlQm94ZXM+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhlMTQxOTA4MCAvLyBtZXRob2QgImRlbGV0ZUJveGVzKGFkZHJlc3NbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gZGVsZXRlQm94ZXMod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgYWRkcmVzc2VzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC52b3RlW3JvdXRpbmddKCkgLT4gdm9pZDoKdm90ZToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZSh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCB2b3RlczogdWludDY0W10sIGFyZ3M6IEdhdGVBcmdzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZSh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCB2b3RlczogdWludDY0W10sIGFyZ3M6IEdhdGVBcmdzKTogdm9pZCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1aW50OFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGUod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgdm90ZXM6IHVpbnQ2NFtdLCBhcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGJ5dGVzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgcHVzaGJ5dGVzICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18yIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3NQogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICBwdXNoYnl0ZXMgInJlZmVycmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjIKICAgIC8vIHdhbGxldEFkZHJlc3M6IHdhbGxldC5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjEtMjY2CiAgICAvLyByZXR1cm4gewogICAgLy8gICB3YWxsZXRBZGRyZXNzOiB3YWxsZXQuYWRkcmVzcywKICAgIC8vICAgb3JpZ2luLAogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlZmVycmVyCiAgICAvLyB9CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCB7IG9yaWdpbiwgc2VuZGVyIH0gPSBnZXRBY2NvdW50cyh3YWxsZXQpCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIGJ1cnkgMTMKICAgIGV4dHJhY3QgNjQgMzIKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gbG9nZ2VkQXNzZXJ0KEFwcGxpY2F0aW9uKHBvbGxBcHBJRCkuY3JlYXRvciA9PT0gdGhpcy5mYWN0b3J5LnZhbHVlLmFkZHJlc3MsIEVSUl9DUkVBVE9SX05PVF9QT0xMX0ZBQ1RPUlkpCiAgICBkaWcgNwogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogUG9sbFBsdWdpbkdsb2JhbFN0YXRlS2V5RmFjdG9yeSB9KQogICAgYnl0ZWNfMCAvLyAicG9sbF9mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBsb2dnZWRBc3NlcnQoQXBwbGljYXRpb24ocG9sbEFwcElEKS5jcmVhdG9yID09PSB0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgRVJSX0NSRUFUT1JfTk9UX1BPTExfRkFDVE9SWSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHZvdGVfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDQgLy8gIkVSUjpOUExGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5QTEYKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb2xsQXBwSUQpLmFkZHJlc3MsCiAgICBkaWcgNwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gaWYgKGFyZ3MubGVuZ3RoID4gMCkgewogICAgZGlnIDUKICAgIGJ6IHZvdGVfZWxzZV9ib2R5QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyBjb25zdCBnYXRlID0gZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHBvbGxBcHBJRCwgQnl0ZXMoUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEKSlbMF0KICAgIGRpZyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hieXRlcyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMDYtMTI1CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQb2xsLnByb3RvdHlwZS5nYXRlZFZvdGU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgICAgbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICAvLyAgICAgICAgIG9yaWdpbiwKICAgIC8vICAgICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgICAgICBdCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdm90ZXMKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gYW1vdW50OiB2b3Rlc01CUgogICAgcHVzaGludCAxNTMwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTYtMTAwCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocG9sbEFwcElEKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHZvdGVzTUJSCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMS0xMjAKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBnYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KSwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNwogICAgLy8gZ2F0ZUlELAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMS0xMjAKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBnYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTA2LTEyNQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZ2F0ZWRWb3RlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHBvbGxBcHBJRCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgICAgICBvcmlnaW4sCiAgICAvLyAgICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICAgICAgXQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHZvdGVzCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9CiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTAKICAgIGRpZyAxMgogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNi0xMjUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFBvbGwucHJvdG90eXBlLmdhdGVkVm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFwcElkOiBnYXRlLAogICAgLy8gICAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICAgICAgb3JpZ2luLAogICAgLy8gICAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICAgIGVuY29kZUFyYzQoYXJncykKICAgIC8vICAgICAgIF0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB2b3RlcwogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4NWJjZjkxMDAgLy8gbWV0aG9kICJnYXRlZFZvdGUocGF5LGFwcGwsdWludDY0W10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp2b3RlX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGUod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgdm90ZXM6IHVpbnQ2NFtdLCBhcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdm90ZV9lbHNlX2JvZHlAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI3LTEzMgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUudm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFttYnJQYXltZW50LCB2b3Rlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBhbW91bnQ6IHZvdGVzTUJSCiAgICBwdXNoaW50IDE1MzAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEwCiAgICBkdXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTYtMTAwCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocG9sbEFwcElEKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHZvdGVzTUJSCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNy0xMzIKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFBvbGwucHJvdG90eXBlLnZvdGU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbbWJyUGF5bWVudCwgdm90ZXNdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyA5CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI3LTEzMgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUudm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFttYnJQYXltZW50LCB2b3Rlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4ZGQzMDljN2IgLy8gbWV0aG9kICJ2b3RlKHBheSx1aW50NjRbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdm90ZV9hZnRlcl9pZl9lbHNlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAEAAEIAiYFDHBvbGxfZmFjdG9yeQlha2l0YV9kYW8Qc3BlbmRpbmdfYWRkcmVzcwQVH3x1CEVSUjpOUExGMRkURDEYQQAtggUEDf3ZoQQj06LhBJtwlhcEM+kslASFTe3gNhoAjgUAWQFSAcMDTAABACNDgASIyUD4NhoAjgEAEgCKAgGL/kAAAzIDiYv/cghEiTYaAUkiWSUISwEVEkRXAgA2GgJJFSQSRBc2GgNJFSQSRBeAB3ZlcnNpb25PA2coTwJnKUxnI0M2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUjEkQ2GgRJFSQSRDYaBUkVJBJENhoGRwIiWSUITBUSRDYaB0cCIllJTgIlC0xJFUxXAgAiSUsFDEEAJEcCJQtLA0lPAllJSwdJTgQSREsBFVIiWSUICEUFIwhFAUL/1UsDJQhLAxJENhoISRUkEkRLDEkqZUiBvNMxMgEIIihlRElyCESxTwKyCLIHSwGyACOyECKyAbZLDk8DiP8DsiCyGLIAgAQRm8aYshpLCrIaSwmyGksIshpLB7IaSwayGrIagQayECKyAbO0PklXBABMVwAEKxJESRUkEkQrTFCwI0M2GgFJFSQSRBdJNhoCSRUjEkQiU0w2GgNJFSQSRBdJTgI2GgRJTgNJIlmBIAslCEwVEkRMKmVITHIHRCIoZURyCEQSQAAEJwSwALFLA0sFiP5tsiBLArIYSbIAgAThQZCAshpLAbIagQayECKyAbMjQyJJNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJEFzYaBEcCIlkkCyUITBUSRDYaBUcCIllJTgIlC0xJFUxXAgAiSUsFDEEAJEcCJQtLA0lPAllJSwdJTgQSREsBFVIiWSUICEUFIwhFAUL/1UsDJQhLAxJESwlJgBJjb250cm9sbGVkX2FkZHJlc3NlSExJKmVITEmACHJlZmVycmVyZUhMcghETwNQTwJQTFBJVyAgRQ1XQCBFC0sHcgdEIihlRHIIRBJAAAQnBLAASwdyCERLBUEAeiIpZUSAA2FhbGVIgShbSwlJTgKAB2dhdGVfaWRlSLGBxHeyCE8DsgdLDUlOArIAI7IQIrIBthaABEOSJlWyGksPshqyGksIshpMshhJsgCBBrIQIrIBtksKSwyI/RuyILIAshiABFvPkQCyGksGshqBBrIQIrIBsyNDsYHEd7IIsgdLCkmyACOyECKyAbZLCUsLiPzksiBLCLIYsgCABN0wnHuyGksGshqBBrIQIrIBs0L/xDYaAUkVJBJEFzEAIillRIAGd2FsbGV0ZUhyCEQSQAAMgAhFUlI6TkRBT7AAKUsBZyND", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
15600
+ var APP_SPEC18 = { "name": "PollPluginContract", "structs": {}, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version" }, { "type": "uint64", "name": "factory" }, { "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "new", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxes", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "pollAppID" }, { "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "pollAppID" }, { "type": "uint64[]", "name": "votes" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 2, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "factory": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cG9sbF9mYWN0b3J5" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [440], "errorMessage": "Bytes has valid prefix" }, { "pc": [1001], "errorMessage": "ERR:NDAO" }, { "pc": [525, 767], "errorMessage": "ERR:NPLF" }, { "pc": [146, 358, 510, 517, 728, 752, 759, 772, 985], "errorMessage": "application exists" }, { "pc": [354, 514, 756, 781, 972], "errorMessage": "check GlobalState exists" }, { "pc": [295, 646], "errorMessage": "invalid array encoding" }, { "pc": [153, 252, 265, 309, 493, 601, 616, 660], "errorMessage": "invalid array length header" }, { "pc": [219, 469, 583], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [502], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [160, 258], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [680], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes>" }, { "pc": [329], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [609], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [171, 180, 210, 237, 245, 337, 459, 480, 574, 593, 965], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [229], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [445], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [654], "errorMessage": "invalid tail pointer for (len+(len+uint8[])[])" }, { "pc": [303], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMgogICAgYnl0ZWNibG9jayAicG9sbF9mYWN0b3J5IiAiYWtpdGFfZGFvIiAic3BlbmRpbmdfYWRkcmVzcyIgMHgxNTFmN2M3NSAiRVJSOk5QTEYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsUGx1Z2luQ29udHJhY3QgZXh0ZW5kcyBBa2l0YUJhc2VDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDkKICAgIHB1c2hieXRlc3MgMHgwZGZkZDlhMSAweDIzZDNhMmUxIDB4OWI3MDk2MTcgMHgzM2U5MmM5NCAweDg1NGRlZGUwIC8vIG1ldGhvZCAibmV3KHVpbnQ2NCxib29sLHVpbnQ4LHVpbnQ2NCx1aW50NjQsc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImRlbGV0ZUJveGVzKHVpbnQ2NCxib29sLHVpbnQ2NCxhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAidm90ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0W10sYnl0ZVtdW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBuZXcgZGVsZXRlQm94ZXMgdm90ZSB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVANwogICAgZXJyCgptYWluX29wVXBfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQxCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsUGx1Z2luQ29udHJhY3QgZXh0ZW5kcyBBa2l0YUJhc2VDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHg4OGM5NDBmOCAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWtleUFkZHJlc3MocmVrZXlCYWNrOiB1aW50NjQsIHdhbGxldDogdWludDY0KSAtPiBieXRlczoKcmVrZXlBZGRyZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjUKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZWtleUFkZHJlc3MocmVrZXlCYWNrOiBib29sZWFuLCB3YWxsZXQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzI2CiAgICAvLyBpZiAoIXJla2V5QmFjaykgewogICAgZnJhbWVfZGlnIC0yCiAgICBibnogcmVrZXlBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjcKICAgIC8vIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgpyZWtleUFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMzAKICAgIC8vIHJldHVybiB3YWxsZXQuYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBmYWN0b3J5ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBQb2xsUGx1Z2luR2xvYmFsU3RhdGVLZXlGYWN0b3J5IH0pCiAgICBieXRlY18wIC8vICJwb2xsX2ZhY3RvcnkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjkKICAgIC8vIHRoaXMuZmFjdG9yeS52YWx1ZSA9IEFwcGxpY2F0aW9uKGZhY3RvcnkpCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czozMAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5uZXdbcm91dGluZ10oKSAtPiB2b2lkOgpuZXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MzUtNDQKICAgIC8vIG5ldygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpuZXdfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IG5ld19hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdXRmOFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbmV3X2Zvcl9oZWFkZXJAMQoKbmV3X2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzdHJpbmc+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMTIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzIgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTAtNTIKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIHBvbGwuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBwb2xsLmdsb2JhbEJ5dGVzKSArCiAgICBwdXNoaW50IDg2MzUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo1MC01MwogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBmYWN0b3J5ID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBQb2xsUGx1Z2luR2xvYmFsU3RhdGVLZXlGYWN0b3J5IH0pCiAgICBieXRlY18wIC8vICJwb2xsX2ZhY3RvcnkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjItNzUKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBQb2xsRmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZmFjdG9yeS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdHlwZSwKICAgIC8vICAgICBlbmRUaW1lLAogICAgLy8gICAgIG1heFNlbGVjdGVkLAogICAgLy8gICAgIHF1ZXN0aW9uLAogICAgLy8gICAgIG9wdGlvbnMsCiAgICAvLyAgICAgZ2F0ZUlECiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NTYtNjAKICAgIC8vIGNvbnN0IG1iclBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbih0aGlzLmZhY3RvcnkudmFsdWUuaWQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogYW1vdW50LAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo2Mi03NQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIFBvbGxGYWN0b3J5LnByb3RvdHlwZS5uZXc+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogdGhpcy5mYWN0b3J5LnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICB0eXBlLAogICAgLy8gICAgIGVuZFRpbWUsCiAgICAvLyAgICAgbWF4U2VsZWN0ZWQsCiAgICAvLyAgICAgcXVlc3Rpb24sCiAgICAvLyAgICAgb3B0aW9ucywKICAgIC8vICAgICBnYXRlSUQKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo3NAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjItNzUKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBQb2xsRmFjdG9yeS5wcm90b3R5cGUubmV3Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHRoaXMuZmFjdG9yeS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgdHlwZSwKICAgIC8vICAgICBlbmRUaW1lLAogICAgLy8gICAgIG1heFNlbGVjdGVkLAogICAgLy8gICAgIHF1ZXN0aW9uLAogICAgLy8gICAgIG9wdGlvbnMsCiAgICAvLyAgICAgZ2F0ZUlECiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MTE5YmM2OTggLy8gbWV0aG9kICJuZXcocGF5LHVpbnQ4LHVpbnQ2NCx1aW50NjQsc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjM1LTQ0CiAgICAvLyBuZXcoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC5kZWxldGVCb3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZUJveGVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBkZWxldGVCb3hlcyh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCBhZGRyZXNzZXM6IEFjY291bnRbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzIgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGxvZ2dlZEFzc2VydChBcHBsaWNhdGlvbihwb2xsQXBwSUQpLmNyZWF0b3IgPT09IHRoaXMuZmFjdG9yeS52YWx1ZS5hZGRyZXNzLCBFUlJfQ1JFQVRPUl9OT1RfUE9MTF9GQUNUT1JZKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogUG9sbFBsdWdpbkdsb2JhbFN0YXRlS2V5RmFjdG9yeSB9KQogICAgYnl0ZWNfMCAvLyAicG9sbF9mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBsb2dnZWRBc3NlcnQoQXBwbGljYXRpb24ocG9sbEFwcElEKS5jcmVhdG9yID09PSB0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgRVJSX0NSRUFUT1JfTk9UX1BPTExfRkFDVE9SWSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA0IC8vICJFUlI6TlBMRiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOUExGCgpkZWxldGVCb3hlc19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo4My04OAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZGVsZXRlQm94ZXM+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMwogICAgZGlnIDUKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo4My04OAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZGVsZXRlQm94ZXM+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhlMTQxOTA4MCAvLyBtZXRob2QgImRlbGV0ZUJveGVzKGFkZHJlc3NbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gZGVsZXRlQm94ZXMod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgYWRkcmVzc2VzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGxQbHVnaW5Db250cmFjdC52b3RlW3JvdXRpbmddKCkgLT4gdm9pZDoKdm90ZToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZSh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCB2b3RlczogdWludDY0W10sIGFyZ3M6IEdhdGVBcmdzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx1aW50NjQ+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZSh3YWxsZXQ6IEFwcGxpY2F0aW9uLCByZWtleUJhY2s6IGJvb2xlYW4sIHBvbGxBcHBJRDogdWludDY0LCB2b3RlczogdWludDY0W10sIGFyZ3M6IEdhdGVBcmdzKTogdm9pZCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1aW50OFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGUod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgdm90ZXM6IHVpbnQ2NFtdLCBhcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGJ5dGVzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgcHVzaGJ5dGVzICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18yIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3NQogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICBwdXNoYnl0ZXMgInJlZmVycmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjIKICAgIC8vIHdhbGxldEFkZHJlc3M6IHdhbGxldC5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjEtMjY2CiAgICAvLyByZXR1cm4gewogICAgLy8gICB3YWxsZXRBZGRyZXNzOiB3YWxsZXQuYWRkcmVzcywKICAgIC8vICAgb3JpZ2luLAogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlZmVycmVyCiAgICAvLyB9CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyBjb25zdCB7IG9yaWdpbiwgc2VuZGVyIH0gPSBnZXRBY2NvdW50cyh3YWxsZXQpCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIGJ1cnkgMTMKICAgIGV4dHJhY3QgNjQgMzIKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gbG9nZ2VkQXNzZXJ0KEFwcGxpY2F0aW9uKHBvbGxBcHBJRCkuY3JlYXRvciA9PT0gdGhpcy5mYWN0b3J5LnZhbHVlLmFkZHJlc3MsIEVSUl9DUkVBVE9SX05PVF9QT0xMX0ZBQ1RPUlkpCiAgICBkaWcgNwogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZmFjdG9yeSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogUG9sbFBsdWdpbkdsb2JhbFN0YXRlS2V5RmFjdG9yeSB9KQogICAgYnl0ZWNfMCAvLyAicG9sbF9mYWN0b3J5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBsb2dnZWRBc3NlcnQoQXBwbGljYXRpb24ocG9sbEFwcElEKS5jcmVhdG9yID09PSB0aGlzLmZhY3RvcnkudmFsdWUuYWRkcmVzcywgRVJSX0NSRUFUT1JfTk9UX1BPTExfRkFDVE9SWSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHZvdGVfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDQgLy8gIkVSUjpOUExGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5QTEYKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb2xsQXBwSUQpLmFkZHJlc3MsCiAgICBkaWcgNwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gaWYgKGFyZ3MubGVuZ3RoID4gMCkgewogICAgZGlnIDUKICAgIGJ6IHZvdGVfZWxzZV9ib2R5QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyBjb25zdCBnYXRlID0gZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHBvbGxBcHBJRCwgQnl0ZXMoUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEKSlbMF0KICAgIGRpZyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hieXRlcyAiZ2F0ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMDYtMTI1CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQb2xsLnByb3RvdHlwZS5nYXRlZFZvdGU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgbWJyUGF5bWVudCwKICAgIC8vICAgICBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgICAgbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICAvLyAgICAgICAgIG9yaWdpbiwKICAgIC8vICAgICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgICAgICBdCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdm90ZXMKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gYW1vdW50OiB2b3Rlc01CUgogICAgcHVzaGludCAxNTMwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTYtMTAwCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocG9sbEFwcElEKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHZvdGVzTUJSCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMS0xMjAKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBnYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KSwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNwogICAgLy8gZ2F0ZUlELAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMS0xMjAKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBnYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTA2LTEyNQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUuZ2F0ZWRWb3RlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IHBvbGxBcHBJRCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG1iclBheW1lbnQsCiAgICAvLyAgICAgaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgICAgICBvcmlnaW4sCiAgICAvLyAgICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICAgICAgXQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHZvdGVzCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9CiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3BvbGwvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTAKICAgIGRpZyAxMgogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNi0xMjUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFBvbGwucHJvdG90eXBlLmdhdGVkVm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBtYnJQYXltZW50LAogICAgLy8gICAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFwcElkOiBnYXRlLAogICAgLy8gICAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICAgICAgb3JpZ2luLAogICAgLy8gICAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICAgIGVuY29kZUFyYzQoYXJncykKICAgIC8vICAgICAgIF0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB2b3RlcwogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4NWJjZjkxMDAgLy8gbWV0aG9kICJnYXRlZFZvdGUocGF5LGFwcGwsdWludDY0W10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp2b3RlX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGUod2FsbGV0OiBBcHBsaWNhdGlvbiwgcmVrZXlCYWNrOiBib29sZWFuLCBwb2xsQXBwSUQ6IHVpbnQ2NCwgdm90ZXM6IHVpbnQ2NFtdLCBhcmdzOiBHYXRlQXJncyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdm90ZV9lbHNlX2JvZHlAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI3LTEzMgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUudm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFttYnJQYXltZW50LCB2b3Rlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBhbW91bnQ6IHZvdGVzTUJSCiAgICBwdXNoaW50IDE1MzAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEwCiAgICBkdXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTYtMTAwCiAgICAvLyBjb25zdCBtYnJQYXltZW50ID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogQXBwbGljYXRpb24ocG9sbEFwcElEKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHZvdGVzTUJSCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNy0xMzIKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFBvbGwucHJvdG90eXBlLnZvdGU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogcG9sbEFwcElELAogICAgLy8gICBhcmdzOiBbbWJyUGF5bWVudCwgdm90ZXNdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyA5CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI3LTEzMgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUG9sbC5wcm90b3R5cGUudm90ZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBwb2xsQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFttYnJQYXltZW50LCB2b3Rlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4ZGQzMDljN2IgLy8gbWV0aG9kICJ2b3RlKHBheSx1aW50NjRbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdm90ZV9hZnRlcl9pZl9lbHNlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMSAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAEAAEIAiYFDHBvbGxfZmFjdG9yeQlha2l0YV9kYW8Qc3BlbmRpbmdfYWRkcmVzcwQVH3x1CEVSUjpOUExGMRkURDEYQQAtggUEDf3ZoQQj06LhBJtwlhcEM+kslASFTe3gNhoAjgUAWQFSAcMDTAABACNDgASIyUD4NhoAjgEAEgCKAgGL/kAAAzIDiYv/cghEiTYaAUkiWSUISwEVEkRXAgA2GgJJFSQSRBc2GgNJFSQSRBeAB3ZlcnNpb25PA2coTwJnKUxnI0M2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUjEkQ2GgRJFSQSRDYaBUkVJBJENhoGRwIiWSUITBUSRDYaB0cCIllJTgIlC0xJFUxXAgAiSUsFDEEAJEcCJQtLA0lPAllJSwdJTgQSREsBFVIiWSUICEUFIwhFAUL/1UsDJQhLAxJENhoISRUkEkRLDEkqZUiBjNo0MgEIIihlRElyCESxTwKyCLIHSwGyACOyECKyAbZLDk8DiP8DsiCyGLIAgAQRm8aYshpLCrIaSwmyGksIshpLB7IaSwayGrIagQayECKyAbO0PklXBABMVwAEKxJESRUkEkQrTFCwI0M2GgFJFSQSRBdJNhoCSRUjEkQiU0w2GgNJFSQSRBdJTgI2GgRJTgNJIlmBIAslCEwVEkRMKmVITHIHRCIoZURyCEQSQAAEJwSwALFLA0sFiP5tsiBLArIYSbIAgAThQZCAshpLAbIagQayECKyAbMjQyJJNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJEFzYaBEcCIlkkCyUITBUSRDYaBUcCIllJTgIlC0xJFUxXAgAiSUsFDEEAJEcCJQtLA0lPAllJSwdJTgQSREsBFVIiWSUICEUFIwhFAUL/1UsDJQhLAxJESwlJgBJjb250cm9sbGVkX2FkZHJlc3NlSExJKmVITEmACHJlZmVycmVyZUhMcghETwNQTwJQTFBJVyAgRQ1XQCBFC0sHcgdEIihlRHIIRBJAAAQnBLAASwdyCERLBUEAeiIpZUSAA2FhbGVIgShbSwlJTgKAB2dhdGVfaWRlSLGBxHeyCE8DsgdLDUlOArIAI7IQIrIBthaABEOSJlWyGksPshqyGksIshpMshhJsgCBBrIQIrIBtksKSwyI/RuyILIAshiABFvPkQCyGksGshqBBrIQIrIBsyNDsYHEd7IIsgdLCkmyACOyECKyAbZLCUsLiPzksiBLCLIYsgCABN0wnHuyGksGshqBBrIQIrIBs0L/xDYaAUkVJBJEFzEAIillRIAGd2FsbGV0ZUhyCEQSQAAMgAhFUlI6TkRBT7AAKUsBZyND", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
15601
15601
  var PollPluginContractParamsFactory = class _PollPluginContractParamsFactory {
15602
15602
  /**
15603
15603
  * Gets available create ABI call param factories
@@ -22381,7 +22381,7 @@ var StakingPoolPluginSDK = class extends BaseSDK {
22381
22381
  import { ABIStructType as ABIStructType11, getStructValueFromTupleValue as getStructValueFromTupleValue11 } from "@algorandfoundation/algokit-utils/abi";
22382
22382
  import { AppClient as _AppClient24 } from "@algorandfoundation/algokit-utils/app-client";
22383
22383
  import { AppFactory as _AppFactory24 } from "@algorandfoundation/algokit-utils/app-factory";
22384
- var APP_SPEC24 = { "name": "SubscriptionsPlugin", "structs": { "SubscriptionKey": [{ "name": "address", "type": "address" }, { "name": "id", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "uint64", "name": "akitaDAO" }, { "type": "string", "name": "version" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "optIn", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "asset" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt the subscriptions contract (and its revenue escrow + split\nrecipients) into `asset`, funded by the user's wallet.\n\nReads `optInCost` from the subscriptions contract to size the\npayment, then forwards a correctly-sized payment to\n`Subscriptions.optIn`. The contract's base-class `optIn` performs\nthe contract's own asset opt-in and \u2014 because the subscriptions\ncontract has a named revenue escrow configured\n(`this.akitaDAOEscrow.value.name !== ''`) \u2014 also rekeys the DAO\nwallet to the revenue-manager plugin to opt the escrow and split\nrecipients in. That DAO-wallet rekey is on a different\nAbstractedAccount instance than this plugin's rekey on the caller's\nwallet, so there is no nesting conflict.", "events": [], "recommendations": {} }, { "name": "initDescription", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "uint64", "name": "size" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadDescription", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "newService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "interval" }, { "type": "uint64", "name": "asset" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "passes" }, { "type": "uint64", "name": "gate" }, { "type": "address", "name": "payoutAddress" }, { "type": "string", "name": "title" }, { "type": "byte[36]", "name": "bannerImage" }, { "type": "uint8", "name": "highlightMessage" }, { "type": "byte[3]", "name": "highlightColor" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "pauseService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "id" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "shutdownService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "index" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "block", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "unblock", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "subscribe", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "asset" }, { "type": "address", "name": "recipient" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "interval" }, { "type": "uint64", "name": "index" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "triggerPayment", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }, { "type": "uint64", "name": "id" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "streakCheck", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "(address,uint64)", "struct": "SubscriptionKey", "name": "key" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setPasses", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "id" }, { "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": { "description": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZA==" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [993], "errorMessage": "Box must have value" }, { "pc": [372, 902, 1165, 1818, 1923, 2120, 2241, 2363, 2455, 2663, 2757], "errorMessage": "Bytes has valid prefix" }, { "pc": [459, 535], "errorMessage": "ERR:BDLN" }, { "pc": [633], "errorMessage": "ERR:DNIT" }, { "pc": [613, 843], "errorMessage": "ERR:ICOR" }, { "pc": [3111], "errorMessage": "ERR:NDAO" }, { "pc": [247, 384, 914, 1431, 1733, 1846, 1986, 2010, 2133, 2260, 2284, 2377, 3095], "errorMessage": "application exists" }, { "pc": [326, 847, 1266, 1343, 1420, 1519, 1758, 1843, 1871, 2591, 2608, 2930, 3024, 3082], "errorMessage": "check GlobalState exists" }, { "pc": [1666, 2544], "errorMessage": "invalid array encoding" }, { "pc": [263, 508, 739, 1634, 1680, 1943, 1964, 2512, 2558, 2666, 3003], "errorMessage": "invalid array length header" }, { "pc": [307, 666, 1246, 1323, 1400, 1498, 1581, 2485, 2909, 2987], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [3014], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [271, 516, 746], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [1702, 2580], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes>" }, { "pc": [730, 1411, 1509, 1601, 2496], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [757], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 36>" }, { "pc": [778], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 3>" }, { "pc": [256, 298, 317, 438, 446, 492, 500, 656, 679, 689, 699, 709, 719, 1237, 1256, 1314, 1333, 1391, 1489, 1572, 1591, 1610, 1619, 1627, 2476, 2504, 2900, 2978, 2997, 3075], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [767], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [1823], "errorMessage": "invalid number of bytes for bool" }, { "pc": [2673], "errorMessage": "invalid number of bytes for bytes" }, { "pc": [1970], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::Service" }, { "pc": [2762], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::SubscriptionInfoWithExistence" }, { "pc": [2920], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::SubscriptionKey" }, { "pc": [377, 907, 1170, 2124, 2245, 2367, 2459], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [1935], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint64,uint64,uint64,uint64,uint64,uint8[32],(len+utf8[]),(len+utf8[]),uint8[36],uint8,uint8[3])" }, { "pc": [1956], "errorMessage": "invalid tail pointer at index 8 of (uint8,uint64,uint64,uint64,uint64,uint64,uint8[32],(len+utf8[]),(len+utf8[]),uint8[36],uint8,uint8[3])" }, { "pc": [1674, 2552], "errorMessage": "invalid tail pointer for (len+(len+uint8[])[])" }, { "pc": [1930, 1951], "errorMessage": "invalid tuple encoding" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNiAyMDM0CiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJhYWwiIDB4MTUxZjdjNzUgInNwZW5kaW5nX2FkZHJlc3MiICJkIiAweDE3OTVhMGQwIDB4NDM5MjI2NTUgMHhkMTA3OWNhZSAweGNmMTYwMTFkICJFUlI6QkRMTiIgIkVSUjpJQ09SIiAiY29udHJvbGxlZF9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE4CiAgICAvLyBleHBvcnQgY2xhc3MgU3Vic2NyaXB0aW9uc1BsdWdpbiBleHRlbmRzIGNsYXNzZXMoQmFzZVN1YnNjcmlwdGlvbnMsIEFraXRhQmFzZUNvbnRyYWN0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIwCiAgICBwdXNoYnl0ZXMgMHhiYTk3M2NkMCAvLyBtZXRob2QgIm9wdEluKHVpbnQ2NCxib29sLHVpbnQ2NCl2b2lkIgogICAgYnl0ZWMgNyAvLyBtZXRob2QgImluaXREZXNjcmlwdGlvbih1aW50NjQsdWludDY0KXZvaWQiCiAgICBieXRlYyA4IC8vIG1ldGhvZCAibG9hZERlc2NyaXB0aW9uKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4YjZhYWMzOWQgMHgzOWEzYWU0NyAweDE5YjFmYzJiIDB4YmVjODZjMzQgMHg5ZjU5YTk3MCAweGM5Y2NhNDVjIDB4MjNlMzM3YmQgMHhlYTIxNzhhYSAweDFjNDI0NjFiIDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgIm5ld1NlcnZpY2UodWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHN0cmluZyxieXRlWzM2XSx1aW50OCxieXRlWzNdKXVpbnQ2NCIsIG1ldGhvZCAicGF1c2VTZXJ2aWNlKHVpbnQ2NCxib29sLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzaHV0ZG93blNlcnZpY2UodWludDY0LGJvb2wsdWludDY0KXZvaWQiLCBtZXRob2QgImJsb2NrKHVpbnQ2NCxib29sLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAidW5ibG9jayh1aW50NjQsYm9vbCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgInN1YnNjcmliZSh1aW50NjQsYm9vbCx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW11bXSl2b2lkIiwgbWV0aG9kICJ0cmlnZ2VyUGF5bWVudCh1aW50NjQsYm9vbCxhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIiwgbWV0aG9kICJzdHJlYWtDaGVjayh1aW50NjQsYm9vbCwoYWRkcmVzcyx1aW50NjQpKXZvaWQiLCBtZXRob2QgInNldFBhc3Nlcyh1aW50NjQsYm9vbCx1aW50NjQsYWRkcmVzc1tdKXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggb3B0SW4gaW5pdERlc2NyaXB0aW9uIGxvYWREZXNjcmlwdGlvbiBuZXdTZXJ2aWNlIHBhdXNlU2VydmljZSBzaHV0ZG93blNlcnZpY2UgYmxvY2sgdW5ibG9jayBzdWJzY3JpYmUgdHJpZ2dlclBheW1lbnQgc3RyZWFrQ2hlY2sgc2V0UGFzc2VzIHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxOAogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxOAogICAgLy8gZXhwb3J0IGNsYXNzIFN1YnNjcmlwdGlvbnNQbHVnaW4gZXh0ZW5kcyBjbGFzc2VzKEJhc2VTdWJzY3JpcHRpb25zLCBBa2l0YUJhc2VDb250cmFjdCkgewogICAgcHVzaGJ5dGVzIDB4NmY5ODE3ZjYgLy8gbWV0aG9kICJjcmVhdGUodWludDY0LHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWtleUFkZHJlc3MocmVrZXlCYWNrOiB1aW50NjQsIHdhbGxldDogdWludDY0KSAtPiBieXRlczoKcmVrZXlBZGRyZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjUKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZWtleUFkZHJlc3MocmVrZXlCYWNrOiBib29sZWFuLCB3YWxsZXQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzI2CiAgICAvLyBpZiAoIXJla2V5QmFjaykgewogICAgZnJhbWVfZGlnIC0yCiAgICBibnogcmVrZXlBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjcKICAgIC8vIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgpyZWtleUFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMzAKICAgIC8vIHJldHVybiB3YWxsZXQuYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4uY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI3CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBBcHBsaWNhdGlvbihha2l0YURBTykKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjUKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLm9wdEluW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDgtNTIKICAgIC8vIG9wdEluKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFzc2V0OiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU3LTYxCiAgICAvLyBjb25zdCBjb3N0ID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUub3B0SW5Db3N0Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtBc3NldChhc3NldCldLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweDMzZjc4ODA4IC8vIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NjMtNzUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGNvc3QsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjY3LTcxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGNvc3QsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo2My03NQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogY29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBBc3NldChhc3NldCksCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjYzLTc1CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBjb3N0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KSwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzOTRlYWViMiAvLyBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OC01MgogICAgLy8gb3B0SW4oCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLmluaXREZXNjcmlwdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXREZXNjcmlwdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gaW5pdERlc2NyaXB0aW9uKHdhbGxldDogQXBwbGljYXRpb24sIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyBsb2dnZWRBc3NlcnQoc2l6ZSA8PSBNQVhfREVTQ1JJUFRJT05fTEVOR1RILCBFUlJfQkFEX0RFU0NSSVBUSU9OX0xFTkdUSCkKICAgIHB1c2hpbnQgMzE1MQogICAgPD0KICAgIGJueiBpbml0RGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDkgLy8gIkVSUjpCRExOIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkJETE4KCmluaXREZXNjcmlwdGlvbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMQogICAgLy8gZGVzY3JpcHRpb24gPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlTdWJzY3JpcHRpb25zRGVzY3JpcHRpb24gfSkKICAgIGJ5dGVjIDQgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6ODAKICAgIC8vIGlmICghdGhpcy5kZXNjcmlwdGlvbi5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGluaXREZXNjcmlwdGlvbl9lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gdGhpcy5kZXNjcmlwdGlvbi5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0RGVzY3JpcHRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBpbml0RGVzY3JpcHRpb24od2FsbGV0OiBBcHBsaWNhdGlvbiwgc2l6ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgppbml0RGVzY3JpcHRpb25fZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyB0aGlzLmRlc2NyaXB0aW9uLnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdERlc2NyaXB0aW9uX2FmdGVyX2lmX2Vsc2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5sb2FkRGVzY3JpcHRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpsb2FkRGVzY3JpcHRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gbG9hZERlc2NyaXB0aW9uKHdhbGxldDogQXBwbGljYXRpb24sIG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gbG9nZ2VkQXNzZXJ0KG9mZnNldCArIGRhdGEubGVuZ3RoIDw9IE1BWF9ERVNDUklQVElPTl9MRU5HVEgsIEVSUl9CQURfREVTQ1JJUFRJT05fTEVOR1RIKQogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDMxNTEKICAgIDw9CiAgICBibnogbG9hZERlc2NyaXB0aW9uX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA5IC8vICJFUlI6QkRMTiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpCRExOCgpsb2FkRGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIGNvbnN0IGV4cGVjdGVkUHJldmlvdXNDYWxsczogdWludDY0ID0gb2Zmc2V0IC8gTUFYX0xPQURfREVTQ1JJUFRJT05fQ0hVTktfU0laRQogICAgZGlnIDEKICAgIHB1c2hpbnQgMjAyNgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBjb25zdCB0eG4gPSBndHhuLlRyYW5zYWN0aW9uKFR4bi5ncm91cEluZGV4IC0gZXhwZWN0ZWRQcmV2aW91c0NhbGxzIC0gMSkKICAgIHR4biBHcm91cEluZGV4CiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gNgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5Mi05MwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgZGlnIDIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5Mi05MwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgZGlnIDIKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5Mi05NAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZERlc2NyaXB0aW9uX2Jvb2xfZmFsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5NQogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkaWcgMgogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTItOTUKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWREZXNjcmlwdGlvbl9ib29sX2ZhbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXREZXNjcmlwdGlvbikKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJpbml0RGVzY3JpcHRpb24odWludDY0LHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5Mi05NgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0RGVzY3JpcHRpb24pCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBkaWcgMgogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjkyLTk3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXREZXNjcmlwdGlvbikKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWREZXNjcmlwdGlvbl9ib29sX2ZhbHNlQDEwCiAgICBpbnRjXzEgLy8gMQoKbG9hZERlc2NyaXB0aW9uX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTEtOTgKICAgIC8vIGxvZ2dlZEFzc2VydCgoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0RGVzY3JpcHRpb24pCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBibnogbG9hZERlc2NyaXB0aW9uX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMTAgLy8gIkVSUjpJQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklDT1IKCmxvYWREZXNjcmlwdGlvbl9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kZXNjcmlwdGlvbi5leGlzdHMsIEVSUl9ERVNDUklQVElPTl9OT1RfSU5JVElBTElaRUQpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBsb2FkRGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDE1CiAgICBwdXNoYnl0ZXMgIkVSUjpETklUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkROSVQKCmxvYWREZXNjcmlwdGlvbl9hZnRlcl9hc3NlcnRAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5kZXNjcmlwdGlvbi5yZXBsYWNlKG9mZnNldCwgZGF0YSkKICAgIGRpZyAyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gbG9hZERlc2NyaXB0aW9uKHdhbGxldDogQXBwbGljYXRpb24sIG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZERlc2NyaXB0aW9uX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBsb2FkRGVzY3JpcHRpb25fYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5uZXdTZXJ2aWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3U2VydmljZToKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEwNC0xMTcKICAgIC8vIG5ld1NlcnZpY2UoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaW50ZXJ2YWw6IHVpbnQ2NCwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NCwKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHBhc3NlczogdWludDY0LAogICAgLy8gICBnYXRlOiB1aW50NjQsCiAgICAvLyAgIHBheW91dEFkZHJlc3M6IEFjY291bnQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIGJhbm5lckltYWdlOiBDSUQsCiAgICAvLyAgIGhpZ2hsaWdodE1lc3NhZ2U6IFVpbnQ4LAogICAgLy8gICBoaWdobGlnaHRDb2xvcjogYnl0ZXM8Mz4KICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzY+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMAogICAgLy8gY29uc3QgdHhuID0gZ3R4bi5UcmFuc2FjdGlvbihUeG4uZ3JvdXBJbmRleCAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTIzLTEyNAogICAgLy8gVHhuLmdyb3VwSW5kZXggPiAyICYmIC8vIFthcmM1OF9yZWtleVRvUGx1Z2luLCBpbml0RGVzY3JpcHRpb24sIGxvYWREZXNjcmlwdGlvbl0KICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsICYmCiAgICBieiBuZXdTZXJ2aWNlX2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjQKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCAmJgogICAgYnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICBkdXAKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjMtMTI1CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIC8vIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICBieiBuZXdTZXJ2aWNlX2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gdHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjYKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCAmJgogICAgLy8gdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQgJiYKICAgIC8vIHR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBieiBuZXdTZXJ2aWNlX2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyNwogICAgLy8gdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBkdXAKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjcKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCAmJgogICAgLy8gdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQgJiYKICAgIC8vIHR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGJueiBuZXdTZXJ2aWNlX2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMubG9hZERlc2NyaXB0aW9uKSwKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIG1ldGhvZCAibG9hZERlc2NyaXB0aW9uKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKXZvaWQiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjgKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCAmJgogICAgLy8gdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQgJiYKICAgIC8vIHR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmxvYWREZXNjcmlwdGlvbiksCiAgICBieiBuZXdTZXJ2aWNlX2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCm5ld1NlcnZpY2VfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyMi0xMzAKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgVHhuLmdyb3VwSW5kZXggPiAyICYmIC8vIFthcmM1OF9yZWtleVRvUGx1Z2luLCBpbml0RGVzY3JpcHRpb24sIGxvYWREZXNjcmlwdGlvbl0KICAgIC8vICAgdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIC8vICAgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQgJiYKICAgIC8vICAgdHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vICAgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyAgIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmxvYWREZXNjcmlwdGlvbiksCiAgICAvLyAgIEVSUl9JTlZBTElEX0NBTExfT1JERVIKICAgIC8vICkKICAgIGJueiBuZXdTZXJ2aWNlX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTAgLy8gIkVSUjpJQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklDT1IKCm5ld1NlcnZpY2VfYWZ0ZXJfYXNzZXJ0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMzQtMTM4CiAgICAvLyBjb25zdCBjb3N0ID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUubmV3U2VydmljZUNvc3Q+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW2Fzc2V0XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweDFkYzc4MzcxIC8vIG1ldGhvZCAibmV3U2VydmljZUNvc3QodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTIKICAgIGR1cAogICAgY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNDAtMTYwCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUubmV3U2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBjb3N0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBwYXNzZXMsCiAgICAvLyAgICAgZ2F0ZSwKICAgIC8vICAgICBwYXlvdXRBZGRyZXNzLAogICAgLy8gICAgIHRpdGxlLAogICAgLy8gICAgIGJhbm5lckltYWdlLAogICAgLy8gICAgIGhpZ2hsaWdodE1lc3NhZ2UsCiAgICAvLyAgICAgaGlnaGxpZ2h0Q29sb3IsCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTQ2CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTQ0LTE0OAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBjb3N0LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTQwLTE2MAogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLm5ld1NlcnZpY2U+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogY29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBhc3NldCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcGFzc2VzLAogICAgLy8gICAgIGdhdGUsCiAgICAvLyAgICAgcGF5b3V0QWRkcmVzcywKICAgIC8vICAgICB0aXRsZSwKICAgIC8vICAgICBiYW5uZXJJbWFnZSwKICAgIC8vICAgICBoaWdobGlnaHRNZXNzYWdlLAogICAgLy8gICAgIGhpZ2hsaWdodENvbG9yLAogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBwdXNoYnl0ZXMgMHg5YjBmODlkNiAvLyBtZXRob2QgIm5ld1NlcnZpY2UocGF5LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsYnl0ZVszNl0sdWludDgsYnl0ZVszXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gY29uc3Qgc2l6ZSA9IHRoaXMuZGVzY3JpcHRpb24ubGVuZ3RoCiAgICBib3hfbGVuCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIGlmIChzaXplID4gTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUpIHsKICAgIGludGMgNCAvLyAyMDM0CiAgICA+CiAgICBieiBuZXdTZXJ2aWNlX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IGNodW5rID0gdGhpcy5kZXNjcmlwdGlvbi5leHRyYWN0KDAsIE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFKQogICAgaW50Y18wIC8vIDAKICAgIGludGMgNCAvLyAyMDM0CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE2Ni0xNzAKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFNlcnZpY2VEZXNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbMCwgY2h1bmtdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gYXJnczogWzAsIGNodW5rXSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxNwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTY2LTE3MAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2V0U2VydmljZURlc2NyaXB0aW9uPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFswLCBjaHVua10sCiAgICAvLyB9KQogICAgYnl0ZWMgNSAvLyBtZXRob2QgInNldFNlcnZpY2VEZXNjcmlwdGlvbih1aW50NjQsYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE3Mi0xNzYKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFNlcnZpY2VEZXNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbMCwgdGhpcy5kZXNjcmlwdGlvbi5leHRyYWN0KE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFLCBzaXplIC0gTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUpXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGFyZ3M6IFswLCB0aGlzLmRlc2NyaXB0aW9uLmV4dHJhY3QoTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUsIHNpemUgLSBNQVhfREVTQ1JJUFRJT05fQ0hVTktfU0laRSldLAogICAgdW5jb3ZlciAzCiAgICBpbnRjIDQgLy8gMjAzNAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGFyZ3M6IFswLCB0aGlzLmRlc2NyaXB0aW9uLmV4dHJhY3QoTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUsIHNpemUgLSBNQVhfREVTQ1JJUFRJT05fQ0hVTktfU0laRSldLAogICAgaW50YyA0IC8vIDIwMzQKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE3Mi0xNzYKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFNlcnZpY2VEZXNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbMCwgdGhpcy5kZXNjcmlwdGlvbi5leHRyYWN0KE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFLCBzaXplIC0gTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUpXSwKICAgIC8vIH0pCiAgICBieXRlYyA1IC8vIG1ldGhvZCAic2V0U2VydmljZURlc2NyaXB0aW9uKHVpbnQ2NCxieXRlW10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCm5ld1NlcnZpY2VfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxODgtMTkyCiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5hY3RpdmF0ZVNlcnZpY2U+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW10sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMTQKICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgcHVzaGJ5dGVzIDB4Yzg4MzUxMzAgLy8gbWV0aG9kICJhY3RpdmF0ZVNlcnZpY2UoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gaXR4bkNvbXBvc2Uuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTk2LTIwMQogICAgLy8gY29uc3QgaWQgPSBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nZXRTZXJ2aWNlTGlzdD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbc2VuZGVyXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgZGlnIDE0CiAgICBkaWcgMTYKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE5Ni0yMDEKICAgIC8vIGNvbnN0IGlkID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2V0U2VydmljZUxpc3Q+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW3NlbmRlcl0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZGZlNjAyY2YgLy8gbWV0aG9kICJnZXRTZXJ2aWNlTGlzdChhZGRyZXNzKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gcmV0dXJuIChpZCAtIDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEwNC0xMTcKICAgIC8vIG5ld1NlcnZpY2UoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaW50ZXJ2YWw6IHVpbnQ2NCwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NCwKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHBhc3NlczogdWludDY0LAogICAgLy8gICBnYXRlOiB1aW50NjQsCiAgICAvLyAgIHBheW91dEFkZHJlc3M6IEFjY291bnQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIGJhbm5lckltYWdlOiBDSUQsCiAgICAvLyAgIGhpZ2hsaWdodE1lc3NhZ2U6IFVpbnQ4LAogICAgLy8gICBoaWdobGlnaHRDb2xvcjogYnl0ZXM8Mz4KICAgIC8vICk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpuZXdTZXJ2aWNlX2Vsc2VfYm9keUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMQogICAgLy8gZGVzY3JpcHRpb24gPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlTdWJzY3JpcHRpb25zRGVzY3JpcHRpb24gfSkKICAgIGJ5dGVjIDQgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTc5CiAgICAvLyBjb25zdCBjaHVuayA9IHRoaXMuZGVzY3JpcHRpb24uZXh0cmFjdCgwLCBzaXplKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxODEtMTg1CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zZXRTZXJ2aWNlRGVzY3JpcHRpb24+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWzAsIGNodW5rXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxODQKICAgIC8vIGFyZ3M6IFswLCBjaHVua10sCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTgxLTE4NQogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2V0U2VydmljZURlc2NyaXB0aW9uPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFswLCBjaHVua10sCiAgICAvLyB9KQogICAgYnl0ZWMgNSAvLyBtZXRob2QgInNldFNlcnZpY2VEZXNjcmlwdGlvbih1aW50NjQsYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIG5ld1NlcnZpY2VfYWZ0ZXJfaWZfZWxzZUAxNQoKbmV3U2VydmljZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBuZXdTZXJ2aWNlX2Jvb2xfbWVyZ2VAOQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5wYXVzZVNlcnZpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwYXVzZVNlcnZpY2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjA5LTIxMwogICAgLy8gcGF1c2VTZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjE4LTIyMwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUucGF1c2VTZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpZF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjE4LTIyMwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUucGF1c2VTZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpZF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4MTdjODczMGIgLy8gbWV0aG9kICJwYXVzZVNlcnZpY2UodWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjA5LTIxMwogICAgLy8gcGF1c2VTZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnNodXRkb3duU2VydmljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNodXRkb3duU2VydmljZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMjYtMjMwCiAgICAvLyBzaHV0ZG93blNlcnZpY2UoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaW5kZXg6IHVpbnQ2NAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjM1LTI0MAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2h1dGRvd25TZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpbmRleF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjM1LTI0MAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2h1dGRvd25TZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpbmRleF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4ODdlMDU1YzYgLy8gbWV0aG9kICJzaHV0ZG93blNlcnZpY2UodWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjI2LTIzMAogICAgLy8gc2h1dGRvd25TZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGluZGV4OiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5ibG9ja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmJsb2NrOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI0My0yNDcKICAgIC8vIGJsb2NrKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFkZHJlc3M6IEFjY291bnQKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1Mi0yNjQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmJsb2NrPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHRoaXMubWJyKCkuYmxvY2tzLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFkZHJlc3MsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1OAogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTkKICAgIC8vIGFtb3VudDogdGhpcy5tYnIoKS5ibG9ja3MsCiAgICBwdXNoaW50IDE1NzAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjU2LTI2MAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB0aGlzLm1icigpLmJsb2NrcywKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1Mi0yNjQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmJsb2NrPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHRoaXMubWJyKCkuYmxvY2tzLAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGFkZHJlc3MsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjYzCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTItMjY0CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5ibG9jaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiB0aGlzLm1icigpLmJsb2NrcywKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhZGRyZXNzLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweGI1OWM4YTU0IC8vIG1ldGhvZCAiYmxvY2socGF5LGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNDMtMjQ3CiAgICAvLyBibG9jaygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4udW5ibG9ja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVuYmxvY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjY3LTI3MQogICAgLy8gdW5ibG9jaygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50CiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzMgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNzYtMjgxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS51bmJsb2NrPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgc3dhcAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNzYtMjgxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS51bmJsb2NrPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhhZWViYjM3OCAvLyBtZXRob2QgInVuYmxvY2soYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI2Ny0yNzEKICAgIC8vIHVuYmxvY2soCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYWRkcmVzczogQWNjb3VudAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnN1YnNjcmliZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1YnNjcmliZToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjg0LTI5MwogICAgLy8gc3Vic2NyaWJlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFzc2V0OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWNjb3VudCwKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGludGVydmFsOiB1aW50NjQsCiAgICAvLyAgIGluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKc3Vic2NyaWJlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyODQtMjkzCiAgICAvLyBzdWJzY3JpYmUoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBY2NvdW50LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgaW50ZXJ2YWw6IHVpbnQ2NCwKICAgIC8vICAgaW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogc3Vic2NyaWJlX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdWludDhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdWJzY3JpYmVfZm9yX2hlYWRlckAxCgpzdWJzY3JpYmVfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjg0LTI5MwogICAgLy8gc3Vic2NyaWJlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFzc2V0OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWNjb3VudCwKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGludGVydmFsOiB1aW50NjQsCiAgICAvLyAgIGluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIGRpZyAzCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8Ynl0ZXM+CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMTMKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMTEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzMgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTc1CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlcikKICAgIHB1c2hieXRlcyAicmVmZXJyZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI2MgogICAgLy8gd2FsbGV0QWRkcmVzczogd2FsbGV0LmFkZHJlc3MsCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjYxLTI2NgogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgd2FsbGV0QWRkcmVzczogd2FsbGV0LmFkZHJlc3MsCiAgICAvLyAgIG9yaWdpbiwKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWZlcnJlcgogICAgLy8gfQogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gY29uc3QgeyBvcmlnaW4sIHNlbmRlciB9ID0gZ2V0QWNjb3VudHMod2FsbGV0KQogICAgZHVwCiAgICBleHRyYWN0IDMyIDMyCiAgICBidXJ5IDIwCiAgICBleHRyYWN0IDY0IDMyCiAgICBkdXAKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjk5CiAgICAvLyBsZXQgbWJyQW1vdW50ID0gY29zdHMuc3Vic2NyaXB0aW9ucwogICAgcHVzaGludCA2MDUwMAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMwMS0zMDYKICAgIC8vIGNvbnN0IGZpcnN0U3Vic2NyaXB0aW9uID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuaXNGaXJzdFN1YnNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbc2VuZGVyXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgZGlnIDE1CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMwMS0zMDYKICAgIC8vIGNvbnN0IGZpcnN0U3Vic2NyaXB0aW9uID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuaXNGaXJzdFN1YnNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbc2VuZGVyXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHg2MDNkNzI5NyAvLyBtZXRob2QgImlzRmlyc3RTdWJzY3JpcHRpb24oYWRkcmVzcylib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gaWYgKGZpcnN0U3Vic2NyaXB0aW9uKSB7CiAgICBieiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBtYnJBbW91bnQgKz0gY29zdHMuc3Vic2NyaXB0aW9uc2xpc3QKICAgIHB1c2hpbnQgNzk0MDAKICAgIGJ1cnkgMTUKCnN1YnNjcmliZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBpZiAoaXNBc2EgJiYgIXRoaXMuYWtpdGFEQU8udmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgZGlnIDExCiAgICBieiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gaWYgKGlzQXNhICYmICF0aGlzLmFraXRhREFPLnZhbHVlLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBibnogc3Vic2NyaWJlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIG1ickFtb3VudCArPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGRpZyAxNAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICArCiAgICBidXJ5IDE1CgpzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTgKICAgIC8vIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKICAgIGRpZyA0CiAgICBieiBzdWJzY3JpYmVfZWxzZV9ib2R5QDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyBjb25zdCBnYXRlID0gZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMjEtMzI1CiAgICAvLyBjb25zdCBzZXJ2aWNlID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2V0U2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbcmVjaXBpZW50LCBpbmRleF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAxNwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweGQ0YjE2ZTdhIC8vIG1ldGhvZCAiZ2V0U2VydmljZShhZGRyZXNzLHVpbnQ2NCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHN0cmluZyxzdHJpbmcsYnl0ZVszNl0sdWludDgsYnl0ZVszXSkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDExCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTE3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLChsZW4rdXRmOFtdKSwobGVuK3V0ZjhbXSksdWludDhbMzZdLHVpbnQ4LHVpbnQ4WzNdKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMTkKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDc1CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA4IG9mICh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSksKGxlbit1dGY4W10pLHVpbnQ4WzM2XSx1aW50OCx1aW50OFszXSkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb25zL3R5cGVzLnRzOjpTZXJ2aWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyBzZXJ2aWNlLmdhdGVJRCwKICAgIGV4dHJhY3QgMzcgOAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzOAogICAgLy8gaWYgKGlzQXNhKSB7CiAgICBkaWcgMTMKICAgIGJ6IHN1YnNjcmliZV9lbHNlX2JvZHlAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMzktMzYxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nYXRlZFN1YnNjcmliZUFzYT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBnYXRlVHhuLAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgaW5kZXgsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMTcKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDE4CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDE5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzQzLTM0NwogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNDgtMzUzCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyB9KSwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM1MAogICAgLy8gYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDEzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM0OC0zNTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vIH0pLAogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIGdhdGVUeG4sCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAyMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMyNy0zMzYKICAgIC8vIGNvbnN0IGdhdGVUeG4gPSBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICBvcmlnaW4sCiAgICAvLyAgICAgc2VydmljZS5nYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzOS0zNjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGdhdGVUeG4sCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNjAKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTQKICAgIGRpZyAxNgogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzOS0zNjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGdhdGVUeG4sCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhhNjhlNjk2MyAvLyBtZXRob2QgImdhdGVkU3Vic2NyaWJlQXNhKHBheSxheGZlcixhcHBsLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CgpzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyODQtMjkzCiAgICAvLyBzdWJzY3JpYmUoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBY2NvdW50LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgaW50ZXJ2YWw6IHVpbnQ2NCwKICAgIC8vICAgaW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc3Vic2NyaWJlX2Vsc2VfYm9keUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNjMtMzc5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nYXRlZFN1YnNjcmliZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZ2F0ZVR4biwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDE3CiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIGFtb3VudDogYW1vdW50ICsgbWJyQW1vdW50LAogICAgZGlnIDEyCiAgICBkaWcgMTkKICAgICsKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMTkKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNjctMzcxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gZ2F0ZVR4biwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAibXVzdENoZWNrKGFkZHJlc3MsdWludDY0LGJ5dGVbXVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMyNy0zMzYKICAgIC8vIGNvbnN0IGdhdGVUeG4gPSBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICBvcmlnaW4sCiAgICAvLyAgICAgc2VydmljZS5nYXRlSUQsCiAgICAvLyAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2My0zNzkKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBnYXRlVHhuLAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgaW5kZXgsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgZGlnIDE0CiAgICBkaWcgMTYKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNjMtMzc5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nYXRlZFN1YnNjcmliZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZ2F0ZVR4biwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDUzNTVkYTZkIC8vIG1ldGhvZCAiZ2F0ZWRTdWJzY3JpYmUocGF5LGFwcGwsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGIgc3Vic2NyaWJlX2FmdGVyX2lmX2Vsc2VAMzMKCnN1YnNjcmliZV9lbHNlX2JvZHlAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzgyCiAgICAvLyBpZiAoaXNBc2EpIHsKICAgIGRpZyAxMQogICAgYnogc3Vic2NyaWJlX2Vsc2VfYm9keUAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM4My00MDQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnN1YnNjcmliZUFzYT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mzg5CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozODctMzkxCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM5Mi0zOTcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vIH0pLAogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyAxNAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzkyLTM5NwogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gfSksCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM4My00MDQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnN1YnNjcmliZUFzYT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MDMKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTQKICAgIGRpZyAxNgogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM4My00MDQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnN1YnNjcmliZUFzYT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhiMTBhMzA2ZSAvLyBtZXRob2QgInN1YnNjcmliZUFzYShwYXksYXhmZXIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGIgc3Vic2NyaWJlX2FmdGVyX2lmX2Vsc2VAMzMKCnN1YnNjcmliZV9lbHNlX2JvZHlAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc3Vic2NyaWJlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIGRpZyAxMAogICAgZGlnIDE3CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDE3CiAgICBkdXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDEwLTQxNAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MDYtNDIxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdWJzY3JpYmU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgZGlnIDE2CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc3Vic2NyaWJlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgxMGYwMGMzYSAvLyBtZXRob2QgInN1YnNjcmliZShwYXksYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGIgc3Vic2NyaWJlX2FmdGVyX2lmX2Vsc2VAMzMKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4udHJpZ2dlclBheW1lbnRbcm91dGluZ10oKSAtPiB2b2lkOgp0cmlnZ2VyUGF5bWVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDI2LTQzMgogICAgLy8gdHJpZ2dlclBheW1lbnQoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYWRkcmVzczogQWNjb3VudCwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCnRyaWdnZXJQYXltZW50X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MjYtNDMyCiAgICAvLyB0cmlnZ2VyUGF5bWVudCgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IHRyaWdnZXJQYXltZW50X2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdWludDhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0cmlnZ2VyUGF5bWVudF9mb3JfaGVhZGVyQDEKCnRyaWdnZXJQYXltZW50X2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQyNi00MzIKICAgIC8vIHRyaWdnZXJQYXltZW50KAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFkZHJlc3M6IEFjY291bnQsCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgZGlnIDMKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlcz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gaWYgKGFyZ3MubGVuZ3RoID4gMCkgewogICAgZGlnIDQKICAgIGJ6IHRyaWdnZXJQYXltZW50X2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyBjb25zdCBnYXRlID0gZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MzgKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgcHVzaGJ5dGVzICJvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjY0CiAgICAvLyByZXR1cm4gZ2V0T3RoZXJBcHBMaXN0KGFraXRhREFPKS5lc2Nyb3cKICAgIHB1c2hpbnQgMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4Ni0xODkKICAgIC8vIGNvbnN0IGRhdGEgPSBhYmlDYWxsPHR5cGVvZiBFc2Nyb3dGYWN0b3J5LnByb3RvdHlwZS5nZXQ+KHsKICAgIC8vICAgYXBwSWQ6IGVzY3Jvd0ZhY3RvcnksCiAgICAvLyAgIGFyZ3M6IFthZGRyZXNzXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4M2MxYTZmMzMgLy8gbWV0aG9kICJnZXQoYWRkcmVzcylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYnl0ZXMKICAgIGV4dHJhY3QgNiAwCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkxCiAgICAvLyBpZiAoQnl0ZXMoZGF0YSkubGVuZ3RoID09PSAwIHx8IEJ5dGVzKGRhdGEpLmxlbmd0aCAhPT0gOCkgewogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGJ6IHRyaWdnZXJQYXltZW50X2lmX2JvZHlAMTUKICAgIGRpZyAxMAogICAgaW50Y18yIC8vIDgKICAgICE9CiAgICBieiB0cmlnZ2VyUGF5bWVudF9hZnRlcl9pZl9lbHNlQDE2Cgp0cmlnZ2VyUGF5bWVudF9pZl9ib2R5QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTIKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMgoKdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTQzCiAgICAvLyBpZiAod2FsbGV0SUQuaWQgPT09IDApIHsKICAgIGRpZyAxMQogICAgYm56IHRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMjEKICAgIGRpZyA3Cgp0cmlnZ2VyUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Om9yaWdpbk9yQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ0My00NDcKICAgIC8vIGNvbnN0IHN1YiA9IGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbeyBhZGRyZXNzLCBpZCB9XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDQ2CiAgICAvLyBhcmdzOiBbeyBhZGRyZXNzLCBpZCB9XSwKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgOQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NDMtNDQ3CiAgICAvLyBjb25zdCBzdWIgPSBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb24+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW3sgYWRkcmVzcywgaWQgfV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MjViODEyYTcgLy8gbWV0aG9kICJnZXRTdWJzY3JpcHRpb24oKGFkZHJlc3MsdWludDY0KSkoYm9vbCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIHB1c2hpbnQgMTA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9ucy90eXBlcy50czo6U3Vic2NyaXB0aW9uSW5mb1dpdGhFeGlzdGVuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NDktNDY2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nYXRlZFRyaWdnZXJQYXltZW50Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgICAgbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICAvLyAgICAgICAgIHN1Yk9yaWdpbiwKICAgIC8vICAgICAgICAgc3ViLmdhdGVJRCwKICAgIC8vICAgICAgICAgZW5jb2RlQXJjNChhcmdzKQogICAgLy8gICAgICAgXQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHsgYWRkcmVzcywgaWQgfQogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NTkKICAgIC8vIHN1Yi5nYXRlSUQsCiAgICBleHRyYWN0IDc3IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NTMtNDYyCiAgICAvLyBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICBzdWJPcmlnaW4sCiAgICAvLyAgICAgc3ViLmdhdGVJRCwKICAgIC8vICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgIF0KICAgIC8vIH0pLAogICAgaW50Y18zIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ0OS00NjYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkVHJpZ2dlclBheW1lbnQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFwcElkOiBnYXRlLAogICAgLy8gICAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICAgICAgc3ViT3JpZ2luLAogICAgLy8gICAgICAgICBzdWIuZ2F0ZUlELAogICAgLy8gICAgICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgICAgICBdCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgeyBhZGRyZXNzLCBpZCB9CiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgZGlnIDExCiAgICBkaWcgMTMKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ0OS00NjYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkVHJpZ2dlclBheW1lbnQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFwcElkOiBnYXRlLAogICAgLy8gICAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICAgICAgc3ViT3JpZ2luLAogICAgLy8gICAgICAgICBzdWIuZ2F0ZUlELAogICAgLy8gICAgICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgICAgICBdCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgeyBhZGRyZXNzLCBpZCB9CiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4MjgxYjg5MWIgLy8gbWV0aG9kICJnYXRlZFRyaWdnZXJQYXltZW50KGFwcGwsKGFkZHJlc3MsdWludDY0KSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MjYtNDMyCiAgICAvLyB0cmlnZ2VyUGF5bWVudCgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY3CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIGJ5dGVjIDExIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyBjb25zdCBzdWJPcmlnaW4gPSBvcmlnaW5PcihzdWJXYWxsZXQsIGFkZHJlc3MpCiAgICBiIHRyaWdnZXJQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JAMjIKCnRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5NQogICAgLy8gcmV0dXJuIGJ0b2koZGF0YSkKICAgIGRpZyAxNQogICAgYnRvaQogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGIgdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREAxNwoKdHJpZ2dlclBheW1lbnRfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ2OC00NzMKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnRyaWdnZXJQYXltZW50Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFt7IGFkZHJlc3MsIGlkIH1dLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIGFyZ3M6IFt7IGFkZHJlc3MsIGlkIH1dLAogICAgZGlnIDYKICAgIGl0b2IKICAgIGRpZyA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgOQogICAgZGlnIDExCiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBkaWcgMTQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ2OC00NzMKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnRyaWdnZXJQYXltZW50Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFt7IGFkZHJlc3MsIGlkIH1dLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweGMzZDlmMWRjIC8vIG1ldGhvZCAidHJpZ2dlclBheW1lbnQoKGFkZHJlc3MsdWludDY0KSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiB0cmlnZ2VyUGF5bWVudF9hZnRlcl9pZl9lbHNlQDEyCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnN0cmVha0NoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3RyZWFrQ2hlY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDc3LTQ4MQogICAgLy8gc3RyZWFrQ2hlY2soCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAga2V5OiBTdWJzY3JpcHRpb25LZXkKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9ucy90eXBlcy50czo6U3Vic2NyaXB0aW9uS2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzMgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ4NAogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0ODYtNDkxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdHJlYWtDaGVjaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBba2V5XSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgc3dhcAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0ODYtNDkxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdHJlYWtDaGVjaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBba2V5XSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhjMGZmMjczMCAvLyBtZXRob2QgInN0cmVha0NoZWNrKChhZGRyZXNzLHVpbnQ2NCkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NzctNDgxCiAgICAvLyBzdHJlYWtDaGVjaygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBrZXk6IFN1YnNjcmlwdGlvbktleQogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnNldFBhc3Nlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldFBhc3NlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OTQtNDk5CiAgICAvLyBzZXRQYXNzZXMoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhZGRyZXNzZXM6IEFjY291bnRbXQogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzMgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YWNjb3VudD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUwMy01MDgKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFBhc3Nlcz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaWQsIGFkZHJlc3Nlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUwNwogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTAzLTUwOAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2V0UGFzc2VzPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpZCwgYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgyNzUyMDNhZiAvLyBtZXRob2QgInNldFBhc3Nlcyh1aW50NjQsYWRkcmVzc1tdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ5NC00OTkKICAgIC8vIHNldFBhc3NlcygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQsCiAgICAvLyAgIGFkZHJlc3NlczogQWNjb3VudFtdCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpOREFPIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5EQU8KCnVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAEIBvIPJgwJYWtpdGFfZGFvA2FhbAQVH3x1EHNwZW5kaW5nX2FkZHJlc3MBZAQXlaDQBEOSJlUE0QecrgTPFgEdCEVSUjpCRExOCEVSUjpJQ09SEmNvbnRyb2xsZWRfYWRkcmVzczEZFEQxGEEAZ4AEupc80CcHJwiCCwS2qsOdBDmjrkcEGbH8KwS+yGw0BJ9ZqXAEycykXAQj4ze9BOoheKoEHEJGGwQz6SyUBIVN7eA2GgCODgBMANkBDQGwA/cERASRBPMFQQjICnYKxAslAAEAI0OABG+YF/Y2GgCOAQASAIoCAYv+QAADMgOJi/9yCESJNhoBSRUkEkQXNhoCSSJZgQIISwEVEkRXAgCAB3ZlcnNpb25MZyhMZyNDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJESwIrZUgiKGVEKWVIgSBbsUmyGEsBsgCABDP3iAiyGksCsholshAisgGztD5JVwQATFcABCoSREkVJBJEF7FLAXIIRLIHsghLAbIAI7IQIrIBtk8DTwSI/1GyILIYsgCABDlOrrKyGrIaJbIQIrIBsyNDNhoBFSQSRDYaAkkVJBJEF0mBzxgOQAAEJwmwACcEvUUBQAAIJwRLAblII0MnBEsB00L/9oAANhoBFSQSRDYaAkkVJBJEF0k2GgNJIlmBAghLARUSRFcCAElOAhUIgc8YDkAABCcJsABLAYHqDwoxFkwJIwlJRQQ4ECUSQQBVSwI4GDIIEkEAS0sCOBuBAxJBAEFLAjgZQAA6SwIiwhonBxJBAC9LAjgAMQASQQAlI0AABCcKsAAnBL1FAUAADIAIRVJSOkROSVSwACcESwJLArsjQyJC/9iAADYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAhUkEkQ2GgRJTgIVJBJENhoFSU4CFSQSRDYaBklOAhUkEkQ2GgdJTgIVJBJENhoISU4CFYEgEkQ2GglJTgJJIlmBAghMFRJENhoKSU4CFYEkEkQ2GgtJTgIVIxJENhoMSU4CFYEDEkQrZUgxFiMJMRaBAg1BAbBJOBAlEkEBqEk4GDIIEkEBn0k4G4EEEkEBlkk4GUABkEkiwhonCBJBAYYjQAAEJwqwACIoZUQpZUiBIFtJRRCxSbIYSwJJTgKyAIAEHceDcbIaSwxJTgOyGiWyECKyAbO0PklXBABMVwAEKhJESRUkEkQXsUsBcghEsgeyCEsBsgAjshAisgG2shiyAIAEmw+J1rIaSwyyGrIaSwmyGksIshpLB7IaSwayGksFshpLBLIaSwOyGksCsholshAisgEnBL1MSU8CRCEEDUEAtScEIiEEurYiFksBFRZXBgJPAlBLEUlOA7IYSwVJTgSyACcFshpLAbIasholshAisgG2TwMhBAknBCEETwK6SRUWVwYCTFBPArIYTwKyACcFshpMshqyGiWyECKyAbZLDkmyGEsCSU4CsgCABMiDUTCyGiWyECKyAbOxSw5LEIj8f7IgshhJsgCABN/mAs+yGrIaJbIQIrIBs7Q+SVcEAExXAAQqEkRJFSQSRBcjCRYqTFCwI0MnBCJPArq2IhZLARUWVwYCTwJQSxCyGEsDsgAnBbIaTLIasholshAisgFC/3siQv53NhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJESwIrZUhMIihlRCllSIEgW7FPA08EiPvnsiCyGEyyAIAEF8hzC7IasholshAisgGzI0M2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUkEkRLAitlSEwiKGVEKWVIgSBbsU8DTwSI+5qyILIYTLIAgASH4FXGshqyGiWyECKyAbMjQzYaAUkVJBJEFzYaAkkVIxJEIlM2GgNJFYEgEkRLAitlSCIoZUQpZUiBIFuxSXIIRIHUerIIsgdLAbIAI7IQIrIBtk8DTwSI+zeyILIYsgCABLWcilSyGrIaJbIQIrIBsyNDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVgSASREsCK2VITCIoZUQpZUiBIFuxTwNPBIj66rIgshhMsgCABK7rs3iyGrIaJbIQIrIBsyNDIkmAAEk2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUkEkQXNhoESRWBIBJENhoFRwIVJBJEFzYaBkkVJBJENhoHSRUkEkQ2GghHAiJZSU4CgQILTEkVTFcCACJJSwUMQQAmRwKBAgtLA0lPAllJSwdJTgQSREsBFVIiWYECCAhFBSMIRQFC/9NLA4ECCEsDEkRLDUknC2VITEkrZUhMSYAIcmVmZXJyZXJlSExJcghETwRQTwNQTwJQSVcgIEUUV0AgSUUTIihlRCllSIEgW0lFE4HU2ANFErFLD08DiPnysiCyGEmyAIAEYD1yl7IasholshAisgGztD5JVwQATFcABCoSREkVIxJEIlNBAAaBqOwERQ9LC0EAFyIoZURyCERLDHAARQFAAAdLDjIQCEUPSwRBAX0iKGVEKWVIgShbsUsQshhLEbIAgATUsW56shpLC7IaSweyGiWyECKyAbO0PklXBABLAVcABCoSREkVSwGBSVlJgXUSREsCTEsCUiJZgXcISwKBS1lJSwISRE8DTEsDUiJZgQIICBJEVyUITEsNQQCTsUsRSXIIREsSsgiyB0sTSU4CsgAjshAisgG2SXIIREsNshJLELIRshRLAbIAgQSyECKyAbYnBrIaSxWyGk8DshpLCLIaTwKyGEsBsgAlshAisgG2Sw5LEIj40bIgshiyAIAEpo5pY7IaSwqyGksJshpLB7IaSwayGiWyECKyAbO0PklXBABMVwAEKhJEFSQSRCNDsUsRSXIIREsMSxMIsgiyB0sTSbIAI7IQIrIBticGshpLFbIaTwOyGksIshpPArIYSbIAJbIQIrIBtksOSxCI+FiyILIAshiABFNV2m2yGksKshpLCbIaSweyGksGsholshAisgGztD5JVwQATFcABCoSRBUkEkRC/4RLC0EAdbFLD0lyCERLELIIsgdLEUlOArIAI7IQIrIBtklyCERLC7ISSw6yEbIUSwGyAIEEshAisgG2Sw5LEIj33rIgshiyAIAEsQowbrIaSwqyGksJshpLB7IaSwayGiWyECKyAbO0PklXBABMVwAEKhJEFSQSREL/CrFLD0lyCERLCksRCLIIsgdLEUmyACOyECKyAbZLDksQiPeCsiCyALIYgAQQ8Aw6shpLCrIaSwmyGksHshpLBrIaJbIQIrIBs7Q+SVcEAExXAAQqEkQVJBJEQv6uIkmAAEcDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVgSASRDYaBEkVJBJEFzYaBUcCIllJTgKBAgtMSRVMVwIAIklLBQxBACZHAoECC0sDSU8CWUlLB0lOBBJESwEVUiJZgQIICEUFIwhFAUL/00sDgQIISwMSREsJK2VIRQ8iKGVEKWVIgSBbRQ5LBEEA8yIoZURJKWVIgShbRQ6AA29hbGVIgRhbsbIYgAQ8Gm8zshpLB7IaJbIQIrIBs7Q+SVcEAEsBVwAEKhJESSJZgQIITBUSRFcGAElFERVJRQxBAAdLCiQTQQCSIkUMSwtAAIFLB7FLBxZLCUxQSw9JTgKyGEsRSU4CsgCABCW4EqeyGkmyGiWyECKyAbO0PklXBABLAVcABCoSRBWBaRJEsVdNCCcGshpPBLIashpLCLIaSw+yGEsBsgAlshAisgG2SwtLDYj19bIgTwKyGEyyAIAEKBuJG7IasholshAisgGzI0NLCycLZUhC/3hLDxdFDEL/abFLBhZLCExQSwlLC4j1ubIgSw6yGEsPsgCABMPZ8dyyGrIaJbIQIrIBs0L/wDYaAUkVJBJEFzYaAkkVIxJEIlM2GgNJFYEoEkRLAitlSEwiKGVEKWVIgSBbsU8DTwSI9WeyILIYTLIAgATA/ycwshqyGiWyECKyAbMjQzYaAUkVJBJEFzYaAkkVIxJEIlM2GgNJFSQSRDYaBEkiWYEgC4ECCEsBFRJESwMrZUhMIihlRCllSIEgW7FPBE8FiPUJsiCyGEyyAIAEJ1IDr7IaTLIasholshAisgGzI0M2GgFJFSQSRBcxACIoZUSABndhbGxldGVIcghEEkAADIAIRVJSOk5EQU+wAChLAWcjQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
22384
+ var APP_SPEC24 = { "name": "SubscriptionsPlugin", "structs": { "SubscriptionKey": [{ "name": "address", "type": "address" }, { "name": "id", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "uint64", "name": "akitaDAO" }, { "type": "string", "name": "version" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "optIn", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "asset" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "Opt the subscriptions contract (and its revenue escrow + split\nrecipients) into `asset`, funded by the user's wallet.\n\nReads `optInCost` from the subscriptions contract to size the\npayment, then forwards a correctly-sized payment to\n`Subscriptions.optIn`. The contract's base-class `optIn` performs\nthe contract's own asset opt-in and \u2014 because the subscriptions\ncontract has a named revenue escrow configured\n(`this.akitaDAOEscrow.value.name !== ''`) \u2014 also rekeys the DAO\nwallet to the revenue-manager plugin to opt the escrow and split\nrecipients in. That DAO-wallet rekey is on a different\nAbstractedAccount instance than this plugin's rekey on the caller's\nwallet, so there is no nesting conflict.", "events": [], "recommendations": {} }, { "name": "initDescription", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "uint64", "name": "size" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadDescription", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "newService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "interval" }, { "type": "uint64", "name": "asset" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "passes" }, { "type": "uint64", "name": "gate" }, { "type": "address", "name": "payoutAddress" }, { "type": "string", "name": "title" }, { "type": "byte[36]", "name": "bannerImage" }, { "type": "uint8", "name": "highlightMessage" }, { "type": "byte[3]", "name": "highlightColor" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "pauseService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "id" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "shutdownService", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "index" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "block", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "unblock", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "subscribe", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "asset" }, { "type": "address", "name": "recipient" }, { "type": "uint64", "name": "amount" }, { "type": "uint64", "name": "interval" }, { "type": "uint64", "name": "index" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "triggerPayment", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "address", "name": "address" }, { "type": "uint64", "name": "id" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "fundTriggerPayment", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "id" }, { "type": "byte[][]", "name": "args" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "streakCheck", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "(address,uint64)", "struct": "SubscriptionKey", "name": "key" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setPasses", "args": [{ "type": "uint64", "name": "wallet" }, { "type": "bool", "name": "rekeyBack" }, { "type": "uint64", "name": "id" }, { "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": { "description": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZA==" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1014], "errorMessage": "Box must have value" }, { "pc": [393, 923, 1186, 1828, 1933, 2130, 2251, 2373, 2465, 2673, 2763, 3071], "errorMessage": "Bytes has valid prefix" }, { "pc": [480, 556], "errorMessage": "ERR:BDLN" }, { "pc": [3128, 3168], "errorMessage": "ERR:CTRG" }, { "pc": [654], "errorMessage": "ERR:DNIT" }, { "pc": [634, 864], "errorMessage": "ERR:ICOR" }, { "pc": [3527], "errorMessage": "ERR:NDAO" }, { "pc": [3094], "errorMessage": "ERR:UDNE" }, { "pc": [268, 405, 935, 1452, 1753, 1856, 1996, 2020, 2143, 2270, 2294, 2387, 3191, 3250, 3511], "errorMessage": "application exists" }, { "pc": [347, 868, 1287, 1364, 1441, 1540, 1777, 1853, 1881, 2601, 2618, 3019, 3346, 3440, 3498], "errorMessage": "check GlobalState exists" }, { "pc": [1687, 2554, 2971], "errorMessage": "invalid array encoding" }, { "pc": [284, 529, 760, 1655, 1701, 1953, 1974, 2522, 2568, 2676, 2939, 2985, 3419], "errorMessage": "invalid array length header" }, { "pc": [328, 687, 1267, 1344, 1421, 1519, 1602, 2495, 2921, 3325, 3403], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [3430], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [292, 537, 767], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [1723, 2590, 3007], "errorMessage": "invalid number of bytes for arc4.dynamic_array<bytes>" }, { "pc": [751, 1432, 1530, 1622, 2506], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [778], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 36>" }, { "pc": [799], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 3>" }, { "pc": [277, 319, 338, 459, 467, 513, 521, 677, 700, 710, 720, 730, 740, 1258, 1277, 1335, 1354, 1412, 1510, 1593, 1612, 1631, 1640, 1648, 2486, 2514, 2912, 2932, 3316, 3394, 3413, 3491], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [788], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [1833], "errorMessage": "invalid number of bytes for bool" }, { "pc": [2683], "errorMessage": "invalid number of bytes for bytes" }, { "pc": [1980], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::Service" }, { "pc": [2768, 3077], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::SubscriptionInfoWithExistence" }, { "pc": [3336], "errorMessage": "invalid number of bytes for smart_contracts/subscriptions/types.ts::SubscriptionKey" }, { "pc": [398, 928, 1191, 2134, 2255, 2377, 2469], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [1945], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint64,uint64,uint64,uint64,uint64,uint8[32],(len+utf8[]),(len+utf8[]),uint8[36],uint8,uint8[3])" }, { "pc": [1966], "errorMessage": "invalid tail pointer at index 8 of (uint8,uint64,uint64,uint64,uint64,uint64,uint8[32],(len+utf8[]),(len+utf8[]),uint8[36],uint8,uint8[3])" }, { "pc": [1695, 2562, 2979], "errorMessage": "invalid tail pointer for (len+(len+uint8[])[])" }, { "pc": [1940, 1961], "errorMessage": "invalid tuple encoding" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNiAyMDM0CiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJhYWwiIDB4MTUxZjdjNzUgInNwZW5kaW5nX2FkZHJlc3MiICJkIiAweDE3OTVhMGQwIDB4NDM5MjI2NTUgMHhkMTA3OWNhZSAweGNmMTYwMTFkICJFUlI6QkRMTiIgIkVSUjpJQ09SIiAiY29udHJvbGxlZF9hZGRyZXNzIiAweDI1YjgxMmE3ICJFUlI6Q1RSRyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNsYXNzIFN1YnNjcmlwdGlvbnNQbHVnaW4gZXh0ZW5kcyBjbGFzc2VzKEJhc2VTdWJzY3JpcHRpb25zLCBBa2l0YUJhc2VDb250cmFjdCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAyMQogICAgcHVzaGJ5dGVzIDB4YmE5NzNjZDAgLy8gbWV0aG9kICJvcHRJbih1aW50NjQsYm9vbCx1aW50NjQpdm9pZCIKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJpbml0RGVzY3JpcHRpb24odWludDY0LHVpbnQ2NCl2b2lkIgogICAgYnl0ZWMgOCAvLyBtZXRob2QgImxvYWREZXNjcmlwdGlvbih1aW50NjQsdWludDY0LGJ5dGVbXSl2b2lkIgogICAgcHVzaGJ5dGVzcyAweGI2YWFjMzlkIDB4MzlhM2FlNDcgMHgxOWIxZmMyYiAweGJlYzg2YzM0IDB4OWY1OWE5NzAgMHhjOWNjYTQ1YyAweDIzZTMzN2JkIDB4ZDU1MDI4NjEgMHhlYTIxNzhhYSAweDFjNDI0NjFiIDB4MzNlOTJjOTQgMHg4NTRkZWRlMCAvLyBtZXRob2QgIm5ld1NlcnZpY2UodWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHN0cmluZyxieXRlWzM2XSx1aW50OCxieXRlWzNdKXVpbnQ2NCIsIG1ldGhvZCAicGF1c2VTZXJ2aWNlKHVpbnQ2NCxib29sLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzaHV0ZG93blNlcnZpY2UodWludDY0LGJvb2wsdWludDY0KXZvaWQiLCBtZXRob2QgImJsb2NrKHVpbnQ2NCxib29sLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAidW5ibG9jayh1aW50NjQsYm9vbCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgInN1YnNjcmliZSh1aW50NjQsYm9vbCx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW11bXSl2b2lkIiwgbWV0aG9kICJ0cmlnZ2VyUGF5bWVudCh1aW50NjQsYm9vbCxhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIiwgbWV0aG9kICJmdW5kVHJpZ2dlclBheW1lbnQodWludDY0LGJvb2wsdWludDY0LGJ5dGVbXVtdKXZvaWQiLCBtZXRob2QgInN0cmVha0NoZWNrKHVpbnQ2NCxib29sLChhZGRyZXNzLHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAic2V0UGFzc2VzKHVpbnQ2NCxib29sLHVpbnQ2NCxhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBvcHRJbiBpbml0RGVzY3JpcHRpb24gbG9hZERlc2NyaXB0aW9uIG5ld1NlcnZpY2UgcGF1c2VTZXJ2aWNlIHNodXRkb3duU2VydmljZSBibG9jayB1bmJsb2NrIHN1YnNjcmliZSB0cmlnZ2VyUGF5bWVudCBmdW5kVHJpZ2dlclBheW1lbnQgc3RyZWFrQ2hlY2sgc2V0UGFzc2VzIHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxOQogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNsYXNzIFN1YnNjcmlwdGlvbnNQbHVnaW4gZXh0ZW5kcyBjbGFzc2VzKEJhc2VTdWJzY3JpcHRpb25zLCBBa2l0YUJhc2VDb250cmFjdCkgewogICAgcHVzaGJ5dGVzIDB4NmY5ODE3ZjYgLy8gbWV0aG9kICJjcmVhdGUodWludDY0LHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWtleUFkZHJlc3MocmVrZXlCYWNrOiB1aW50NjQsIHdhbGxldDogdWludDY0KSAtPiBieXRlczoKcmVrZXlBZGRyZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjUKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZWtleUFkZHJlc3MocmVrZXlCYWNrOiBib29sZWFuLCB3YWxsZXQ6IEFwcGxpY2F0aW9uKTogQWNjb3VudCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzI2CiAgICAvLyBpZiAoIXJla2V5QmFjaykgewogICAgZnJhbWVfZGlnIC0yCiAgICBibnogcmVrZXlBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMjcKICAgIC8vIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgpyZWtleUFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozMzAKICAgIC8vIHJldHVybiB3YWxsZXQuYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4uY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI4CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjkKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBBcHBsaWNhdGlvbihha2l0YURBTykKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLm9wdEluW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDktNTMKICAgIC8vIG9wdEluKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFzc2V0OiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU4LTYyCiAgICAvLyBjb25zdCBjb3N0ID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUub3B0SW5Db3N0Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtBc3NldChhc3NldCldLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweDMzZjc4ODA4IC8vIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NjQtNzYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGNvc3QsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo3MAogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjY4LTcyCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGNvc3QsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo2NC03NgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogY29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBBc3NldChhc3NldCksCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjY0LTc2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBjb3N0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KSwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzOTRlYWViMiAvLyBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OS01MwogICAgLy8gb3B0SW4oCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYXNzZXQ6IHVpbnQ2NAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLmluaXREZXNjcmlwdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXREZXNjcmlwdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo3OQogICAgLy8gaW5pdERlc2NyaXB0aW9uKHdhbGxldDogQXBwbGljYXRpb24sIHNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjgwCiAgICAvLyBsb2dnZWRBc3NlcnQoc2l6ZSA8PSBNQVhfREVTQ1JJUFRJT05fTEVOR1RILCBFUlJfQkFEX0RFU0NSSVBUSU9OX0xFTkdUSCkKICAgIHB1c2hpbnQgMzE1MQogICAgPD0KICAgIGJueiBpbml0RGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDkgLy8gIkVSUjpCRExOIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkJETE4KCmluaXREZXNjcmlwdGlvbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZGVzY3JpcHRpb24gPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlTdWJzY3JpcHRpb25zRGVzY3JpcHRpb24gfSkKICAgIGJ5dGVjIDQgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGlmICghdGhpcy5kZXNjcmlwdGlvbi5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGluaXREZXNjcmlwdGlvbl9lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gdGhpcy5kZXNjcmlwdGlvbi5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0RGVzY3JpcHRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyBpbml0RGVzY3JpcHRpb24od2FsbGV0OiBBcHBsaWNhdGlvbiwgc2l6ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgppbml0RGVzY3JpcHRpb25fZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyB0aGlzLmRlc2NyaXB0aW9uLnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdERlc2NyaXB0aW9uX2FmdGVyX2lmX2Vsc2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5sb2FkRGVzY3JpcHRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpsb2FkRGVzY3JpcHRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gbG9hZERlc2NyaXB0aW9uKHdhbGxldDogQXBwbGljYXRpb24sIG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gbG9nZ2VkQXNzZXJ0KG9mZnNldCArIGRhdGEubGVuZ3RoIDw9IE1BWF9ERVNDUklQVElPTl9MRU5HVEgsIEVSUl9CQURfREVTQ1JJUFRJT05fTEVOR1RIKQogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDMxNTEKICAgIDw9CiAgICBibnogbG9hZERlc2NyaXB0aW9uX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA5IC8vICJFUlI6QkRMTiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpCRExOCgpsb2FkRGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTAKICAgIC8vIGNvbnN0IGV4cGVjdGVkUHJldmlvdXNDYWxsczogdWludDY0ID0gb2Zmc2V0IC8gTUFYX0xPQURfREVTQ1JJUFRJT05fQ0hVTktfU0laRQogICAgZGlnIDEKICAgIHB1c2hpbnQgMjAyNgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyBjb25zdCB0eG4gPSBndHhuLlRyYW5zYWN0aW9uKFR4bi5ncm91cEluZGV4IC0gZXhwZWN0ZWRQcmV2aW91c0NhbGxzIC0gMSkKICAgIHR4biBHcm91cEluZGV4CiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5MwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gNgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5My05NAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgZGlnIDIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5My05NAogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgZGlnIDIKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5My05NQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgYnogbG9hZERlc2NyaXB0aW9uX2Jvb2xfZmFsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5NgogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkaWcgMgogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTMtOTYKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IGxvYWREZXNjcmlwdGlvbl9ib29sX2ZhbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXREZXNjcmlwdGlvbikKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJpbml0RGVzY3JpcHRpb24odWludDY0LHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0RGVzY3JpcHRpb24pCiAgICBieiBsb2FkRGVzY3JpcHRpb25fYm9vbF9mYWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBkaWcgMgogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjkzLTk4CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXREZXNjcmlwdGlvbikKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWREZXNjcmlwdGlvbl9ib29sX2ZhbHNlQDEwCiAgICBpbnRjXzEgLy8gMQoKbG9hZERlc2NyaXB0aW9uX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OTItOTkKICAgIC8vIGxvZ2dlZEFzc2VydCgoCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAgICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAgICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAgICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gICAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0RGVzY3JpcHRpb24pCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBibnogbG9hZERlc2NyaXB0aW9uX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMTAgLy8gIkVSUjpJQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklDT1IKCmxvYWREZXNjcmlwdGlvbl9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGVzY3JpcHRpb24uZXhpc3RzLCBFUlJfREVTQ1JJUFRJT05fTk9UX0lOSVRJQUxJWkVEKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogbG9hZERlc2NyaXB0aW9uX2FmdGVyX2Fzc2VydEAxNQogICAgcHVzaGJ5dGVzICJFUlI6RE5JVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpETklUCgpsb2FkRGVzY3JpcHRpb25fYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHRoaXMuZGVzY3JpcHRpb24ucmVwbGFjZShvZmZzZXQsIGRhdGEpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIGxvYWREZXNjcmlwdGlvbih3YWxsZXQ6IEFwcGxpY2F0aW9uLCBvZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxvYWREZXNjcmlwdGlvbl9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZERlc2NyaXB0aW9uX2Jvb2xfbWVyZ2VAMTEKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4ubmV3U2VydmljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm5ld1NlcnZpY2U6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMDUtMTE4CiAgICAvLyBuZXdTZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGludGVydmFsOiB1aW50NjQsCiAgICAvLyAgIGFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICBwYXNzZXM6IHVpbnQ2NCwKICAgIC8vICAgZ2F0ZTogdWludDY0LAogICAgLy8gICBwYXlvdXRBZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICB0aXRsZTogc3RyaW5nLAogICAgLy8gICBiYW5uZXJJbWFnZTogQ0lELAogICAgLy8gICBoaWdobGlnaHRNZXNzYWdlOiBVaW50OCwKICAgIC8vICAgaGlnaGxpZ2h0Q29sb3I6IGJ5dGVzPDM+CiAgICAvLyApOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDM2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDM+CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjEKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjEyNC0xMjUKICAgIC8vIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCAmJgogICAgYnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsICYmCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gNgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjQtMTI1CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIGJ6IG5ld1NlcnZpY2VfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCAmJgogICAgZHVwCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTI0LTEyNgogICAgLy8gVHhuLmdyb3VwSW5kZXggPiAyICYmIC8vIFthcmM1OF9yZWtleVRvUGx1Z2luLCBpbml0RGVzY3JpcHRpb24sIGxvYWREZXNjcmlwdGlvbl0KICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsICYmCiAgICAvLyB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZCAmJgogICAgYnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIHR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBkdXAKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjQtMTI3CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIC8vIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICAvLyB0eG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgYnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjgKICAgIC8vIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjQtMTI4CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIC8vIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICAvLyB0eG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBibnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmxvYWREZXNjcmlwdGlvbiksCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyBtZXRob2QgImxvYWREZXNjcmlwdGlvbih1aW50NjQsdWludDY0LGJ5dGVbXSl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjQtMTI5CiAgICAvLyBUeG4uZ3JvdXBJbmRleCA+IDIgJiYgLy8gW2FyYzU4X3Jla2V5VG9QbHVnaW4sIGluaXREZXNjcmlwdGlvbiwgbG9hZERlc2NyaXB0aW9uXQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwgJiYKICAgIC8vIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICAvLyB0eG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5sb2FkRGVzY3JpcHRpb24pLAogICAgYnogbmV3U2VydmljZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpuZXdTZXJ2aWNlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMjMtMTMxCiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgIFR4bi5ncm91cEluZGV4ID4gMiAmJiAvLyBbYXJjNThfcmVrZXlUb1BsdWdpbiwgaW5pdERlc2NyaXB0aW9uLCBsb2FkRGVzY3JpcHRpb25dCiAgICAvLyAgIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsICYmCiAgICAvLyAgIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkICYmCiAgICAvLyAgIHR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gICB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5sb2FkRGVzY3JpcHRpb24pLAogICAgLy8gICBFUlJfSU5WQUxJRF9DQUxMX09SREVSCiAgICAvLyApCiAgICBibnogbmV3U2VydmljZV9hZnRlcl9hc3NlcnRAMTEKICAgIGJ5dGVjIDEwIC8vICJFUlI6SUNPUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJQ09SCgpuZXdTZXJ2aWNlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTM1LTEzOQogICAgLy8gY29uc3QgY29zdCA9IGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLm5ld1NlcnZpY2VDb3N0Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFthc3NldF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBwdXNoYnl0ZXMgMHgxZGM3ODM3MSAvLyBtZXRob2QgIm5ld1NlcnZpY2VDb3N0KHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTQxLTE2MQogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLm5ld1NlcnZpY2U+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogY29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBhc3NldCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcGFzc2VzLAogICAgLy8gICAgIGdhdGUsCiAgICAvLyAgICAgcGF5b3V0QWRkcmVzcywKICAgIC8vICAgICB0aXRsZSwKICAgIC8vICAgICBiYW5uZXJJbWFnZSwKICAgIC8vICAgICBoaWdobGlnaHRNZXNzYWdlLAogICAgLy8gICAgIGhpZ2hsaWdodENvbG9yLAogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE0NS0xNDkKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogY29zdCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE0MS0xNjEKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5uZXdTZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGNvc3QsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgYXNzZXQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHBhc3NlcywKICAgIC8vICAgICBnYXRlLAogICAgLy8gICAgIHBheW91dEFkZHJlc3MsCiAgICAvLyAgICAgdGl0bGUsCiAgICAvLyAgICAgYmFubmVySW1hZ2UsCiAgICAvLyAgICAgaGlnaGxpZ2h0TWVzc2FnZSwKICAgIC8vICAgICBoaWdobGlnaHRDb2xvciwKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgcHVzaGJ5dGVzIDB4OWIwZjg5ZDYgLy8gbWV0aG9kICJuZXdTZXJ2aWNlKHBheSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzZdLHVpbnQ4LGJ5dGVbM10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBkZXNjcmlwdGlvbiA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleVN1YnNjcmlwdGlvbnNEZXNjcmlwdGlvbiB9KQogICAgYnl0ZWMgNCAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIGNvbnN0IHNpemUgPSB0aGlzLmRlc2NyaXB0aW9uLmxlbmd0aAogICAgYm94X2xlbgogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTY0CiAgICAvLyBpZiAoc2l6ZSA+IE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFKSB7CiAgICBpbnRjIDQgLy8gMjAzNAogICAgPgogICAgYnogbmV3U2VydmljZV9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZGVzY3JpcHRpb24gPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlTdWJzY3JpcHRpb25zRGVzY3JpcHRpb24gfSkKICAgIGJ5dGVjIDQgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyBjb25zdCBjaHVuayA9IHRoaXMuZGVzY3JpcHRpb24uZXh0cmFjdCgwLCBNQVhfREVTQ1JJUFRJT05fQ0hVTktfU0laRSkKICAgIGludGNfMCAvLyAwCiAgICBpbnRjIDQgLy8gMjAzNAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNjctMTcxCiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zZXRTZXJ2aWNlRGVzY3JpcHRpb24+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWzAsIGNodW5rXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGFyZ3M6IFswLCBjaHVua10sCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE2Ny0xNzEKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFNlcnZpY2VEZXNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbMCwgY2h1bmtdLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJzZXRTZXJ2aWNlRGVzY3JpcHRpb24odWludDY0LGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNzMtMTc3CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zZXRTZXJ2aWNlRGVzY3JpcHRpb24+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWzAsIHRoaXMuZGVzY3JpcHRpb24uZXh0cmFjdChNQVhfREVTQ1JJUFRJT05fQ0hVTktfU0laRSwgc2l6ZSAtIE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFKV0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBhcmdzOiBbMCwgdGhpcy5kZXNjcmlwdGlvbi5leHRyYWN0KE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFLCBzaXplIC0gTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUpXSwKICAgIHVuY292ZXIgMwogICAgaW50YyA0IC8vIDIwMzQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gZGVzY3JpcHRpb24gPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlTdWJzY3JpcHRpb25zRGVzY3JpcHRpb24gfSkKICAgIGJ5dGVjIDQgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBhcmdzOiBbMCwgdGhpcy5kZXNjcmlwdGlvbi5leHRyYWN0KE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFLCBzaXplIC0gTUFYX0RFU0NSSVBUSU9OX0NIVU5LX1NJWkUpXSwKICAgIGludGMgNCAvLyAyMDM0CiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxNzMtMTc3CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zZXRTZXJ2aWNlRGVzY3JpcHRpb24+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWzAsIHRoaXMuZGVzY3JpcHRpb24uZXh0cmFjdChNQVhfREVTQ1JJUFRJT05fQ0hVTktfU0laRSwgc2l6ZSAtIE1BWF9ERVNDUklQVElPTl9DSFVOS19TSVpFKV0sCiAgICAvLyB9KQogICAgYnl0ZWMgNSAvLyBtZXRob2QgInNldFNlcnZpY2VEZXNjcmlwdGlvbih1aW50NjQsYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCgpuZXdTZXJ2aWNlX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTg5LTE5MwogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuYWN0aXZhdGVTZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgZGlnIDE0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweGM4ODM1MTMwIC8vIG1ldGhvZCAiYWN0aXZhdGVTZXJ2aWNlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIGl0eG5Db21wb3NlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE5Ny0yMDIKICAgIC8vIGNvbnN0IGlkID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2V0U2VydmljZUxpc3Q+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW3NlbmRlcl0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgZGlnIDE2CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxOTctMjAyCiAgICAvLyBjb25zdCBpZCA9IGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdldFNlcnZpY2VMaXN0Pih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtzZW5kZXJdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweGRmZTYwMmNmIC8vIG1ldGhvZCAiZ2V0U2VydmljZUxpc3QoYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIHJldHVybiAoaWQgLSAxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoxMDUtMTE4CiAgICAvLyBuZXdTZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGludGVydmFsOiB1aW50NjQsCiAgICAvLyAgIGFzc2V0OiB1aW50NjQsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICBwYXNzZXM6IHVpbnQ2NCwKICAgIC8vICAgZ2F0ZTogdWludDY0LAogICAgLy8gICBwYXlvdXRBZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICB0aXRsZTogc3RyaW5nLAogICAgLy8gICBiYW5uZXJJbWFnZTogQ0lELAogICAgLy8gICBoaWdobGlnaHRNZXNzYWdlOiBVaW50OCwKICAgIC8vICAgaGlnaGxpZ2h0Q29sb3I6IGJ5dGVzPDM+CiAgICAvLyApOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbmV3U2VydmljZV9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGRlc2NyaXB0aW9uID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5U3Vic2NyaXB0aW9uc0Rlc2NyaXB0aW9uIH0pCiAgICBieXRlYyA0IC8vICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gY29uc3QgY2h1bmsgPSB0aGlzLmRlc2NyaXB0aW9uLmV4dHJhY3QoMCwgc2l6ZSkKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTgyLTE4NgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2V0U2VydmljZURlc2NyaXB0aW9uPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFswLCBjaHVua10sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyBhcmdzOiBbMCwgY2h1bmtdLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjE4Mi0xODYKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFNlcnZpY2VEZXNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbMCwgY2h1bmtdLAogICAgLy8gfSkKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJzZXRTZXJ2aWNlRGVzY3JpcHRpb24odWludDY0LGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBuZXdTZXJ2aWNlX2FmdGVyX2lmX2Vsc2VAMTUKCm5ld1NlcnZpY2VfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbmV3U2VydmljZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4ucGF1c2VTZXJ2aWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKcGF1c2VTZXJ2aWNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxMC0yMTQKICAgIC8vIHBhdXNlU2VydmljZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxOS0yMjQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnBhdXNlU2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaWRdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxOS0yMjQKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnBhdXNlU2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaWRdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDE3Yzg3MzBiIC8vIG1ldGhvZCAicGF1c2VTZXJ2aWNlKHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIxMC0yMTQKICAgIC8vIHBhdXNlU2VydmljZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5zaHV0ZG93blNlcnZpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpzaHV0ZG93blNlcnZpY2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjI3LTIzMQogICAgLy8gc2h1dGRvd25TZXJ2aWNlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGluZGV4OiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIzNi0yNDEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNodXRkb3duU2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaW5kZXhdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNDAKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIzNi0yNDEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNodXRkb3duU2VydmljZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaW5kZXhdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDg3ZTA1NWM2IC8vIG1ldGhvZCAic2h1dGRvd25TZXJ2aWNlKHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjIyNy0yMzEKICAgIC8vIHNodXRkb3duU2VydmljZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBpbmRleDogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4uYmxvY2tbcm91dGluZ10oKSAtPiB2b2lkOgpibG9jazoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNDQtMjQ4CiAgICAvLyBibG9jaygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50CiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzMgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjUxCiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjUxCiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTMtMjY1CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5ibG9jaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiB0aGlzLm1icigpLmJsb2NrcywKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhZGRyZXNzLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTkKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyBhbW91bnQ6IHRoaXMubWJyKCkuYmxvY2tzLAogICAgcHVzaGludCAxNTcwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjEKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdGhpcy5tYnIoKS5ibG9ja3MsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNTMtMjY1CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5ibG9jaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiB0aGlzLm1icigpLmJsb2NrcywKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhZGRyZXNzLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjUzLTI2NQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuYmxvY2s+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogdGhpcy5tYnIoKS5ibG9ja3MsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgYWRkcmVzcywKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhiNTljOGE1NCAvLyBtZXRob2QgImJsb2NrKHBheSxhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MjQ0LTI0OAogICAgLy8gYmxvY2soCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYWRkcmVzczogQWNjb3VudAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnVuYmxvY2tbcm91dGluZ10oKSAtPiB2b2lkOgp1bmJsb2NrOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI2OC0yNzIKICAgIC8vIHVuYmxvY2soCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYWRkcmVzczogQWNjb3VudAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjc3LTI4MgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUudW5ibG9jaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbYWRkcmVzc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjc3LTI4MgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUudW5ibG9jaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbYWRkcmVzc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4YWVlYmIzNzggLy8gbWV0aG9kICJ1bmJsb2NrKGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyNjgtMjcyCiAgICAvLyB1bmJsb2NrKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFkZHJlc3M6IEFjY291bnQKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi5zdWJzY3JpYmVbcm91dGluZ10oKSAtPiB2b2lkOgpzdWJzY3JpYmU6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI4NS0yOTQKICAgIC8vIHN1YnNjcmliZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFjY291bnQsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICBpbnRlcnZhbDogdWludDY0LAogICAgLy8gICBpbmRleDogdWludDY0LAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCnN1YnNjcmliZV9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjg1LTI5NAogICAgLy8gc3Vic2NyaWJlKAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFzc2V0OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWNjb3VudCwKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIGludGVydmFsOiB1aW50NjQsCiAgICAvLyAgIGluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IHN1YnNjcmliZV9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBwdXNoaW50IDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisobGVuK3VpbnQ4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3Vic2NyaWJlX2Zvcl9oZWFkZXJAMQoKc3Vic2NyaWJlX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI4NS0yOTQKICAgIC8vIHN1YnNjcmliZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFjY291bnQsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICBpbnRlcnZhbDogdWludDY0LAogICAgLy8gICBpbmRleDogdWludDY0LAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICBkaWcgMwogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGJ5dGVzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDEzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY3CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIGJ5dGVjIDExIC8vICJjb250cm9sbGVkX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NS0xNjgKICAgIC8vIGNvbnN0IFtjb250cm9sbGVkQWNjb3VudEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3NQogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICBwdXNoYnl0ZXMgInJlZmVycmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjIKICAgIC8vIHdhbGxldEFkZHJlc3M6IHdhbGxldC5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNjEtMjY2CiAgICAvLyByZXR1cm4gewogICAgLy8gICB3YWxsZXRBZGRyZXNzOiB3YWxsZXQuYWRkcmVzcywKICAgIC8vICAgb3JpZ2luLAogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlZmVycmVyCiAgICAvLyB9CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gY29uc3QgeyBvcmlnaW4sIHNlbmRlciB9ID0gZ2V0QWNjb3VudHMod2FsbGV0KQogICAgZHVwCiAgICBleHRyYWN0IDMyIDMyCiAgICBidXJ5IDE5CiAgICBleHRyYWN0IDY0IDMyCiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBsZXQgbWJyQW1vdW50ID0gY29zdHMuc3Vic2NyaXB0aW9ucwogICAgcHVzaGludCA2MDUwMAogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMwMi0zMDYKICAgIC8vIGNvbnN0IGZpcnN0U3Vic2NyaXB0aW9uID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuaXNGaXJzdFN1YnNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbc2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIHB1c2hieXRlcyAweDYwM2Q3Mjk3IC8vIG1ldGhvZCAiaXNGaXJzdFN1YnNjcmlwdGlvbihhZGRyZXNzKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyBpZiAoZmlyc3RTdWJzY3JpcHRpb24pIHsKICAgIGJ6IHN1YnNjcmliZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIG1ickFtb3VudCArPSBjb3N0cy5zdWJzY3JpcHRpb25zbGlzdAogICAgcHVzaGludCA3OTQwMAogICAgYnVyeSAxNQoKc3Vic2NyaWJlX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGlmIChpc0FzYSAmJiAhdGhpcy5ha2l0YURBTy52YWx1ZS5hZGRyZXNzLmlzT3B0ZWRJbihBc3NldChhc3NldCkpKSB7CiAgICBkaWcgMTEKICAgIGJ6IHN1YnNjcmliZV9hZnRlcl9pZl9lbHNlQDExCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBpZiAoaXNBc2EgJiYgIXRoaXMuYWtpdGFEQU8udmFsdWUuYWRkcmVzcy5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAxMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gbWJyQW1vdW50ICs9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDE0CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIGJ1cnkgMTUKCnN1YnNjcmliZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gaWYgKGFyZ3MubGVuZ3RoID4gMCkgewogICAgZGlnIDQKICAgIGJ6IHN1YnNjcmliZV9lbHNlX2JvZHlAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMxOQogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMxOQogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMyMS0zMjUKICAgIC8vIGNvbnN0IHNlcnZpY2UgPSBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5nZXRTZXJ2aWNlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNpcGllbnQsIGluZGV4XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDE3CiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgcHVzaGJ5dGVzIDB4ZDRiMTZlN2EgLy8gbWV0aG9kICJnZXRTZXJ2aWNlKGFkZHJlc3MsdWludDY0KSh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLHN0cmluZyxieXRlWzM2XSx1aW50OCxieXRlWzNdKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMTcKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNyBvZiAodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OFszMl0sKGxlbit1dGY4W10pLChsZW4rdXRmOFtdKSx1aW50OFszNl0sdWludDgsdWludDhbM10pCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDExOQogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgNzUKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDggb2YgKHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDhbMzJdLChsZW4rdXRmOFtdKSwobGVuK3V0ZjhbXSksdWludDhbMzZdLHVpbnQ4LHVpbnQ4WzNdKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbnMvdHlwZXMudHM6OlNlcnZpY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHNlcnZpY2UuZ2F0ZUlELAogICAgZXh0cmFjdCAzNyA4CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBpZiAoaXNBc2EpIHsKICAgIGRpZyAxMwogICAgYnogc3Vic2NyaWJlX2Vsc2VfYm9keUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzOS0zNjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGdhdGVUeG4sCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAxNwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTgKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMTkKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNDMtMzQ3CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG1ickFtb3VudCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM0OC0zNTMKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vIH0pLAogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzUwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyAxNgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzQ4LTM1MwogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gfSksCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gZ2F0ZVR4biwKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAibXVzdENoZWNrKGFkZHJlc3MsdWludDY0LGJ5dGVbXVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzI3LTMzNgogICAgLy8gY29uc3QgZ2F0ZVR4biA9IGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBzZXJ2aWNlLmdhdGVJRCwKICAgIC8vICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzM5LTM2MQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2F0ZWRTdWJzY3JpYmVBc2E+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZ2F0ZVR4biwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2MAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgZGlnIDE2CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzM5LTM2MQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2F0ZWRTdWJzY3JpYmVBc2E+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgZ2F0ZVR4biwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweGE2OGU2OTYzIC8vIG1ldGhvZCAiZ2F0ZWRTdWJzY3JpYmVBc2EocGF5LGF4ZmVyLGFwcGwsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKCnN1YnNjcmliZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjI4NS0yOTQKICAgIC8vIHN1YnNjcmliZSgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFjY291bnQsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICBpbnRlcnZhbDogdWludDY0LAogICAgLy8gICBpbmRleDogdWludDY0LAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdWJzY3JpYmVfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2My0zNzkKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBnYXRlVHhuLAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgaW5kZXgsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMTcKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gYW1vdW50OiBhbW91bnQgKyBtYnJBbW91bnQsCiAgICBkaWcgMTIKICAgIGRpZyAxOQogICAgKwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxOQogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2Ny0zNzEKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogYW1vdW50ICsgbWJyQW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzcyCiAgICAvLyBnYXRlVHhuLAogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJtdXN0Q2hlY2soYWRkcmVzcyx1aW50NjQsYnl0ZVtdW10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzI3LTMzNgogICAgLy8gY29uc3QgZ2F0ZVR4biA9IGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIG9yaWdpbiwKICAgIC8vICAgICBzZXJ2aWNlLmdhdGVJRCwKICAgIC8vICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzYzLTM3OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2F0ZWRTdWJzY3JpYmU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogYW1vdW50ICsgbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGdhdGVUeG4sCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICBpbnRlcnZhbCwKICAgIC8vICAgICBpbmRleCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTQKICAgIGRpZyAxNgogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM2My0zNzkKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkU3Vic2NyaWJlPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBnYXRlVHhuLAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgaW5kZXgsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NTM1NWRhNmQgLy8gbWV0aG9kICJnYXRlZFN1YnNjcmliZShwYXksYXBwbCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAzMwoKc3Vic2NyaWJlX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozODIKICAgIC8vIGlmIChpc0FzYSkgewogICAgZGlnIDExCiAgICBieiBzdWJzY3JpYmVfZWxzZV9ib2R5QDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzgzLTQwNAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDE1CiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAxNgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjM4Ny0zOTEKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWJyQW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzkyLTM5NwogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gfSksCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozOTQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAxMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czozOTItMzk3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzgzLTQwNAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQwMwogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyAxNAogICAgZGlnIDE2CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6MzgzLTQwNAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc3Vic2NyaWJlQXNhPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQ6IGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweGIxMGEzMDZlIC8vIG1ldGhvZCAic3Vic2NyaWJlQXNhKHBheSxheGZlcixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAzMwoKc3Vic2NyaWJlX2Vsc2VfYm9keUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MDYtNDIxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdWJzY3JpYmU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDE1CiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGFtb3VudDogYW1vdW50ICsgbWJyQW1vdW50LAogICAgZGlnIDEwCiAgICBkaWcgMTcKICAgICsKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkaWcgMTcKICAgIGR1cAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MTAtNDE0CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQwNi00MjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnN1YnNjcmliZT4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkOiBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogYW1vdW50ICsgbWJyQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgaW50ZXJ2YWwsCiAgICAvLyAgICAgaW5kZXgsCiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDIwCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgZGlnIDE0CiAgICBkaWcgMTYKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MDYtNDIxCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdWJzY3JpYmU+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IGFtb3VudCArIG1ickFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIGludGVydmFsLAogICAgLy8gICAgIGluZGV4LAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDEwZjAwYzNhIC8vIG1ldGhvZCAic3Vic2NyaWJlKHBheSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUAzMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo6U3Vic2NyaXB0aW9uc1BsdWdpbi50cmlnZ2VyUGF5bWVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyaWdnZXJQYXltZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MjYtNDMyCiAgICAvLyB0cmlnZ2VyUGF5bWVudCgKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQsCiAgICAvLyAgIGFyZ3M6IEdhdGVBcmdzCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKdHJpZ2dlclBheW1lbnRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQyNi00MzIKICAgIC8vIHRyaWdnZXJQYXltZW50KAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFkZHJlc3M6IEFjY291bnQsCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogdHJpZ2dlclBheW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgcHVzaGludCAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1aW50OFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRyaWdnZXJQYXltZW50X2Zvcl9oZWFkZXJAMQoKdHJpZ2dlclBheW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDI2LTQzMgogICAgLy8gdHJpZ2dlclBheW1lbnQoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgYWRkcmVzczogQWNjb3VudCwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICBkaWcgMwogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGJ5dGVzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgZGlnIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcyCiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICBieXRlY18zIC8vICJzcGVuZGluZ19hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzAtMjczCiAgICAvLyBjb25zdCBbc3BlbmRpbmdBZGRyZXNzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgLy8gKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDM3CiAgICAvLyBpZiAoYXJncy5sZW5ndGggPiAwKSB7CiAgICBkaWcgNAogICAgYnogdHJpZ2dlclBheW1lbnRfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyBjb25zdCBnYXRlID0gZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLmdhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0MzgKICAgIC8vIGNvbnN0IGdhdGUgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuZ2F0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gY29uc3QgZ2F0ZSA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5nYXRlCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OQogICAgLy8gY29uc3QgW290aGVyQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c090aGVyQXBwTGlzdCkpCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBieXRlcwogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnVyeSAxMgogICAgYnogdHJpZ2dlclBheW1lbnRfaWZfYm9keUAxNQogICAgZGlnIDEwCiAgICBpbnRjXzIgLy8gOAogICAgIT0KICAgIGJ6IHRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTYKCnRyaWdnZXJQYXltZW50X2lmX2JvZHlAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgp0cmlnZ2VyUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNDMKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZGlnIDExCiAgICBibnogdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMQogICAgZGlnIDcKCnRyaWdnZXJQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDQzLTQ0NwogICAgLy8gY29uc3Qgc3ViID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9uPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFt7IGFkZHJlc3MsIGlkIH1dLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGFyZ3M6IFt7IGFkZHJlc3MsIGlkIH1dLAogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyA5CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAxNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ0My00NDcKICAgIC8vIGNvbnN0IHN1YiA9IGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbj4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbeyBhZGRyZXNzLCBpZCB9XSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyAxMiAvLyBtZXRob2QgImdldFN1YnNjcmlwdGlvbigoYWRkcmVzcyx1aW50NjQpKShib29sLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgcHVzaGludCAxMDUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb25zL3R5cGVzLnRzOjpTdWJzY3JpcHRpb25JbmZvV2l0aEV4aXN0ZW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ0OS00NjYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmdhdGVkVHJpZ2dlclBheW1lbnQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIGFwcElkOiBnYXRlLAogICAgLy8gICAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgICBtZXRob2RTZWxlY3RvcihHYXRlTXVzdENoZWNrQWJpTWV0aG9kKSwKICAgIC8vICAgICAgICAgc3ViT3JpZ2luLAogICAgLy8gICAgICAgICBzdWIuZ2F0ZUlELAogICAgLy8gICAgICAgICBlbmNvZGVBcmM0KGFyZ3MpCiAgICAvLyAgICAgICBdCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgeyBhZGRyZXNzLCBpZCB9CiAgICAvLyAgIF0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ1OQogICAgLy8gc3ViLmdhdGVJRCwKICAgIGV4dHJhY3QgNzcgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gbWV0aG9kU2VsZWN0b3IoR2F0ZU11c3RDaGVja0FiaU1ldGhvZCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAibXVzdENoZWNrKGFkZHJlc3MsdWludDY0LGJ5dGVbXVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ1My00NjIKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZDogZ2F0ZSwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgIHN1Yk9yaWdpbiwKICAgIC8vICAgICBzdWIuZ2F0ZUlELAogICAgLy8gICAgIGVuY29kZUFyYzQoYXJncykKICAgIC8vICAgXQogICAgLy8gfSksCiAgICBpbnRjXzMgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDQ5LTQ2NgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2F0ZWRUcmlnZ2VyUGF5bWVudD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgICAgICBzdWJPcmlnaW4sCiAgICAvLyAgICAgICAgIHN1Yi5nYXRlSUQsCiAgICAvLyAgICAgICAgIGVuY29kZUFyYzQoYXJncykKICAgIC8vICAgICAgIF0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB7IGFkZHJlc3MsIGlkIH0KICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICBkaWcgMTEKICAgIGRpZyAxMwogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDQ5LTQ2NgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2F0ZWRUcmlnZ2VyUGF5bWVudD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgICAgc2VuZGVyLAogICAgLy8gICAgICAgYXBwSWQ6IGdhdGUsCiAgICAvLyAgICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICAgIG1ldGhvZFNlbGVjdG9yKEdhdGVNdXN0Q2hlY2tBYmlNZXRob2QpLAogICAgLy8gICAgICAgICBzdWJPcmlnaW4sCiAgICAvLyAgICAgICAgIHN1Yi5nYXRlSUQsCiAgICAvLyAgICAgICAgIGVuY29kZUFyYzQoYXJncykKICAgIC8vICAgICAgIF0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB7IGFkZHJlc3MsIGlkIH0KICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgyODFiODkxYiAvLyBtZXRob2QgImdhdGVkVHJpZ2dlclBheW1lbnQoYXBwbCwoYWRkcmVzcyx1aW50NjQpKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp0cmlnZ2VyUGF5bWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQyNi00MzIKICAgIC8vIHRyaWdnZXJQYXltZW50KAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGFkZHJlc3M6IEFjY291bnQsCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjcKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgYnl0ZWMgMTEgLy8gImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIGNvbnN0IHN1Yk9yaWdpbiA9IG9yaWdpbk9yKHN1YldhbGxldCwgYWRkcmVzcykKICAgIGIgdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckAyMgoKdHJpZ2dlclBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTk1CiAgICAvLyByZXR1cm4gYnRvaShkYXRhKQogICAgZGlnIDE1CiAgICBidG9pCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgYiB0cmlnZ2VyUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDE3Cgp0cmlnZ2VyUGF5bWVudF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDY4LTQ3MwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUudHJpZ2dlclBheW1lbnQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW3sgYWRkcmVzcywgaWQgfV0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ3MQogICAgLy8gYXJnczogW3sgYWRkcmVzcywgaWQgfV0sCiAgICBkaWcgNgogICAgaXRvYgogICAgZGlnIDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ3MgogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIGRpZyA5CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGRpZyAxNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBkaWcgMTUKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDY4LTQ3MwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUudHJpZ2dlclBheW1lbnQ+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW3sgYWRkcmVzcywgaWQgfV0sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4YzNkOWYxZGMgLy8gbWV0aG9kICJ0cmlnZ2VyUGF5bWVudCgoYWRkcmVzcyx1aW50NjQpKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIHRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTIKCgovLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6OlN1YnNjcmlwdGlvbnNQbHVnaW4uZnVuZFRyaWdnZXJQYXltZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZFRyaWdnZXJQYXltZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NzctNDgyCiAgICAvLyBmdW5kVHJpZ2dlclBheW1lbnQoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCmZ1bmRUcmlnZ2VyUGF5bWVudF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDc3LTQ4MgogICAgLy8gZnVuZFRyaWdnZXJQYXltZW50KAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogZnVuZFRyaWdnZXJQYXltZW50X2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyhsZW4rdWludDhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBmdW5kVHJpZ2dlclBheW1lbnRfZm9yX2hlYWRlckAxCgpmdW5kVHJpZ2dlclBheW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDc3LTQ4MgogICAgLy8gZnVuZFRyaWdnZXJQYXltZW50KAogICAgLy8gICB3YWxsZXQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICByZWtleUJhY2s6IGJvb2xlYW4sCiAgICAvLyAgIGlkOiBTdWJzY3JpcHRpb25JRCwKICAgIC8vICAgYXJnczogR2F0ZUFyZ3MKICAgIC8vICk6IHZvaWQgewogICAgZGlnIDMKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlcz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0ODYKICAgIC8vIGNvbnN0IGtleTogU3Vic2NyaXB0aW9uS2V5ID0geyBhZGRyZXNzOiBzZW5kZXIsIGlkIH0KICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NDg4LTQ5MgogICAgLy8gY29uc3Qgc3ViID0gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9uPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtrZXldLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgc3dhcAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGJ5dGVjIDEyIC8vIG1ldGhvZCAiZ2V0U3Vic2NyaXB0aW9uKChhZGRyZXNzLHVpbnQ2NCkpKGJvb2wsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgYnVyeSAxNwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxMDUKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb25zL3R5cGVzLnRzOjpTdWJzY3JpcHRpb25JbmZvV2l0aEV4aXN0ZW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjQ5NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHN1Yi5leGlzdHMsIEVSUl9TVUJTQ1JJUFRJT05fRE9FU19OT1RfRVhJU1QpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogZnVuZFRyaWdnZXJQYXltZW50X2FmdGVyX2Fzc2VydEA4CiAgICBwdXNoYnl0ZXMgIkVSUjpVRE5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlVETkUKCmZ1bmRUcmlnZ2VyUGF5bWVudF9hZnRlcl9hc3NlcnRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OTYKICAgIC8vIGNvbnN0IGxhdGVzdFdpbmRvd1N0YXJ0OiB1aW50NjQgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gKChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIC0gc3ViLnN0YXJ0RGF0ZSkgJSBzdWIuaW50ZXJ2YWwpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGRpZyAxNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQ1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgZGlnIDEKICAgIHB1c2hpbnQgNjEKICAgIGV4dHJhY3RfdWludDY0CiAgICAlCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OTcKICAgIC8vIGxvZ2dlZEFzc2VydChzdWIubGFzdFBheW1lbnQgPCBsYXRlc3RXaW5kb3dTdGFydCwgRVJSX0NBTk5PVF9UUklHR0VSKQogICAgc3dhcAogICAgcHVzaGludCA4NQogICAgZXh0cmFjdF91aW50NjQKICAgID4KICAgIGJueiBmdW5kVHJpZ2dlclBheW1lbnRfYWZ0ZXJfYXNzZXJ0QDEwCiAgICBieXRlYyAxMyAvLyAiRVJSOkNUUkciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Q1RSRwoKZnVuZFRyaWdnZXJQYXltZW50X2FmdGVyX2Fzc2VydEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0OTkKICAgIC8vIGxldCBmdW5kQW1vdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUwMAogICAgLy8gaWYgKHN1Yi5hbW91bnQgPiBzdWIuZXNjcm93ZWQpIHsKICAgIGRpZyAxNQogICAgZHVwCiAgICBwdXNoaW50IDUzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE0CiAgICBwdXNoaW50IDEwMQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMwogICAgPgogICAgYnogZnVuZFRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGZ1bmRBbW91bnQgPSBzdWIuYW1vdW50IC0gc3ViLmVzY3Jvd2VkCiAgICBkaWcgMTEKICAgIGRpZyAxMQogICAgLQogICAgYnVyeSAxMwoKZnVuZFRyaWdnZXJQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTA0CiAgICAvLyBsb2dnZWRBc3NlcnQoZnVuZEFtb3VudCA+IDAsIEVSUl9DQU5OT1RfVFJJR0dFUikKICAgIGRpZyAxMgogICAgYm56IGZ1bmRUcmlnZ2VyUGF5bWVudF9hZnRlcl9hc3NlcnRAMTQKICAgIGJ5dGVjIDEzIC8vICJFUlI6Q1RSRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpDVFJHCgpmdW5kVHJpZ2dlclBheW1lbnRfYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gaWYgKGZ1bmRBbW91bnQgPiAwKSB7CiAgICBkaWcgMTIKICAgIGJ6IGZ1bmRUcmlnZ2VyUGF5bWVudF9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTA3CiAgICAvLyBpZiAoc3ViLmFzc2V0ID09PSAwKSB7CiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNjkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJueiBmdW5kVHJpZ2dlclBheW1lbnRfZWxzZV9ib2R5QDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTA4LTUyMAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZGVwb3NpdD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBmdW5kQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGlkLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMTMKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDE1CiAgICBkdXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTEyLTUxNgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBmdW5kQW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTA4LTUyMAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZGVwb3NpdD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBmdW5kQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGlkLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTE5CiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpCiAgICBkaWcgOQogICAgZGlnIDExCiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTA4LTUyMAogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuZGVwb3NpdD4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHNlbmRlciwKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBmdW5kQW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIGlkLAogICAgLy8gICBdLAogICAgLy8gICByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4ZjIzNTViNTUgLy8gbWV0aG9kICJkZXBvc2l0KHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpmdW5kVHJpZ2dlclBheW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo0NzctNDgyCiAgICAvLyBmdW5kVHJpZ2dlclBheW1lbnQoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhcmdzOiBHYXRlQXJncwogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kVHJpZ2dlclBheW1lbnRfZWxzZV9ib2R5QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUyMi01MzUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmRlcG9zaXRBc2E+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBzdWIuYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogZnVuZEFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpZCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KQogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1MjgKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMTMKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgMTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxNQogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUyNi01MzEKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBzdWIuYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBmdW5kQW1vdW50LAogICAgLy8gfSksCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUyMi01MzUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmRlcG9zaXRBc2E+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBzdWIuYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogZnVuZEFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpZCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUzNAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KQogICAgZGlnIDkKICAgIGRpZyAxMQogICAgY2FsbHN1YiByZWtleUFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVrZXlUbwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjUyMi01MzUKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLmRlcG9zaXRBc2E+KHsKICAgIC8vICAgc2VuZGVyLAogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBzZW5kZXIsCiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgeGZlckFzc2V0OiBzdWIuYXNzZXQsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogZnVuZEFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBpZCwKICAgIC8vICAgXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDFhYzRhNzU4IC8vIG1ldGhvZCAiZGVwb3NpdEFzYShheGZlcix1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMyAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGZ1bmRUcmlnZ2VyUGF5bWVudF9hZnRlcl9pZl9lbHNlQDIzCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnN0cmVha0NoZWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3RyZWFrQ2hlY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTQwLTU0NAogICAgLy8gc3RyZWFrQ2hlY2soCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAga2V5OiBTdWJzY3JpcHRpb25LZXkKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9ucy90eXBlcy50czo6U3Vic2NyaXB0aW9uS2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyNzIKICAgIC8vIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIGJ5dGVjXzMgLy8gInNwZW5kaW5nX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MC0yNzMKICAgIC8vIGNvbnN0IFtzcGVuZGluZ0FkZHJlc3NCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0LAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNTcGVuZGluZ0FkZHJlc3MpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTQ3CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU0NwogICAgLy8gY29uc3QgYXBwSWQgPSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkuc3Vic2NyaXB0aW9ucykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18xIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTQ3CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NDktNTU0CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdHJlYWtDaGVjaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBba2V5XSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTUzCiAgICAvLyByZWtleVRvOiByZWtleUFkZHJlc3MocmVrZXlCYWNrLCB3YWxsZXQpLAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgcmVrZXlBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJla2V5VG8KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgc3dhcAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NDktNTU0CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBTdWJzY3JpcHRpb25zLnByb3RvdHlwZS5zdHJlYWtDaGVjaz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBba2V5XSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhjMGZmMjczMCAvLyBtZXRob2QgInN0cmVha0NoZWNrKChhZGRyZXNzLHVpbnQ2NCkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NDAtNTQ0CiAgICAvLyBzdHJlYWtDaGVjaygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBrZXk6IFN1YnNjcmlwdGlvbktleQogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjpTdWJzY3JpcHRpb25zUGx1Z2luLnNldFBhc3Nlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldFBhc3NlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NTctNTYyCiAgICAvLyBzZXRQYXNzZXMoCiAgICAvLyAgIHdhbGxldDogQXBwbGljYXRpb24sCiAgICAvLyAgIHJla2V5QmFjazogYm9vbGVhbiwKICAgIC8vICAgaWQ6IFN1YnNjcmlwdGlvbklELAogICAgLy8gICBhZGRyZXNzZXM6IEFjY291bnRbXQogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzMgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YWNjb3VudD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjI3MgogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzU3BlbmRpbmdBZGRyZXNzKQogICAgYnl0ZWNfMyAvLyAic3BlbmRpbmdfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjcwLTI3MwogICAgLy8gY29uc3QgW3NwZW5kaW5nQWRkcmVzc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1NwZW5kaW5nQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NjUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTY1CiAgICAvLyBjb25zdCBhcHBJZCA9IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5zdWJzY3JpcHRpb25zKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzEgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9wbHVnaW5zL3N1YnNjcmlwdGlvbnMvY29udHJhY3QuYWxnby50czo1NjUKICAgIC8vIGNvbnN0IGFwcElkID0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnN1YnNjcmlwdGlvbnMpCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU2Ni01NzEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFN1YnNjcmlwdGlvbnMucHJvdG90eXBlLnNldFBhc3Nlcz4oewogICAgLy8gICBzZW5kZXIsCiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbaWQsIGFkZHJlc3Nlc10sCiAgICAvLyAgIHJla2V5VG86IHJla2V5QWRkcmVzcyhyZWtleUJhY2ssIHdhbGxldCksCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIHJla2V5QWRkcmVzcwogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXJjNTgvcGx1Z2lucy9zdWJzY3JpcHRpb25zL2NvbnRyYWN0LmFsZ28udHM6NTY2LTU3MQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgU3Vic2NyaXB0aW9ucy5wcm90b3R5cGUuc2V0UGFzc2VzPih7CiAgICAvLyAgIHNlbmRlciwKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtpZCwgYWRkcmVzc2VzXSwKICAgIC8vICAgcmVrZXlUbzogcmVrZXlBZGRyZXNzKHJla2V5QmFjaywgd2FsbGV0KSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgyNzUyMDNhZiAvLyBtZXRob2QgInNldFBhc3Nlcyh1aW50NjQsYWRkcmVzc1tdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FyYzU4L3BsdWdpbnMvc3Vic2NyaXB0aW9ucy9jb250cmFjdC5hbGdvLnRzOjU1Ny01NjIKICAgIC8vIHNldFBhc3NlcygKICAgIC8vICAgd2FsbGV0OiBBcHBsaWNhdGlvbiwKICAgIC8vICAgcmVrZXlCYWNrOiBib29sZWFuLAogICAgLy8gICBpZDogU3Vic2NyaXB0aW9uSUQsCiAgICAvLyAgIGFkZHJlc3NlczogQWNjb3VudFtdCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpOREFPIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5EQU8KCnVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAEIBvIPJg4JYWtpdGFfZGFvA2FhbAQVH3x1EHNwZW5kaW5nX2FkZHJlc3MBZAQXlaDQBEOSJlUE0QecrgTPFgEdCEVSUjpCRExOCEVSUjpJQ09SEmNvbnRyb2xsZWRfYWRkcmVzcwQluBKnCEVSUjpDVFJHMRkURDEYQQBugAS6lzzQJwcnCIIMBLaqw50EOaOuRwQZsfwrBL7IbDQEn1mpcATJzKRcBCPjN70E1VAoYQTqIXiqBBxCRhsEM+kslASFTe3gNhoAjg8ATADZAQ0BsAP3BEQEkQTzBUEIvQpnDAEMTwywAAEAI0OABG+YF/Y2GgCOAQASAIoCAYv+QAADMgOJi/9yCESJNhoBSRUkEkQXNhoCSSJZgQIISwEVEkRXAgCAB3ZlcnNpb25MZyhMZyNDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJESwIrZUgiKGVEKWVIgSBbsUmyGEsBsgCABDP3iAiyGksCsholshAisgGztD5JVwQATFcABCoSREkVJBJEF7FLAXIIRLIHsghLAbIAI7IQIrIBtk8DTwSI/1GyILIYsgCABDlOrrKyGrIaJbIQIrIBsyNDNhoBFSQSRDYaAkkVJBJEF0mBzxgOQAAEJwmwACcEvUUBQAAIJwRLAblII0MnBEsB00L/9oAANhoBFSQSRDYaAkkVJBJEF0k2GgNJIlmBAghLARUSRFcCAElOAhUIgc8YDkAABCcJsABLAYHqDwoxFkwJIwlJRQQ4ECUSQQBVSwI4GDIIEkEAS0sCOBuBAxJBAEFLAjgZQAA6SwIiwhonBxJBAC9LAjgAMQASQQAlI0AABCcKsAAnBL1FAUAADIAIRVJSOkROSVSwACcESwJLArsjQyJC/9iAADYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAhUkEkQ2GgRJTgIVJBJENhoFSU4CFSQSRDYaBklOAhUkEkQ2GgdJTgIVJBJENhoISU4CFYEgEkQ2GglJTgJJIlmBAghMFRJENhoKSU4CFYEkEkQ2GgtJTgIVIxJENhoMSU4CFYEDEkQrZUgxFiMJMRaBAg1BAbBJOBAlEkEBqEk4GDIIEkEBn0k4G4EEEkEBlkk4GUABkEkiwhonCBJBAYYjQAAEJwqwACIoZUQpZUiBIFtJRRCxSbIYSwJJTgKyAIAEHceDcbIaSwxJTgOyGiWyECKyAbO0PklXBABMVwAEKhJESRUkEkQXsUsBcghEsgeyCEsBsgAjshAisgG2shiyAIAEmw+J1rIaSwyyGrIaSwmyGksIshpLB7IaSwayGksFshpLBLIaSwOyGksCsholshAisgEnBL1MSU8CRCEEDUEAtScEIiEEurYiFksBFRZXBgJPAlBLEUlOA7IYSwVJTgSyACcFshpLAbIasholshAisgG2TwMhBAknBCEETwK6SRUWVwYCTFBPArIYTwKyACcFshpMshqyGiWyECKyAbZLDkmyGEsCSU4CsgCABMiDUTCyGiWyECKyAbOxSw5LEIj8f7IgshhJsgCABN/mAs+yGrIaJbIQIrIBs7Q+SVcEAExXAAQqEkRJFSQSRBcjCRYqTFCwI0MnBCJPArq2IhZLARUWVwYCTwJQSxCyGEsDsgAnBbIaTLIasholshAisgFC/3siQv53NhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJESwIrZUhMIihlRCllSIEgW7FPA08EiPvnsiCyGEyyAIAEF8hzC7IasholshAisgGzI0M2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUkEkRLAitlSEwiKGVEKWVIgSBbsU8DTwSI+5qyILIYTLIAgASH4FXGshqyGiWyECKyAbMjQzYaAUkVJBJEFzYaAkkVIxJEIlM2GgNJFYEgEkRLAitlSCIoZUQpZUiBIFuxSXIIRIHUerIIsgdLAbIAI7IQIrIBtk8DTwSI+zeyILIYsgCABLWcilSyGrIaJbIQIrIBsyNDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVgSASREsCK2VITCIoZUQpZUiBIFuxTwNPBIj66rIgshhMsgCABK7rs3iyGrIaJbIQIrIBsyNDIkmAAEk2GgFJFSQSRBc2GgJJFSMSRCJTNhoDSRUkEkQXNhoESRWBIBJENhoFRwIVJBJEFzYaBkkVJBJENhoHSRUkEkQ2GghHAiJZSU4CgQILTEkVTFcCACJJSwUMQQAmRwKBAgtLA0lPAllJSwdJTgQSREsBFVIiWYECCAhFBSMIRQFC/9NLA4ECCEsDEkRLDUknC2VITEkrZUhMSYAIcmVmZXJyZXJlSExyCERPA1BPAlBMUElXICBFE1dAIElFEiIoZUQpZUiBIFtJRRKB1NgDRRGxshhJsgCABGA9cpeyGrIaJbIQIrIBs7Q+SVcEAExXAAQqEkRJFSMSRCJTQQAGgajsBEUPSwtBABciKGVEcghESwxwAEUBQAAHSw4yEAhFD0sEQQF9IihlRCllSIEoW7FLELIYSxGyAIAE1LFuerIaSwuyGksHsholshAisgGztD5JVwQASwFXAAQqEkRJFUsBgUlZSYF1EkRLAkxLAlIiWYF3CEsCgUtZSUsCEkRPA0xLA1IiWYECCAgSRFclCExLDUEAk7FLEUlyCERLErIIsgdLE0lOArIAI7IQIrIBtklyCERLDbISSxCyEbIUSwGyAIEEshAisgG2JwayGksVshpPA7IaSwiyGk8CshhLAbIAJbIQIrIBtksOSxCI+NyyILIYsgCABKaOaWOyGksKshpLCbIaSweyGksGsholshAisgGztD5JVwQATFcABCoSRBUkEkQjQ7FLEUlyCERLDEsTCLIIsgdLE0myACOyECKyAbYnBrIaSxWyGk8DshpLCLIaTwKyGEmyACWyECKyAbZLDksQiPhjsiCyALIYgARTVdptshpLCrIaSwmyGksHshpLBrIaJbIQIrIBs7Q+SVcEAExXAAQqEkQVJBJEQv+ESwtBAHWxSw9JcghESxCyCLIHSxFJTgKyACOyECKyAbZJcghESwuyEksOshGyFEsBsgCBBLIQIrIBtksOSxCI9+myILIYsgCABLEKMG6yGksKshpLCbIaSweyGksGsholshAisgGztD5JVwQATFcABCoSRBUkEkRC/wqxSw9JcghESwpLEQiyCLIHSxFJsgAjshAisgG2Sw5LEIj3jbIgsgCyGIAEEPAMOrIaSwqyGksJshpLB7IaSwayGiWyECKyAbO0PklXBABMVwAEKhJEFSQSREL+riJJgABHAzYaAUkVJBJEFzYaAkkVIxJEIlM2GgNJFYEgEkQ2GgRJFSQSRBc2GgVHAiJZSU4CgQILTEkVTFcCACJJSwUMQQAmRwKBAgtLA0lPAllJSwdJTgQSREsBFVIiWYECCAhFBSMIRQFC/9NLA4ECCEsDEkRLCStlSEUPIihlRCllSIEgW0UOSwRBAO8iKGVESSllSIEoW0UOgANvYWxlSIEYW7GyGIAEPBpvM7IaSweyGiWyECKyAbO0PklXBABLAVcABCoSREkiWYECCEwVEkRXBgBJRREVSUUMQQAHSwokE0EAjiJFDEsLQAB9SwexSwcWSwlMUEsPSU4CshhLEUlOArIAJwyyGkmyGiWyECKyAbO0PklXBABLAVcABCoSRBWBaRJEsVdNCCcGshpPBLIashpLCLIaSw+yGEsBsgAlshAisgG2SwtLDYj2BLIgTwKyGEyyAIAEKBuJG7IasholshAisgGzI0NLCycLZUhC/3xLDxdFDEL/bbFLBhZLCExQSwlLC4j1yLIgSw6yGEsPsgCABMPZ8dyyGrIaJbIQIrIBs0L/wCJJgABHBDYaAUkVJBJEFzYaAkkVIxJEIlM2GgNHAhUkEkQXNhoESSJZSU4CgQILTEkVTFcCACJJSwUMQQAmRwKBAgtLA0lPAllJSwdJTgQSREsBFVIiWYECCAhFBSMIRQFC/9NLA4ECCEsDEkRLCCtlSElFECIoZUQpZUiBIFtJRRBLBxZLAkxQsUyyGEyyACcMshqyGiWyECKyAbO0PklFEUlXBABMVwAEKhJESRWBaRJEIlNAAAyACEVSUjpVRE5FsAAyB0lLEUlOAoEtWwlLAYE9WxhPAkwJTIFVWw1AAAQnDbAAIkUNSw9JgTVbSU4CRQ6BZVtJRQ0NQQAHSwtLCwlFDUsMQAAEJw2wAEsMQQBESw+BRVtJRQtAADuxSw1JcghESw6yCLIHSw9JsgAjshAisgG2SwlLC4j0bLIgsgCyGIAE8jVbVbIaSwayGiWyECKyAbMjQ7FLDUlyCERLDrISSwuyEbIUSw9JsgCBBLIQIrIBtksJSwuI9CyyILIAshiABBrEp1iyGksGsholshAisgGzQv+9NhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVgSgSREsCK2VITCIoZUQpZUiBIFuxTwNPBIjz3LIgshhMsgCABMD/JzCyGrIaJbIQIrIBsyNDNhoBSRUkEkQXNhoCSRUjEkQiUzYaA0kVJBJENhoESSJZgSALgQIISwEVEkRLAytlSEwiKGVEKWVIgSBbsU8ETwWI836yILIYTLIAgAQnUgOvshpMshqyGiWyECKyAbMjQzYaAUkVJBJEFzEAIihlRIAGd2FsbGV0ZUhyCEQSQAAMgAhFUlI6TkRBT7AAKEsBZyND", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
22385
22385
  var BinaryStateValue4 = class {
22386
22386
  constructor(value) {
22387
22387
  this.value = value;
@@ -22568,6 +22568,19 @@ var SubscriptionsPluginParamsFactory = class _SubscriptionsPluginParamsFactory {
22568
22568
  args: Array.isArray(params.args) ? params.args : [params.args.wallet, params.args.rekeyBack, params.args.address, params.args.id, params.args.args]
22569
22569
  };
22570
22570
  }
22571
+ /**
22572
+ * Constructs a no op call for the fundTriggerPayment(uint64,bool,uint64,byte[][])void ABI method
22573
+ *
22574
+ * @param params Parameters for the call
22575
+ * @returns An `AppClientMethodCallParams` object for the call
22576
+ */
22577
+ static fundTriggerPayment(params) {
22578
+ return {
22579
+ ...params,
22580
+ method: "fundTriggerPayment(uint64,bool,uint64,byte[][])void",
22581
+ args: Array.isArray(params.args) ? params.args : [params.args.wallet, params.args.rekeyBack, params.args.id, params.args.args]
22582
+ };
22583
+ }
22571
22584
  /**
22572
22585
  * Constructs a no op call for the streakCheck(uint64,bool,(address,uint64))void ABI method
22573
22586
  *
@@ -22912,6 +22925,15 @@ var SubscriptionsPluginClient = class _SubscriptionsPluginClient {
22912
22925
  triggerPayment: (params) => {
22913
22926
  return this.appClient.params.call(SubscriptionsPluginParamsFactory.triggerPayment(params));
22914
22927
  },
22928
+ /**
22929
+ * Makes a call to the SubscriptionsPlugin smart contract using the `fundTriggerPayment(uint64,bool,uint64,byte[][])void` ABI method.
22930
+ *
22931
+ * @param params The params for the smart contract call
22932
+ * @returns The call params
22933
+ */
22934
+ fundTriggerPayment: (params) => {
22935
+ return this.appClient.params.call(SubscriptionsPluginParamsFactory.fundTriggerPayment(params));
22936
+ },
22915
22937
  /**
22916
22938
  * Makes a call to the SubscriptionsPlugin smart contract using the `streakCheck(uint64,bool,(address,uint64))void` ABI method.
22917
22939
  *
@@ -23067,6 +23089,15 @@ var SubscriptionsPluginClient = class _SubscriptionsPluginClient {
23067
23089
  triggerPayment: (params) => {
23068
23090
  return this.appClient.createTransaction.call(SubscriptionsPluginParamsFactory.triggerPayment(params));
23069
23091
  },
23092
+ /**
23093
+ * Makes a call to the SubscriptionsPlugin smart contract using the `fundTriggerPayment(uint64,bool,uint64,byte[][])void` ABI method.
23094
+ *
23095
+ * @param params The params for the smart contract call
23096
+ * @returns The call transaction
23097
+ */
23098
+ fundTriggerPayment: (params) => {
23099
+ return this.appClient.createTransaction.call(SubscriptionsPluginParamsFactory.fundTriggerPayment(params));
23100
+ },
23070
23101
  /**
23071
23102
  * Makes a call to the SubscriptionsPlugin smart contract using the `streakCheck(uint64,bool,(address,uint64))void` ABI method.
23072
23103
  *
@@ -23232,6 +23263,16 @@ var SubscriptionsPluginClient = class _SubscriptionsPluginClient {
23232
23263
  const result = await this.appClient.send.call(SubscriptionsPluginParamsFactory.triggerPayment(params));
23233
23264
  return { ...result, return: result.return };
23234
23265
  },
23266
+ /**
23267
+ * Makes a call to the SubscriptionsPlugin smart contract using the `fundTriggerPayment(uint64,bool,uint64,byte[][])void` ABI method.
23268
+ *
23269
+ * @param params The params for the smart contract call
23270
+ * @returns The call result
23271
+ */
23272
+ fundTriggerPayment: async (params) => {
23273
+ const result = await this.appClient.send.call(SubscriptionsPluginParamsFactory.fundTriggerPayment(params));
23274
+ return { ...result, return: result.return };
23275
+ },
23235
23276
  /**
23236
23277
  * Makes a call to the SubscriptionsPlugin smart contract using the `streakCheck(uint64,bool,(address,uint64))void` ABI method.
23237
23278
  *
@@ -23409,6 +23450,13 @@ var SubscriptionsPluginClient = class _SubscriptionsPluginClient {
23409
23450
  promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.triggerPayment(params)));
23410
23451
  return this;
23411
23452
  },
23453
+ /**
23454
+ * Add a fundTriggerPayment(uint64,bool,uint64,byte[][])void method call against the SubscriptionsPlugin contract
23455
+ */
23456
+ fundTriggerPayment(params) {
23457
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.fundTriggerPayment(params)));
23458
+ return this;
23459
+ },
23412
23460
  /**
23413
23461
  * Add a streakCheck(uint64,bool,(address,uint64))void method call against the SubscriptionsPlugin contract
23414
23462
  */
@@ -23773,6 +23821,33 @@ var SubscriptionsPluginSDK = class extends BaseSDK {
23773
23821
  }
23774
23822
  });
23775
23823
  }
23824
+ fundTriggerPayment(args) {
23825
+ const methodName = "fundTriggerPayment";
23826
+ if (args === void 0) {
23827
+ return (spendingAddress) => ({
23828
+ appId: this.client.appId,
23829
+ selectors: [this.client.appClient.getABIMethod(methodName).getSelector()],
23830
+ getTxns
23831
+ });
23832
+ }
23833
+ const { sender, signer, args: gateArgs = [], ...rest } = args;
23834
+ const sendParams = this.getRequiredSendParams({ sender, signer });
23835
+ return (spendingAddress) => ({
23836
+ appId: this.client.appId,
23837
+ selectors: [this.client.appClient.getABIMethod(methodName).getSelector()],
23838
+ getTxns: async ({ wallet }) => {
23839
+ const rekeyBack = args.rekeyBack ?? true;
23840
+ const params = await this.client.params.fundTriggerPayment({
23841
+ ...sendParams,
23842
+ args: { wallet, rekeyBack, args: gateArgs, ...rest }
23843
+ });
23844
+ return [{
23845
+ type: "methodCall",
23846
+ ...params
23847
+ }];
23848
+ }
23849
+ });
23850
+ }
23776
23851
  streakCheck(args) {
23777
23852
  const methodName = "streakCheck";
23778
23853
  if (args === void 0) {
@@ -25288,4 +25363,4 @@ export {
25288
25363
  SunsetPluginSDK,
25289
25364
  WalletSDK
25290
25365
  };
25291
- //# sourceMappingURL=chunk-BLFSBOWL.mjs.map
25366
+ //# sourceMappingURL=chunk-2BI2TAAG.mjs.map