@akta/sdk 1.3.28 → 1.3.29
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.
- package/dist/auction/index.js +5 -5
- package/dist/auction/index.mjs +4 -4
- package/dist/{chunk-66KUGVM2.js → chunk-3NFZNENS.js} +7 -7
- package/dist/{chunk-66KUGVM2.js.map → chunk-3NFZNENS.js.map} +1 -1
- package/dist/{chunk-XBHYP7OI.mjs → chunk-4YTVZHM6.mjs} +3 -3
- package/dist/{chunk-P5LQGRER.mjs → chunk-6LO2WGTX.mjs} +4 -4
- package/dist/{chunk-SORM3KIM.js → chunk-AVBS6WKY.js} +8 -8
- package/dist/{chunk-SORM3KIM.js.map → chunk-AVBS6WKY.js.map} +1 -1
- package/dist/{chunk-KWFYX34V.mjs → chunk-CRSQ7GNL.mjs} +3 -3
- package/dist/{chunk-XLWSHPHP.mjs → chunk-G6VI6JHT.mjs} +2 -2
- package/dist/chunk-G6VI6JHT.mjs.map +1 -0
- package/dist/{chunk-6PX6VBWC.js → chunk-HXP75KAN.js} +5 -5
- package/dist/{chunk-6PX6VBWC.js.map → chunk-HXP75KAN.js.map} +1 -1
- package/dist/{chunk-SMRXCWIF.mjs → chunk-KBRJHOR5.mjs} +4 -4
- package/dist/{chunk-NGNKMISH.mjs → chunk-KPQNEYL5.mjs} +3 -3
- package/dist/{chunk-K76URIPO.js → chunk-KZ2TQDOZ.js} +7 -7
- package/dist/{chunk-K76URIPO.js.map → chunk-KZ2TQDOZ.js.map} +1 -1
- package/dist/{chunk-VETJSH6X.mjs → chunk-KZZ2UAX7.mjs} +3 -3
- package/dist/{chunk-IBLUT2VP.mjs → chunk-LGGKGVY7.mjs} +3 -3
- package/dist/{chunk-QPDFKBXY.mjs → chunk-MKN4KMLD.mjs} +2 -2
- package/dist/{chunk-UM4MTXLA.js → chunk-MLNNKTWE.js} +10 -10
- package/dist/{chunk-UM4MTXLA.js.map → chunk-MLNNKTWE.js.map} +1 -1
- package/dist/{chunk-MPUDRNXT.mjs → chunk-NPGKFC7P.mjs} +3 -3
- package/dist/{chunk-H7PRBD4T.js → chunk-OQUISEFZ.js} +6 -6
- package/dist/{chunk-H7PRBD4T.js.map → chunk-OQUISEFZ.js.map} +1 -1
- package/dist/{chunk-FOEWI4FX.js → chunk-QGU445DK.js} +8 -8
- package/dist/{chunk-FOEWI4FX.js.map → chunk-QGU445DK.js.map} +1 -1
- package/dist/{chunk-2EQ6E26U.mjs → chunk-S3GSKFUP.mjs} +2 -2
- package/dist/{chunk-P4WVBDYP.mjs → chunk-S5ITPGIR.mjs} +3 -3
- package/dist/{chunk-I7X7VIHL.mjs → chunk-SHNDHZCO.mjs} +2 -2
- package/dist/{chunk-GU64KMQ4.js → chunk-TG4RA7KL.js} +16 -16
- package/dist/{chunk-GU64KMQ4.js.map → chunk-TG4RA7KL.js.map} +1 -1
- package/dist/{chunk-VZRJXSFD.mjs → chunk-THTF5AQK.mjs} +3 -3
- package/dist/{chunk-VTBACBI7.mjs → chunk-UADWIIKO.mjs} +3 -3
- package/dist/{chunk-NIQFSVYD.js → chunk-UE67D2C5.js} +6 -6
- package/dist/{chunk-NIQFSVYD.js.map → chunk-UE67D2C5.js.map} +1 -1
- package/dist/{chunk-LVGQRYZG.js → chunk-UVTZZDHG.js} +34 -34
- package/dist/{chunk-LVGQRYZG.js.map → chunk-UVTZZDHG.js.map} +1 -1
- package/dist/{chunk-PMZSGGZE.js → chunk-VSKDYRSZ.js} +8 -8
- package/dist/{chunk-PMZSGGZE.js.map → chunk-VSKDYRSZ.js.map} +1 -1
- package/dist/{chunk-X4IBYF5K.js → chunk-WBUMBKXI.js} +5 -5
- package/dist/{chunk-X4IBYF5K.js.map → chunk-WBUMBKXI.js.map} +1 -1
- package/dist/{chunk-NVSKAUVL.js → chunk-WD6JLW4B.js} +4 -4
- package/dist/{chunk-NVSKAUVL.js.map → chunk-WD6JLW4B.js.map} +1 -1
- package/dist/{chunk-OHIWM57P.js → chunk-WQU24RDU.js} +2 -2
- package/dist/chunk-WQU24RDU.js.map +1 -0
- package/dist/{chunk-PCZCAW3V.mjs → chunk-WS5RFE5Y.mjs} +4 -4
- package/dist/{chunk-7RJQCI22.js → chunk-WUCZDEYC.js} +5 -5
- package/dist/{chunk-7RJQCI22.js.map → chunk-WUCZDEYC.js.map} +1 -1
- package/dist/{chunk-WTDHZGUM.mjs → chunk-X4XWDYQY.mjs} +3 -3
- package/dist/{chunk-JK6EPTAE.js → chunk-XF235442.js} +5 -5
- package/dist/{chunk-JK6EPTAE.js.map → chunk-XF235442.js.map} +1 -1
- package/dist/{chunk-5NNJKPBJ.mjs → chunk-XKQAEUOE.mjs} +4 -4
- package/dist/{chunk-NGWL4WVJ.js → chunk-YPCFZFOM.js} +6 -6
- package/dist/{chunk-NGWL4WVJ.js.map → chunk-YPCFZFOM.js.map} +1 -1
- package/dist/{chunk-HJNW7ZMF.js → chunk-YY3XYISZ.js} +5 -5
- package/dist/{chunk-HJNW7ZMF.js.map → chunk-YY3XYISZ.js.map} +1 -1
- package/dist/dao/index.js +5 -5
- package/dist/dao/index.mjs +4 -4
- package/dist/escrow/index.js +4 -4
- package/dist/escrow/index.mjs +3 -3
- package/dist/gates/index.js +4 -4
- package/dist/gates/index.mjs +3 -3
- package/dist/hyper-swap/index.js +4 -4
- package/dist/hyper-swap/index.mjs +3 -3
- package/dist/index.js +19 -19
- package/dist/index.mjs +18 -18
- package/dist/marketplace/index.js +5 -5
- package/dist/marketplace/index.mjs +4 -4
- package/dist/meta-merkles/index.js +4 -4
- package/dist/meta-merkles/index.mjs +3 -3
- package/dist/networks.d.ts +1 -1
- package/dist/poll/index.js +4 -4
- package/dist/poll/index.mjs +3 -3
- package/dist/prize-box/index.js +4 -4
- package/dist/prize-box/index.mjs +3 -3
- package/dist/raffle/index.js +5 -5
- package/dist/raffle/index.mjs +4 -4
- package/dist/rewards/index.js +4 -4
- package/dist/rewards/index.mjs +3 -3
- package/dist/social/index.js +3 -3
- package/dist/social/index.mjs +2 -2
- package/dist/staking/index.js +4 -4
- package/dist/staking/index.mjs +3 -3
- package/dist/staking-pool/index.js +4 -4
- package/dist/staking-pool/index.mjs +3 -3
- package/dist/subscriptions/index.js +4 -4
- package/dist/subscriptions/index.mjs +3 -3
- package/dist/wallet/index.js +4 -4
- package/dist/wallet/index.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-OHIWM57P.js.map +0 -1
- package/dist/chunk-XLWSHPHP.mjs.map +0 -1
- /package/dist/{chunk-XBHYP7OI.mjs.map → chunk-4YTVZHM6.mjs.map} +0 -0
- /package/dist/{chunk-P5LQGRER.mjs.map → chunk-6LO2WGTX.mjs.map} +0 -0
- /package/dist/{chunk-KWFYX34V.mjs.map → chunk-CRSQ7GNL.mjs.map} +0 -0
- /package/dist/{chunk-SMRXCWIF.mjs.map → chunk-KBRJHOR5.mjs.map} +0 -0
- /package/dist/{chunk-NGNKMISH.mjs.map → chunk-KPQNEYL5.mjs.map} +0 -0
- /package/dist/{chunk-VETJSH6X.mjs.map → chunk-KZZ2UAX7.mjs.map} +0 -0
- /package/dist/{chunk-IBLUT2VP.mjs.map → chunk-LGGKGVY7.mjs.map} +0 -0
- /package/dist/{chunk-QPDFKBXY.mjs.map → chunk-MKN4KMLD.mjs.map} +0 -0
- /package/dist/{chunk-MPUDRNXT.mjs.map → chunk-NPGKFC7P.mjs.map} +0 -0
- /package/dist/{chunk-2EQ6E26U.mjs.map → chunk-S3GSKFUP.mjs.map} +0 -0
- /package/dist/{chunk-P4WVBDYP.mjs.map → chunk-S5ITPGIR.mjs.map} +0 -0
- /package/dist/{chunk-I7X7VIHL.mjs.map → chunk-SHNDHZCO.mjs.map} +0 -0
- /package/dist/{chunk-VZRJXSFD.mjs.map → chunk-THTF5AQK.mjs.map} +0 -0
- /package/dist/{chunk-VTBACBI7.mjs.map → chunk-UADWIIKO.mjs.map} +0 -0
- /package/dist/{chunk-PCZCAW3V.mjs.map → chunk-WS5RFE5Y.mjs.map} +0 -0
- /package/dist/{chunk-WTDHZGUM.mjs.map → chunk-X4XWDYQY.mjs.map} +0 -0
- /package/dist/{chunk-5NNJKPBJ.mjs.map → chunk-XKQAEUOE.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-PMZSGGZE.js","../src/marketplace/index.ts","../src/generated/MarketplaceClient.ts","../src/generated/ListingClient.ts","../src/marketplace/listing.ts","../src/marketplace/errors.ts"],"names":["APP_SPEC","_AppFactory","_AppClient"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-PMZSGGZE.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport algosdk from \"algosdk\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MarketplaceClient,\n MarketplaceFactory,\n MarketplaceArgs,\n} from '../generated/MarketplaceClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport { ListingSDK } from \"./listing\";\nimport {\n ListParams,\n PurchaseParams,\n DelistParams,\n OptInParams,\n} from \"./types\";\nimport { PrizeBoxFactorySDK } from \"../prize-box\";\n\nexport * from \"./errors\";\nexport * from \"./listing\";\nexport * from \"./types\";\n\nexport type MarketplaceContractArgs = MarketplaceArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Marketplace contract.\n * Use this to create listings, purchase items, and delist items.\n */\nexport class MarketplaceSDK extends BaseSDK<MarketplaceClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MarketplaceFactory, ...params }, ENV_VAR_NAMES.MARKETPLACE_APP_ID);\n }\n\n // ========== Factory/Listing Methods ==========\n\n /**\n * Creates a new listing and returns a ListingSDK instance.\n * Can list either an ASA or a PrizeBox based on the `isPrizeBox` flag.\n * @returns ListingSDK for the newly created listing\n */\n async list({\n sender,\n signer,\n isPrizeBox = false,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n ...rest\n }: ListParams): Promise<ListingSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the cost for creating a new listing, dynamically querying rewards opt-in state\n const isAlgoPayment = BigInt(paymentAsset) === 0n;\n const prizeId = isPrizeBox ? 0n : BigInt((rest as { asset: bigint | number }).asset);\n const [prizeRewardsOptInCost, paymentRewardsOptInCost] = await Promise.all([\n this.getRewardsOptInCost(prizeId),\n this.getRewardsOptInCost(BigInt(paymentAsset)),\n ]);\n const cost = this.listCost({ isPrizeBox, isAlgoPayment, prizeRewardsOptInCost, paymentRewardsOptInCost });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n let appId: bigint | undefined;\n\n if (isPrizeBox) {\n const { prizeBoxId } = rest as Extract<ListParams, { isPrizeBox: true }>;\n\n const prizeBoxSDK = new PrizeBoxFactorySDK({ algorand: this.algorand, factoryParams: {}}).get({ appId: BigInt(prizeBoxId) })\n const prizeBoxTransferTxn = (await prizeBoxSDK.client.createTransaction.transfer({\n sender,\n signer,\n args: {\n newOwner: this.client.appAddress.toString()\n }\n })).transactions[0];\n\n ({ return: appId } = await this.client.send.listPrizeBox({\n ...sendParams,\n args: {\n prizeBoxTransferTxn,\n payment,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n },\n }));\n } else {\n const { asset, amount, name, proof } = rest as Exclude<ListParams, { isPrizeBox: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n ({ return: appId } = await this.client.send.list({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n name,\n proof,\n },\n }));\n }\n\n if (appId === undefined) {\n throw new Error('Failed to create new listing');\n }\n\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer,\n },\n });\n }\n\n /**\n * Gets a ListingSDK instance for an existing listing.\n * @param appId - The app ID of the listing\n * @returns ListingSDK for the specified listing\n */\n getListing({ appId }: { appId: bigint }): ListingSDK {\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer,\n },\n });\n }\n\n /**\n * Checks if the rewards app is already opted into the given asset.\n * Returns 0n if opted in (no cost needed), 100_000n if not.\n */\n private async getRewardsOptInCost(assetId: bigint | number): Promise<bigint> {\n const asset = BigInt(assetId);\n if (asset === 0n) return 0n;\n\n try {\n const akitaDaoAppId = await this.client.state.global.akitaDao();\n if (!akitaDaoAppId) return 100_000n;\n\n const algod = this.algorand.client.algod;\n const daoApp = await algod.applicationById(akitaDaoAppId);\n const globalState = daoApp.params.globalState;\n if (!globalState) return 100_000n;\n\n // Find the 'aal' (akitaAppList) key in AkitaDAO global state\n const aalKey = new TextEncoder().encode('aal');\n const aalEntry = globalState.find(\n (kv: { key: Uint8Array; value: { type: number; bytes: Uint8Array } }) =>\n kv.key.length === aalKey.length && kv.key.every((b: number, i: number) => b === aalKey[i])\n );\n if (!aalEntry || aalEntry.value.type !== 1) return 100_000n;\n\n // Extract rewards app ID (2nd uint64 in ABI-encoded AkitaAppList, bytes 8-15)\n const aalBytes = aalEntry.value.bytes;\n if (aalBytes.length < 16) return 100_000n;\n const view = new DataView(aalBytes.buffer, aalBytes.byteOffset, aalBytes.byteLength);\n const rewardsAppId = view.getBigUint64(8);\n if (rewardsAppId === 0n) return 100_000n;\n\n // Check if rewards app address is already opted into the asset\n const rewardsAddress = algosdk.getApplicationAddress(rewardsAppId).toString();\n const response = await algod.accountAssetInformation(rewardsAddress, asset);\n return response.assetHolding ? 0n : 100_000n;\n } catch {\n // If any lookup fails (e.g. 404 not opted in), assume cost is needed\n return 100_000n;\n }\n }\n\n /**\n * Gets the cost to create a new listing.\n * @param isPrizeBox - Whether the prize is a PrizeBox\n * @param isAlgoPayment - Whether the listing will accept ALGO as payment\n * @param prizeRewardsOptInCost - Rewards app opt-in cost for the prize asset (default: 100,000, pass 0 if already opted in)\n * @param paymentRewardsOptInCost - Rewards app opt-in cost for the payment asset (default: 100,000, pass 0 if already opted in)\n */\n listCost({ isPrizeBox = false, isAlgoPayment = true, prizeRewardsOptInCost = 100_000n, paymentRewardsOptInCost = 100_000n, escrowOptInCost = 0n }: { isPrizeBox?: boolean, isAlgoPayment?: boolean, prizeRewardsOptInCost?: bigint, paymentRewardsOptInCost?: bigint, escrowOptInCost?: bigint } = {}): bigint {\n // Base cost: MIN_PROGRAM_PAGES * (1 + extraProgramPages) + (GLOBAL_STATE_KEY_UINT_COST * globalUints) + (GLOBAL_STATE_KEY_BYTES_COST * globalBytes)\n // Listing arc56 schema: 9 global uints, 6 global bytes, extraProgramPages = 1 (2 total pages)\n // Listing globals: prize, isPrizeBox, price, paymentAsset, expiration, creatorRoyalty, gateID, marketplaceRoyalties (8 uints)\n // + seller, reservedFor, marketplace, akitaDAOEscrow (4 bytes)\n // + AkitaBaseContract: akitaDAO (1 uint), version (1 bytes)\n // + ChildContract: funder (1 bytes)\n // => 9 uints, 6 bytes\n // = (100_000 * 2) + (28_500 * 9) + (50_000 * 6) = 200_000 + 256_500 + 300_000 = 756_500\n const baseCost = 756_500n;\n const minBalance = 100_000n;\n const assetOptInMinBalance = 100_000n;\n const perDisbursement = 67_000n; // MinDisbursementsMBR + UserAllocationMBR\n\n // Asset opt-in MBR for the child contract\n const optinMbr = isPrizeBox\n ? (isAlgoPayment ? 0n : assetOptInMinBalance)\n : (isAlgoPayment ? assetOptInMinBalance : assetOptInMinBalance * 2n);\n\n // Disbursement MBR\n let disbursementMbr = 0n;\n if (!isPrizeBox) {\n // 1 prize + 1 referral + (4 ASA payments if ASA)\n disbursementMbr += perDisbursement + prizeRewardsOptInCost; // prize\n if (isAlgoPayment) {\n disbursementMbr += perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr += perDisbursement * 5n + paymentRewardsOptInCost; // referral + 4 ASA payments\n }\n } else {\n // 1 referral + (3 ASA payments if ASA)\n if (isAlgoPayment) {\n disbursementMbr = perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr = perDisbursement * 4n + paymentRewardsOptInCost; // referral + 3 ASA payments\n }\n }\n\n // Escrow opt-in cost for ASA payments (factory opts escrow into payment asset)\n const escrowCost = isAlgoPayment ? 0n : escrowOptInCost;\n\n return baseCost + minBalance + optinMbr + disbursementMbr + escrowCost;\n }\n\n // ========== Purchase Methods ==========\n\n /**\n * Purchases a listing.\n * Use `isAsa: true` with `paymentAsset` and `paymentAmount` for ASA payments, otherwise ALGO is used.\n * Provide `gateTxn` for gated listings.\n */\n async purchase({\n sender,\n signer,\n listingAppId,\n marketplace,\n isAsa = false,\n gateTxn,\n ...rest\n }: PurchaseParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Use opUps to handle app reference limits (royalty distribution, DAO access, etc.)\n const group = this.client.newGroup();\n\n if (isAsa) {\n const { paymentAsset, paymentAmount } = rest as Extract<PurchaseParams, { isAsa: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(paymentAmount),\n assetId: BigInt(paymentAsset),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n } else {\n // Get listing to determine price for ALGO purchases\n const listing = this.getListing({ appId: BigInt(listingAppId) });\n const listingState = await listing.state();\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(listingState.price),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchase({\n ...sendParams,\n args: {\n payment,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchase({\n ...sendParams,\n args: {\n payment,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n }\n\n // Add opUps to increase app reference limit\n // purchase + payment (and possibly assetXfer) = 2-3 transactions, so we can add up to 13-14 opUps\n for (let i = 0; i < 10; i++) {\n group.opUp({ ...sendParams, args: {}, note: i > 0 ? `opUp-${i}` : undefined });\n }\n\n await group.send(sendParams);\n }\n\n // ========== OptIn Methods ==========\n\n /**\n * Opts the marketplace into an asset so listings using it as the payment\n * asset can be fulfilled. When the marketplace has a named DAO escrow\n * configured, this also eagerly opts the escrow + every revenue-split\n * escrow in via the revenue-manager plugin, so downstream list/purchase\n * calls don't have to do the rekey dance mid-group.\n *\n * Worst case touches ~10 foreign refs (DAO, wallet, plugin, main escrow,\n * N split escrows, the asset). Since a single app call only holds 8\n * foreign-ref slots, we wrap the optIn in a 2-app-call group (optIn +\n * one opUp) so the resource populator has 16 slots to distribute refs\n * across.\n */\n async optIn({ sender, signer, asset }: OptInParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.client.optInCost({ args: { asset } });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.newGroup()\n .optIn({\n ...sendParams,\n args: { payment, asset },\n maxFee: microAlgo(257_000),\n })\n .opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgo(2_000),\n })\n .send({\n ...sendParams,\n coverAppCallInnerTransactionFees: true,\n populateAppCallResources: true,\n });\n }\n\n // ========== Delist Methods ==========\n\n /**\n * Removes a listing and returns the asset to the seller.\n * Can only be called by the seller.\n */\n async delist({ sender, signer, appId }: DelistParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.delist({\n ...sendParams,\n args: { appId },\n });\n }\n\n // ========== Admin Methods ==========\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n\n /**\n * Updates the Akita DAO Escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, config }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAOEscrow((string,uint64))void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { config },\n });\n }\n}\n\n/**\n * Convenience function to create a new listing and return the SDK.\n * Creates a marketplace SDK, creates the listing, and returns the listing SDK.\n */\nexport async function newListing({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...listParams\n}: NewContractSDKParams & ListParams): Promise<ListingSDK> {\n const marketplace = new MarketplaceSDK({ factoryParams, algorand, readerAccount, sendParams });\n return await marketplace.list(listParams);\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Marketplace\",\"structs\":{\"EscrowConfig\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"app\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"list\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"byte[32][]\",\"name\":\"proof\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"listPrizeBox\",\"args\":[{\"type\":\"appl\",\"name\":\"prizeBoxTransferTxn\"},{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction covering MBR for all opt-ins\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to opt into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optIn opts this contract into `asset`. When this contract has a\\nnamed escrow configured (`akitaDAOEscrow.value.name !== ''`), it\\nalso opts the escrow and every revenue-split recipient in through\\nthe revenue-manager plugin — so downstream methods (subscribe,\\nlist, etc.) can transfer to the escrow without doing the plugin-\\nrekey dance mid-group.\\n\\nPayment must cover:\\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\\n - each downstream opt-in the escrow still needs.\\n`splitOptInCount` returns 0 once the escrow is already opted in, so\\nthe charge collapses to just 1 × assetOptInMinBalance on repeat\\ncalls and the escrow branch becomes a no-op.\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"config\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"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\":8,\"bytes\":56},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"EscrowConfig\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the named DAO escrow this contract routes fees to (name + app)\"},\"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\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1052,1799],\"errorMessage\":\"Box must have value\"},{\"pc\":[471,1435,3613],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[1677],\"errorMessage\":\"ERR:BMPT\"},{\"pc\":[905,1643,3103],\"errorMessage\":\"ERR:CNST\"},{\"pc\":[2207,2543],\"errorMessage\":\"ERR:FGTE\"},{\"pc\":[2355,2713],\"errorMessage\":\"ERR:HGTE\"},{\"pc\":[3092],\"errorMessage\":\"ERR:ICOR\"},{\"pc\":[978,991,1004,1017,1030,1783,1796,2220,2368],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[3238],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[3211],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[3453],\"errorMessage\":\"ERR:IUPG\"},{\"pc\":[2557,2571,2727,2741],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[2180,2342,2516,2700,2846],\"errorMessage\":\"ERR:NALS\"},{\"pc\":[2952,2980,3136,3381,3424,3491],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[3646],\"errorMessage\":\"ERR:NESC\"},{\"pc\":[1733],\"errorMessage\":\"ERR:NPBO\"},{\"pc\":[894,1632],\"errorMessage\":\"ERR:PRLO\"},{\"pc\":[3671],\"errorMessage\":\"ERR:WESC\"},{\"pc\":[1706],\"errorMessage\":\"NAPB\"},{\"pc\":[606,1196,1217,1254,1283,1325,1489,1692,1704,1942,1962,1990,2032,2073,2170,2241,2332,2389,2506,2592,2690,2762,2836,2972,3128,3185,3312,3373,3416,3483,3735,3751,3829],\"errorMessage\":\"application exists\"},{\"pc\":[1358],\"errorMessage\":\"asset exists\"},{\"pc\":[918,1037,1082,1094,1099,1320,1480,1484,1502,1681,1828,1840,1845,2027,2064,2068,2086,2158,2190,2494,2526,2965,3121,3175,3179,3303,3307,3366,3409,3428,3476,3507,3538,3727],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[474,657,671,687,729,857,872,1438,2908,3004,3355,3393,3616],\"errorMessage\":\"invalid array length header\"},{\"pc\":[678,694,863,2915,3011,3400],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[884],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<bytes[32]>\"},{\"pc\":[3625],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowInfo>\"},{\"pc\":[826,848,1600,1622,2154,2329,2490,2687],\"errorMessage\":\"invalid number of bytes for arc4.static_array<arc4.uint8, 32>\"},{\"pc\":[706,789,802,815,837,1563,1576,1589,1611,2141,2316,2477,2674,2831,2927,2996,3161,3298,3469],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[480],\"errorMessage\":\"invalid number of bytes for bytes\"},{\"pc\":[734,3360],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig\"},{\"pc\":[1444],\"errorMessage\":\"invalid number of bytes for string\"},{\"pc\":[721,3347],\"errorMessage\":\"invalid tail pointer at index 0 of ((len+utf8[]),uint64)\"},{\"pc\":[716,3342],\"errorMessage\":\"invalid tuple encoding\"},{\"pc\":[1543,2132,2468],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[779,2458,2665],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[768,1553,2122,2307,3152],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgMiA2NzAwMCA3NTY1MDAgNTAwMDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgImJjIiAiYWtpdGFfZXNjcm93IiAiRVJSOklQQVkiICJ3YWxsZXQiIDB4MTUxZjdjNzUgIkVSUjpOREFPIiAiRVJSOk5BTFMiICJmdW5kZXIiICJhYWwiICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIiAiZ2F0ZV9pZCIgIkVSUjpJWEZSIiAiRVJSOkNOU1QiIDB4M2VhMTE4MzIgMHhjNTNiMzJjYyAidmVyc2lvbiIgIkVSUjpQUkxPIiBiYXNlNjQoQzRFQlF3PT0pIDB4N2I1MGVhOGMgMHhhZGY5MmFlNCAiRVJSOkZHVEUiIDB4NmExNjM5M2QgIkVSUjpIR1RFIiAweDE3MWM5Zjg4ICJwYWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOC0yNAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgTWFya2V0cGxhY2UgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUAyCgptYWluX3N3aXRjaF9jYXNlX25leHRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4LTI0CiAgICAvLyBAY29udHJhY3QoewogICAgLy8gICBzdGF0ZVRvdGFsczogewogICAgLy8gICAgIGdsb2JhbEJ5dGVzOiBGYWN0b3J5R2xvYmFsU3RhdGVNYXhCeXRlcywKICAgIC8vICAgICBnbG9iYWxVaW50czogRmFjdG9yeUdsb2JhbFN0YXRlTWF4VWludHMKICAgIC8vICAgfQogICAgLy8gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIxCiAgICBwdXNoYnl0ZXNzIDB4ZTJmYTllMjEgMHg4MWRjNTE2YSAweDZlOTAzNWNjIDB4NWQ3YTYxNzcgMHhkYWE5NzUxNiAweDAyY2ZiMWNmIDB4Yzk3ZGJiMmUgLy8gbWV0aG9kICJsaXN0KHBheSxheGZlcix1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCxhZGRyZXNzLHN0cmluZyxieXRlWzMyXVtdKXVpbnQ2NCIsIG1ldGhvZCAibGlzdFByaXplQm94KGFwcGwscGF5LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnYXRlZFB1cmNoYXNlKHBheSxhcHBsLHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgInB1cmNoYXNlKHBheSx1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJnYXRlZFB1cmNoYXNlQXNhKGF4ZmVyLGFwcGwsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAicHVyY2hhc2VBc2EoYXhmZXIsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZGVsaXN0KHVpbnQ2NCl2b2lkIgogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHhhZTg0Y2JkOCAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KChzdHJpbmcsdWludDY0KSl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGxpc3QgbGlzdFByaXplQm94IGdhdGVkUHVyY2hhc2UgcHVyY2hhc2UgZ2F0ZWRQdXJjaGFzZUFzYSBwdXJjaGFzZUFzYSBkZWxpc3QgaW5pdEJveGVkQ29udHJhY3QgbG9hZEJveGVkQ29udHJhY3QgZGVsZXRlQm94ZWRDb250cmFjdCBvcHRJbiBvcHRJbkNvc3QgdXBkYXRlQWtpdGFEQU9Fc2Nyb3cgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE5CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQxCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgtMjQKICAgIC8vIEBjb250cmFjdCh7CiAgICAvLyAgIHN0YXRlVG90YWxzOiB7CiAgICAvLyAgICAgZ2xvYmFsQnl0ZXM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heEJ5dGVzLAogICAgLy8gICAgIGdsb2JhbFVpbnRzOiBGYWN0b3J5R2xvYmFsU3RhdGVNYXhVaW50cwogICAgLy8gICB9CiAgICAvLyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIE1hcmtldHBsYWNlIGV4dGVuZHMgRmFjdG9yeUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDgxMTUzNjI4IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxzdHJpbmcsdWludDY0LChzdHJpbmcsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB1cGRhdGUKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PclR4blNlbmRlcih3YWxsZXRJRDogdWludDY0KSAtPiBieXRlczoKb3JpZ2luT3JUeG5TZW5kZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0OQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIG9yaWdpbk9yVHhuU2VuZGVyKHdhbGxldElEOiBBcHBsaWNhdGlvbik6IEFjY291bnQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1MAogICAgLy8gcmV0dXJuIG9yaWdpbk9yKHdhbGxldElELCBUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNDMKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAoKb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTAKICAgIC8vIHJldHVybiBvcmlnaW5Pcih3YWxsZXRJRCwgVHhuLnNlbmRlcikKICAgIHN3YXAKICAgIHJldHN1YgoKb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NwogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICBwdXNoYnl0ZXMgImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICBiIG9yaWdpbk9yVHhuU2VuZGVyX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogdWludDY0LCBhZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24sIGFkZHJlc3M6IEFjY291bnQpOiBBcHBsaWNhdGlvbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBieXRlcwogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgOAogICAgIT0KICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDcKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdhdGVDaGVjayhnYXRlVHhuOiB1aW50NjQsIGFraXRhREFPOiB1aW50NjQsIGNhbGxlcjogYnl0ZXMsIGlkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2F0ZUNoZWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFraXRhREFPOiBBcHBsaWNhdGlvbiwgY2FsbGVyOiBBY2NvdW50LCBpZDogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM0CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNAogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYm56IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM1CiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM1CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM2CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNgogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM3CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18xIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM4CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMyAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM4CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgpnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMyLTIzOQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gICBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyAgIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJld2FyZHNPcHRJbkNvc3QoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0OgpyZXdhcmRzT3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZXdhcmRzT3B0SW5Db3N0KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTA5CiAgICAvLyBpZiAoYXNzZXQgIT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogcmV3YXJkc09wdEluQ29zdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTExCiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiByZXdhcmRzT3B0SW5Db3N0X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTIKICAgIC8vIHJldHVybiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgcmV0c3ViCgpyZXdhcmRzT3B0SW5Db3N0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE1CiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNwbGl0T3B0SW5Db3VudChha2l0YURBTzogdWludDY0LCBlc2Nyb3c6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB1aW50NjQ6CnNwbGl0T3B0SW5Db3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gc3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgZXNjcm93OiBBY2NvdW50LCBhc3NldDogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyMgogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjQKICAgIC8vIGlmICghZXNjcm93LmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHNwbGl0T3B0SW5Db3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTAzCiAgICAvLyBjb25zdCBbc3BsaXRzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUmV2ZW51ZVNwbGl0cykpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAicmV2ZW51ZV9zcGxpdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyOAogICAgLy8gY291bnQgKz0gc3BsaXRzLmxlbmd0aAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDAgb2YgKChsZW4rdXRmOFtdKSx1aW50NjQpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6RXNjcm93Q29uZmlnCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyAxMCAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gY2hpbGRWZXJzaW9uCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM0CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoYWtpdGFEQU9Fc2Nyb3cpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpsaXN0OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MC01MQogICAgLy8gbGlzdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsIC8vIDAgfCBBc3NldAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlc1szMl0+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1MwogICAgLy8gbG9nZ2VkQXNzZXJ0KHByaWNlID49IDQsIEVSUl9QUklDRV9UT09fTE9XKQogICAgcHVzaGludCA0CiAgICA+PQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE3IC8vICJFUlI6UFJMTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQUkxPCgpsaXN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cywgRVJSX0NPTlRSQUNUX05PVF9TRVQpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAxMyAvLyAiRVJSOkNOU1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Q05TVAoKbGlzdF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU3LTU5CiAgICAvLyBjb25zdCBvcHRpbk1CUjogdWludDY0ID0gaXNBbGdvUGF5bWVudAogICAgLy8gICA/IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIDIKICAgIGRpZyA3CiAgICBibnogbGlzdF90ZXJuYXJ5X2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU4CiAgICAvLyA/IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBidXJ5IDE1CgpsaXN0X3Rlcm5hcnlfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY4CiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjgKICAgIC8vIGxldCBkaXNidXJzZW1lbnRNQlI6IHVpbnQ2NCA9IGRpc2J1cnNlbWVudENvc3QoMSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDExCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGR1cAogICAgYnVyeSAyMQogICAgY2FsbHN1YiByZXdhcmRzT3B0SW5Db3N0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2NzAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjgKICAgIC8vIGxldCBkaXNidXJzZW1lbnRNQlI6IHVpbnQ2NCA9IGRpc2J1cnNlbWVudENvc3QoMSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpCiAgICArCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2OQogICAgLy8gaWYgKGlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA3CiAgICBibnogbGlzdF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcwCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCgxKQogICAgZGlnIDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2NzAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzAKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDEpCiAgICArCiAgICBidXJ5IDE3CgpsaXN0X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3Ni03OAogICAgLy8gY29uc3QgZXNjcm93T3B0SW5Db3N0OiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDcKICAgIGJueiBsaXN0X3Rlcm5hcnlfZmFsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjc3CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0X3Rlcm5hcnlfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo4MAogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTYKICAgICsKICAgIGRpZyAxOAogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODItODQKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICogKDEgKyBsaXN0aW5nLmV4dHJhUHJvZ3JhbVBhZ2VzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgaW50YyA1IC8vIDc1NjUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODItODUKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICogKDEgKyBsaXN0aW5nLmV4dHJhUHJvZ3JhbVBhZ2VzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgLy8gY2hpbGRBcHBNQlIKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjg5CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBsaXN0X2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWNfMyAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKbGlzdF9hZnRlcl9hc3NlcnRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0b3RhbE1CUiwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMQogICAgZ3R4bnMgQW1vdW50CiAgICBkaWcgMTMKICAgID09CiAgICBibnogbGlzdF9hZnRlcl9hc3NlcnRAMTgKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmxpc3RfYWZ0ZXJfYXNzZXJ0QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuc2VuZGVyID09PSBUeG4uc2VuZGVyLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogbGlzdF9hZnRlcl9hc3NlcnRAMjAKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmxpc3RfYWZ0ZXJfYXNzZXJ0QDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTQKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDIyCiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0X2FmdGVyX2Fzc2VydEAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk1CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID4gMCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSAxNQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDI0CiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0X2FmdGVyX2Fzc2VydEAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk3CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eSA9IHJveWFsdGllcyh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LCBuYW1lLCBwcm9vZikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk3CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eSA9IHJveWFsdGllcyh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LCBuYW1lLCBwcm9vZikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIxCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQxOAogICAgLy8gbGV0IGNyZWF0b3JSb3lhbHR5OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjAKICAgIC8vIGlmICghKHByb29mLmxlbmd0aCA+IDApKSB7CiAgICBkdXAKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDIxCiAgICAvLyByZXR1cm4gQ3JlYXRvclJveWFsdHlEZWZhdWx0CiAgICBwdXNoaW50IDUwMDAKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyb3lhbHRpZXNANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAwCiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IGFwcHJvdmFsUHJvZ3JhbSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgpCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwNgogICAgLy8gYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIGRpZyAxOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTEKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTIKICAgIC8vIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIGRpZyAxNQogICAgZ3R4bnMgU2VuZGVyCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE0CiAgICAvLyBjcmVhdG9yUm95YWx0eSwKICAgIGRpZyAyMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjExOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjExOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTkKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYxCiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBpbnRjXzIgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgOQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMtMTIzCiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2MQogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBieXRlYyAxOCAvLyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHVuY292ZXIgNwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGJ5dGVjIDE5IC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LChzdHJpbmcsdWludDY0KSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA3CiAgICAvLyBmYWxzZSwKICAgIHB1c2hieXRlcyAweDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDExCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMtMTI1CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgLy8gICAuaXR4bgogICAgLy8gICAuY3JlYXRlZEFwcAogICAgZ2l0eG4gMCBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjgtMTMzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzAKICAgIC8vIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzMQogICAgLy8gYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIGRpZyAyMQogICAgKwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyOC0xMzIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTI4LTEzMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNi0xNDUKICAgIC8vIGxpc3RpbmcuY2FsbC5vcHRpbih7CiAgICAvLyAgIGFwcElkOiBsaXN0aW5nQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE0MAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQxCiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzOS0xNDIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzYtMTQ1CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ4LTE1NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE1MAogICAgLy8gYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyAxNAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ4LTE1NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTYKICAgIC8vIGlmICghaXNBbGdvUGF5bWVudCkgewogICAgZGlnIDcKICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU4LTE2NwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE2MgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjEtMTY0CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTgtMTY3CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTcwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTcwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE3MQogICAgLy8gdGhpcy5vcHRBa2l0YUVzY3Jvd0luQW5kU2VuZChBc3NldChwYXltZW50QXNzZXQpLCAwKQogICAgZGlnIDcKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG9wdEFraXRhRXNjcm93SW5BbmRTZW5kCiAgICBwb3AKCmxpc3RfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwLTUxCiAgICAvLyBsaXN0KAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBwcmljZTogdWludDY0LAogICAgLy8gICBwYXltZW50QXNzZXQ6IHVpbnQ2NCwgLy8gMCB8IEFzc2V0CiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBwcm9vZjogUHJvb2YKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxpc3RfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDI1LTQzNQogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHlTdHJpbmcgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZpZWRSZWFkPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYXNzZXQuY3JlYXRvciwKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihhc3NldC5pZCkpKSwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICAxLAogICAgLy8gICAgICdyb3lhbHR5JywKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDI4CiAgICAvLyBhc3NldC5jcmVhdG9yLAogICAgZGlnIDE4CiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMAogICAgLy8gc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgc3dhcAogICAgaXRvYgogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDMyCiAgICAvLyAxLAogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGRpZyAyMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjYKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MGNmMWI5Y2YgLy8gbWV0aG9kICJ2ZXJpZmllZFJlYWQoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQsc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMwogICAgLy8gJ3JveWFsdHknLAogICAgcHVzaGJ5dGVzIDB4MDAwNzcyNmY3OTYxNmM3NDc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc3RyaW5nCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICBidXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzNwogICAgLy8gaWYgKEJ5dGVzKGNyZWF0b3JSb3lhbHR5U3RyaW5nKS5sZW5ndGggPiAwKSB7CiAgICBsZW4KICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzgKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gYnRvaShCeXRlcyhjcmVhdG9yUm95YWx0eVN0cmluZykpCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQxCiAgICAvLyBpZiAoY3JlYXRvclJveWFsdHkgPiBDcmVhdG9yUm95YWx0eU1heGltdW1TaW5nbGUpIHsKICAgIGRpZyAxNwogICAgaW50YyA2IC8vIDUwMDAwCiAgICA+CiAgICBieiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0MgogICAgLy8gcmV0dXJuIENyZWF0b3JSb3lhbHR5TWF4aW11bVNpbmdsZQogICAgaW50YyA2IC8vIDUwMDAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5NwogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHkgPSByb3lhbHRpZXModGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldCwgbmFtZSwgcHJvb2YpCiAgICBiIGxpc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyb3lhbHRpZXNANDMKCmxpc3RfdGVybmFyeV9mYWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjc4CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3OAogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzgKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAqCiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUAxNAoKbGlzdF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3MgogICAgLy8gZGlzYnVyc2VtZW50TUJSICs9IGRpc2J1cnNlbWVudENvc3QoNSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHBheW1lbnRBc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA4CiAgICBjYWxsc3ViIHJld2FyZHNPcHRJbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgcHVzaGludCAzMzUwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgZGlnIDE3CiAgICArCiAgICBidXJ5IDE3CiAgICBiIGxpc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKbGlzdF90ZXJuYXJ5X2ZhbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1OQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAyCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBidXJ5IDE1CiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3RQcml6ZUJveFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cmxpc3RQcml6ZUJveDoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzgtMTg3CiAgICAvLyBsaXN0UHJpemVCb3goCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTg4CiAgICAvLyBsb2dnZWRBc3NlcnQocHJpY2UgPj0gNCwgRVJSX1BSSUNFX1RPT19MT1cpCiAgICBwdXNoaW50IDQKICAgID49CiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxNyAvLyAiRVJSOlBSTE8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UFJMTwoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAxMyAvLyAiRVJSOkNOU1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Q05TVAoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTkyCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDIwIC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5Mi0xOTMKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYnogbGlzdFByaXplQm94X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTkzCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkaWcgOAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOTItMTkzCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKbGlzdFByaXplQm94X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5MS0xOTQKICAgIC8vIGxvZ2dlZEFzc2VydCgoCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gICBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyApLCBFUlJfQkFEX01FVEhPRF9QUklaRV9CT1hfVFJBTlNGRVJfTkVFREVEKQogICAgYm56IGxpc3RQcml6ZUJveF9hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOkJNUFQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Qk1QVAoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgOQogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0OQogICAgLy8gYXNzZXJ0KHByaXplQm94LmNyZWF0b3IgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykucHJpemVCb3gpLmFkZHJlc3MsIEVSUl9OT1RfQV9QUklaRV9CT1gpCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NDkKICAgIC8vIGFzc2VydChwcml6ZUJveC5jcmVhdG9yID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnByaXplQm94KS5hZGRyZXNzLCBFUlJfTk9UX0FfUFJJWkVfQk9YKQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTkFQQgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTAKICAgIC8vIGNvbnN0IFtvd25lckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHByaXplQm94LCBCeXRlcyhQcml6ZUJveEdsb2JhbFN0YXRlS2V5T3duZXIpKQogICAgcHVzaGJ5dGVzICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGxpc3RQcml6ZUJveF9hZnRlcl9hc3NlcnRAMTMKICAgIHB1c2hieXRlcyAiRVJSOk5QQk8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TlBCTwoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5OC0yMDAKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk5CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMAogICAgLy8gaWYgKGlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBibnogbGlzdFByaXplQm94X2Vsc2VfYm9keUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBpbnRjIDQgLy8gNjcwMDAKICAgIGJ1cnkgMTQKCmxpc3RQcml6ZUJveF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE3LTIxOQogICAgLy8gY29uc3QgZXNjcm93T3B0SW5Db3N0OiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE4CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyMQogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTMKICAgICsKICAgIGRpZyAxNQogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjIzLTIyNQogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKiAoMSArIGxpc3RpbmcuZXh0cmFQcm9ncmFtUGFnZXMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gNzU2NTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjMtMjI2CiAgICAvLyBNSU5fUFJPR1JBTV9QQUdFUyAqICgxICsgbGlzdGluZy5leHRyYVByb2dyYW1QYWdlcykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogbGlzdGluZy5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIGNoaWxkQXBwTUJSCiAgICArCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjkKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA3CiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAyNAogICAgYnl0ZWNfMyAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0b3RhbE1CUiwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA3CiAgICBndHhucyBBbW91bnQKICAgIGRpZyAxMAogICAgPT0KICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfYXNzZXJ0QDI2CiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0UHJpemVCb3hfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzMwogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNi0yNTYKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZC5pZCwKICAgIC8vICAgICAgIHRydWUsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICAwLAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM5CiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgZGlnIDExCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NAogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NQogICAgLy8geyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgZGlnIDExCiAgICBndHhucyBTZW5kZXIKICAgIGRpZyAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDcKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjUwCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTAKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTIKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjUyCiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBFeHRyYVByb2dyYW1QYWdlcwogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDkKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBieXRlYyAxOCAvLyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHVuY292ZXIgNwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBieXRlYyAxOSAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLChhZGRyZXNzLHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCwoc3RyaW5nLHVpbnQ2NCkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDAKICAgIC8vIHRydWUsCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MS0yNjYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjY0CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgZGlnIDE3CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjYxLTI2NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjEtMjY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjY5LTI3MgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzEKICAgIC8vIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjktMjcyCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgLy8gfSkKICAgIGJ5dGVjIDIwIC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc0CiAgICAvLyBpZiAoIWlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBieiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc2LTI4NQogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI4MAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxMgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTMKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzktMjgyCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzYtMjg1CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg5CiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKEFzc2V0KHBheW1lbnRBc3NldCksIDApCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQKICAgIHBvcAoKbGlzdFByaXplQm94X2FmdGVyX2lmX2Vsc2VAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzgtMTg3CiAgICAvLyBsaXN0UHJpemVCb3goCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB1aW50NjQgewogICAgZGlnIDEyCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE5CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4MgogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18yIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTkKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNwogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgICoKICAgIGIgbGlzdFByaXplQm94X3Rlcm5hcnlfbWVyZ2VAMjIKCmxpc3RQcml6ZUJveF9lbHNlX2JvZHlAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTMKICAgIC8vIGRpc2J1cnNlbWVudE1CUiA9IGRpc2J1cnNlbWVudENvc3QoNCkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHBheW1lbnRBc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMwogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICBjYWxsc3ViIHJld2FyZHNPcHRJbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgcHVzaGludCAyNjgwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMwogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgYnVyeSAxNAogICAgYiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxOQoKbGlzdFByaXplQm94X3Rlcm5hcnlfZmFsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDAKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGJ1cnkgMTIKICAgIGIgbGlzdFByaXplQm94X3Rlcm5hcnlfbWVyZ2VAMTYKCmxpc3RQcml6ZUJveF9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBsaXN0UHJpemVCb3hfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmdhdGVkUHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpnYXRlZFB1cmNoYXNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjk2LTMwMQogICAgLy8gZ2F0ZWRQdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAyCiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwMgogICAgLy8gY29uc3Qgd2FsbGV0ID0gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwMwogICAgLy8gY29uc3Qgb3JpZ2luID0gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0KQogICAgY2FsbHN1YiBvcmlnaW5PclR4blNlbmRlcgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA1CiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogZ2F0ZWRQdXJjaGFzZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNyAvLyAiRVJSOk5BTFMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFMUwoKZ2F0ZWRQdXJjaGFzZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDIKICAgIGJ5dGVjIDExIC8vICJnYXRlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA3CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA3CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICBzd2FwCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgYm56IGdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDIxIC8vICJFUlI6RkdURSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGR1RFCgpnYXRlZFB1cmNoYXNlX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA4CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgNAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgZHVwCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTEKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogY3JlYXRvciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxNC0zMjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE4CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTkKICAgIC8vIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICBkaWcgOAogICAgZ3R4bnMgQW1vdW50CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE3LTMyMAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxNC0zMjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjEKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTQtMzI0CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyMiAvLyBtZXRob2QgInB1cmNoYXNlKHBheSxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzI2LTMzMQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjYtMzMwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjYtMzMxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI5Ni0zMDEKICAgIC8vIGdhdGVkUHVyY2hhc2UoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UucHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzNC0zMzgKICAgIC8vIHB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM5CiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDcgLy8gIkVSUjpOQUxTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5BTFMKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDEKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAyMyAvLyAiRVJSOkhHVEUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SEdURQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDIKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQ1CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IGNyZWF0b3IsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDgtMzU4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MgogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzUzCiAgICAvLyBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgZGlnIDYKICAgIGd0eG5zIEFtb3VudAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MS0zNTQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDgtMzU4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU1CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQ4LTM1OAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjIgLy8gbWV0aG9kICJwdXJjaGFzZShwYXksYWRkcmVzcyxhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2MC0zNjUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwLTM2NAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwLTM2NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzQtMzM4CiAgICAvLyBwdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmdhdGVkUHVyY2hhc2VBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgpnYXRlZFB1cmNoYXNlQXNhOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNjgtMzczCiAgICAvLyBnYXRlZFB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzQKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5PclR4blNlbmRlcih3YWxsZXQpCiAgICBjYWxsc3ViIG9yaWdpbk9yVHhuU2VuZGVyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzcKICAgIC8vIGxvZ2dlZEFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA3IC8vICJFUlI6TkFMUyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOQUxTCgpnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc4CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMgogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzkKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzkKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDUKICAgIHN3YXAKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBibnogZ2F0ZWRQdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgMjEgLy8gIkVSUjpGR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZHVEUKCmdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1RSQU5TRkVSKQogICAgZGlnIDQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDEyIC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzgxCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID4gMCwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZ2F0ZWRQdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCmdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgZHVwCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODQKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODctMzk4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzkxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDIKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5MwogICAgLy8geGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgZGlnIDgKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5MC0zOTQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vIH0pLAogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4Ny0zOTgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4Ny0zOTgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyNCAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDAyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDAxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDAwLTQwMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzY4LTM3MwogICAgLy8gZ2F0ZWRQdXJjaGFzZUFzYSgKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLnB1cmNoYXNlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2VBc2E6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwNS00MDkKICAgIC8vIHB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDEwCiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDcgLy8gIkVSUjpOQUxTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5BTFMKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDExCiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTIKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGJ6IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAyMyAvLyAiRVJSOkhHVEUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SEdURQoKcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTMKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1RSQU5TRkVSKQogICAgZGlnIDIKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyAxMiAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTQKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPiAwLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAyCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBidXJ5IDUKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDE3CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDIwLTQzMQogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyNAogICAgLy8gYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjYKICAgIC8vIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIGRpZyA2CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjMtNDI3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjAtNDMxCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjgKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjAtNDMxCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcixhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMzLTQzNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMzLTQzNAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzMy00MzUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwNS00MDkKICAgIC8vIHB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5kZWxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxpc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MzgKICAgIC8vIGRlbGlzdChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzOQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfTElTVElORykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGlzdF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNyAvLyAiRVJSOk5BTFMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFMUwoKZGVsaXN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZHVwbiAyCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDIKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDUtNDQ4CiAgICAvLyBsaXN0aW5nLmNhbGwuZGVsaXN0KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDcKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ0NS00NDgKICAgIC8vIGxpc3RpbmcuY2FsbC5kZWxpc3QoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2OGU4NjM0MyAvLyBtZXRob2QgImRlbGlzdChhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTAtNDUyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTAtNDUxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUwLTQ1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM4CiAgICAvLyBkZWxpc3QoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5pbml0Qm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDIKICAgIC8vIGluaXRCb3hlZENvbnRyYWN0KHZlcnNpb246IHN0cmluZywgc2l6ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDQKICAgIC8vIGlmICghdGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANAogICAgYnl0ZWMgNiAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmluaXRCb3hlZENvbnRyYWN0X2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5sb2FkQm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvYWRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU0CiAgICAvLyBjb25zdCBleHBlY3RlZFByZXZpb3VzQ2FsbHM6IHVpbnQ2NCA9IG9mZnNldCAvIDIwMzIKICAgIHB1c2hpbnQgMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTkKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjAKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYwCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYxCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxNSAvLyBtZXRob2QgImluaXRCb3hlZENvbnRyYWN0KHN0cmluZyx1aW50NjQpdm9pZCIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjIKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjIKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBieiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpsb2FkQm94ZWRDb250cmFjdF9ib29sX21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ni02MwogICAgLy8gbG9nZ2VkQXNzZXJ0KCgKICAgIC8vICAgdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICAgJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICAgJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICAgJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAgICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgLy8gICAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICAvLyApLCBFUlJfSU5WQUxJRF9DQUxMX09SREVSKQogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMQogICAgcHVzaGJ5dGVzICJFUlI6SUNPUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJQ09SCgpsb2FkQm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMTMgLy8gIkVSUjpDTlNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkNOU1QKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDQgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiBkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgpkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwbiAyCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTk2CiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NgogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdEluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGRpZyAzCiAgICBndHhucyBBbW91bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICArCiAgICAqCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwNAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMDUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwMi0yMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE1CiAgICAvLyBpZiAoY291bnQgPiAwICYmIGVzY3Jvdy5uYW1lICE9PSAnJykgewogICAgZHVwCiAgICBieiBvcHRJbl9hZnRlcl9pZl9lbHNlQDkKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgIT0KICAgIGJ6IG9wdEluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE2CiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKGFzc2V0LCAwKQogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG9wdEFraXRhRXNjcm93SW5BbmRTZW5kCiAgICBwb3AKCm9wdEluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4MgogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18yIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgKwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRob3V0QWtpdGFPcHRJbi51cGRhdGVBa2l0YURBT0VzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODQKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGNvbmZpZzogRXNjcm93Q29uZmlnKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDAgb2YgKChsZW4rdXRmOFtdKSx1aW50NjQpCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkVzY3Jvd0NvbmZpZwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODUKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODUKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPRXNjcm93X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT0VzY3Jvd19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg2CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoY29uZmlnKQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NAogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coY29uZmlnOiBFc2Nyb3dDb25maWcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6VXBncmFkZWFibGVBa2l0YUJhc2VDb250cmFjdC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNiAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKdXBkYXRlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDkKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgYnl0ZWMgMjUgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ5CiAgICAvLyBjb25zdCB1cGRhdGVQbHVnaW4gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnVwZGF0ZQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUwCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgPT09IHVwZGF0ZVBsdWdpbiwgRVJSX0lOVkFMSURfVVBHUkFERSkKICAgIGdsb2JhbCBDYWxsZXJBcHBsaWNhdGlvbklECiAgICA9PQogICAgYm56IHVwZGF0ZV9hZnRlcl9hc3NlcnRANQogICAgcHVzaGJ5dGVzICJFUlI6SVVQRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVVBHCgp1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MQogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0Lm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cm9wdEFraXRhRXNjcm93SW5BbmRTZW5kOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE1CiAgICAvLyBwcm90ZWN0ZWQgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQoYXNzZXQ6IEFzc2V0LCBhbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAyNSAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE4CiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjAKICAgIC8vIGNvbnN0IGVzY3JvdyA9IGNsb25lKHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIwCiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIxCiAgICAvLyBjb25zdCB7IGlkIH0gPSB0aGlzLmdldEVzY3Jvdyhlc2Nyb3cubmFtZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBzd2FwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk3CiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgOQogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dJbmZvPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTAwCiAgICAvLyBsb2dnZWRBc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBibnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOk5FU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVTQwoKb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjIKICAgIC8vIGxvZ2dlZEFzc2VydChpZCA9PT0gZXNjcm93LmFwcC5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyA4CiAgICA9PQogICAgYm56IG9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2Fzc2VydEAyCiAgICBwdXNoYnl0ZXMgIkVSUjpXRVNDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOldFU0MKCm9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI0LTEzMwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiB3YWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgICBDYWxsZXJUeXBlR2xvYmFsLAogICAgLy8gICAgIGVzY3Jvdy5uYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4NWFkZjMzOGYgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTMwCiAgICAvLyBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzMQogICAgLy8gW10KICAgIHB1c2hieXRlcyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjQtMTMzCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIENhbGxlclR5cGVHbG9iYWwsCiAgICAvLyAgICAgZXNjcm93Lm5hbWUsCiAgICAvLyAgICAgWzBdLCAvLyBhbGwgdGhlIGFraXRhIGVzY3Jvd3MgaGF2ZSBtZXRob2QgcmVzdHJpY3Rpb25zIHdpdGggb3B0aW4gYmVpbmcgaW5kZXggMAogICAgLy8gICAgIFtdCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM2CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM2CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gZXNjcm93LmFwcC5hZGRyZXNzLAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM1LTEzOQogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQxCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIG9wdEluQ291bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUwCiAgICAvLyByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0OS0xNTIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNDYKICAgIC8vIHdhbGxldCwKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ4CiAgICAvLyBbYXNzZXQuaWRdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0NwogICAgLy8gdHJ1ZSwKICAgIHB1c2hieXRlcyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2Y2MzZjYwNiAvLyBtZXRob2QgImFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1OAogICAgLy8gaWYgKGFtb3VudCA+IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTktMTY1CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2MQogICAgLy8gYXNzZXRSZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjAtMTY0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCm9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2OAogICAgLy8gaXR4bkNvbXBvc2Uuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzAKICAgIC8vIHJldHVybiBtYnJBbW91bnQKICAgIHJldHN1Ygo=\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type EscrowConfig = {\n name: string,\n app: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EscrowConfig to the struct representation\n */\nexport function EscrowConfigFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('EscrowConfig', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as EscrowConfig\n}\n\n/**\n * The argument types for the Marketplace contract\n */\nexport type MarketplaceArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,(string,uint64))void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: EscrowConfig\n }\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n name: string\n proof: Uint8Array[]\n }\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': {\n prizeBoxTransferTxn: AppMethodCallTransactionArgument\n payment: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n }\n 'gatedPurchase(pay,appl,uint64,address)void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchase(pay,uint64,address)void': {\n payment: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': {\n assetXfer?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchaseAsa(axfer,uint64,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'delist(uint64)void': {\n appId: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction covering MBR for all opt-ins\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to opt into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow((string,uint64))void': {\n config: EscrowConfig\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,(string,uint64))void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: EscrowConfig]\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string, name: string, proof: Uint8Array[]]\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': [prizeBoxTransferTxn: AppMethodCallTransactionArgument, payment: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string]\n 'gatedPurchase(pay,appl,uint64,address)void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchase(pay,uint64,address)void': [payment: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchaseAsa(axfer,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'delist(uint64)void': [appId: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow((string,uint64))void': [config: EscrowConfig]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MarketplaceReturns = {\n 'create(string,string,uint64,(string,uint64))void': void\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': bigint\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': bigint\n 'gatedPurchase(pay,appl,uint64,address)void': void\n 'purchase(pay,uint64,address)void': void\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': void\n 'purchaseAsa(axfer,uint64,address)void': void\n 'delist(uint64)void': void\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow((string,uint64))void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Marketplace smart contract.\n */\nexport type MarketplaceTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,(string,uint64))void' | 'create', {\n argsObj: MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void']\n argsTuple: MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']\n returns: MarketplaceReturns['create(string,string,uint64,(string,uint64))void']\n }>\n & Record<'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' | 'list', {\n argsObj: MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n argsTuple: MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n returns: MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n }>\n & Record<'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' | 'listPrizeBox', {\n argsObj: MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n argsTuple: MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n returns: MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n }>\n & Record<'gatedPurchase(pay,appl,uint64,address)void' | 'gatedPurchase', {\n argsObj: MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void']\n }>\n & Record<'purchase(pay,uint64,address)void' | 'purchase', {\n argsObj: MarketplaceArgs['obj']['purchase(pay,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']\n returns: MarketplaceReturns['purchase(pay,uint64,address)void']\n }>\n & Record<'gatedPurchaseAsa(axfer,appl,uint64,address)void' | 'gatedPurchaseAsa', {\n argsObj: MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n }>\n & Record<'purchaseAsa(axfer,uint64,address)void' | 'purchaseAsa', {\n argsObj: MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']\n returns: MarketplaceReturns['purchaseAsa(axfer,uint64,address)void']\n }>\n & Record<'delist(uint64)void' | 'delist', {\n argsObj: MarketplaceArgs['obj']['delist(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['delist(uint64)void']\n returns: MarketplaceReturns['delist(uint64)void']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: MarketplaceArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: MarketplaceReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: MarketplaceReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: MarketplaceArgs['obj']['deleteBoxedContract()void']\n argsTuple: MarketplaceArgs['tuple']['deleteBoxedContract()void']\n returns: MarketplaceReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: MarketplaceArgs['obj']['optIn(pay,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['optIn(pay,uint64)void']\n returns: MarketplaceReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: MarketplaceArgs['obj']['optInCost(uint64)uint64']\n argsTuple: MarketplaceArgs['tuple']['optInCost(uint64)uint64']\n returns: MarketplaceReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow((string,uint64))void' | 'updateAkitaDAOEscrow', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']\n returns: MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: MarketplaceArgs['obj']['update(string)void']\n argsTuple: MarketplaceArgs['tuple']['update(string)void']\n returns: MarketplaceReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: MarketplaceArgs['obj']['opUp()void']\n argsTuple: MarketplaceArgs['tuple']['opUp()void']\n returns: MarketplaceReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the named DAO escrow this contract routes fees to (name + app)\n */\n akitaDaoEscrow: EscrowConfig\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MarketplaceSignatures = keyof MarketplaceTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MarketplaceNonVoidMethodSignatures = keyof MarketplaceTypes['methods'] extends infer T ? T extends keyof MarketplaceTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Marketplace smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Marketplace smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MarketplaceTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MarketplaceTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MarketplaceCreateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & {method: 'create(string,string,uint64,(string,uint64))void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type MarketplaceUpdateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MarketplaceDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: MarketplaceCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: MarketplaceUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Marketplace smart contract\n */\nexport abstract class MarketplaceParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MarketplaceCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,(string,uint64))void':\n return MarketplaceParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(string,string,uint64,(string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends MarketplaceUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return MarketplaceParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the Marketplace smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace, params.args.name, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prizeBoxTransferTxn, params.args.payment, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchase(pay,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchase(pay,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchase(pay,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchase(pay,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchaseAsa(axfer,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchaseAsa(axfer,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the delist(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'delist(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow((string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow((string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.config],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Marketplace smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MarketplaceFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `MarketplaceFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new MarketplaceClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new MarketplaceClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Marketplace smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: MarketplaceDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MarketplaceParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MarketplaceCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? MarketplaceParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (MarketplaceUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MarketplaceClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(MarketplaceParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using an ABI method call using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(MarketplaceParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MarketplaceReturns['create(string,string,uint64,(string,uint64))void']) }, appClient: new MarketplaceClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Marketplace smart contract\n */\nexport class MarketplaceClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `MarketplaceClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Marketplace app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MarketplaceClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `MarketplaceClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MarketplaceClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n return this.appClient.params.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n return this.appClient.createTransaction.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n const result = await this.appClient.send.update(MarketplaceParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n list: async (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.list(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n listPrizeBox: async (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.listPrizeBox(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchase: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchase: async (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchase(pay,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n delist: async (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.delist(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['delist(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['opUp()void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new MarketplaceClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return result.return as unknown as MarketplaceReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current Marketplace app\n */\n state = {\n /**\n * Methods to access global state for the current Marketplace app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<EscrowConfig | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as EscrowConfig | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Marketplace app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): MarketplaceComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 method call against the Marketplace contract\n */\n list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.list(params)))\n return this\n },\n /**\n * Add a listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 method call against the Marketplace contract\n */\n listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.listPrizeBox(params)))\n return this\n },\n /**\n * Add a gatedPurchase(pay,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchase(params)))\n return this\n },\n /**\n * Add a purchase(pay,uint64,address)void method call against the Marketplace contract\n */\n purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchase(params)))\n return this\n },\n /**\n * Add a gatedPurchaseAsa(axfer,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchaseAsa(params)))\n return this\n },\n /**\n * Add a purchaseAsa(axfer,uint64,address)void method call against the Marketplace contract\n */\n purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n return this\n },\n /**\n * Add a delist(uint64)void method call against the Marketplace contract\n */\n delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.delist(params)))\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the Marketplace contract\n */\n initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the Marketplace contract\n */\n loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the Marketplace contract\n */\n deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Marketplace contract\n */\n optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the Marketplace contract\n */\n optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow((string,uint64))void method call against the Marketplace contract\n */\n updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Marketplace contract\n */\n updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Marketplace contract\n */\n opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Marketplace contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as MarketplaceComposer\n }\n}\nexport type MarketplaceComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n list(params?: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | undefined]>\n\n /**\n * Calls the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n listPrizeBox(params?: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | undefined]>\n\n /**\n * Calls the gatedPurchase(pay,appl,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedPurchase(params?: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchase(pay,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchase(pay,uint64,address)void'] | undefined]>\n\n /**\n * Calls the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedPurchaseAsa(params?: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchaseAsa(axfer,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchaseAsa(params?: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'] | undefined]>\n\n /**\n * Calls the delist(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['delist(uint64)void'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow((string,uint64))void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): MarketplaceComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): MarketplaceComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MarketplaceComposerResults<TReturns>>\n}\nexport type MarketplaceComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Listing\",\"structs\":{\"EscrowConfig\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"app\",\"type\":\"uint64\"}],\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"uint64\",\"name\":\"prize\"},{\"type\":\"bool\",\"name\":\"isPrizeBox\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"seller\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"creatorRoyalty\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"desc\":\"create the listing application\",\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"- the payment for purchasing the asset\"},{\"type\":\"address\",\"name\":\"buyer\",\"desc\":\"- the buyer of the asset\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"address\",\"name\":\"buyer\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"desc\":\"Deletes the app and returns the asset/mbr to the seller\",\"events\":[],\"recommendations\":{}},{\"name\":\"changePrice\",\"args\":[{\"type\":\"uint64\",\"name\":\"price\"}],\"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\":{}},{\"name\":\"optin\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":9,\"bytes\":6},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"prize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpemU=\",\"desc\":\"the asset for sale: Asset | Application ( Prize Box )\"},\"isPrizeBox\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"aXNfcHJpemVfYm94\",\"desc\":\"whether or not the prize is an asset or a prize box\"},\"price\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpY2U=\",\"desc\":\"the price of the asset\"},\"paymentAsset\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cGF5bWVudF9hc3NldA==\",\"desc\":\"the asset to use for payment\"},\"expiration\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZXhwaXJhdGlvbg==\",\"desc\":\"the timestamp the listing expires on, once this passes all that can be done is delist\"},\"seller\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"c2VsbGVy\",\"desc\":\"the address selling the asset\"},\"reservedFor\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"cmVzZXJ2ZWRfZm9y\",\"desc\":\"the address the sale is reserved for\"},\"creatorRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Y3JlYXRvcl9yb3lhbHR5\",\"desc\":\"the amount the creator will get for the sale\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate ID to use to check if the user is qualified to buy\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"The address of the marketplace that listed the asset to send the fee to\\n\\nIMPORTANT: this is a double sided marketplace fee contract\\nthe marketplace referred to internally in the contract\\nis the listing side marketplace.\\nthe buyer side marketplace provides their address at\\nthe time of purchase\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"EscrowConfig\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow\"},\"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\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[471,629,758,2757],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[2581],\"errorMessage\":\"ERR:FORB\"},{\"pc\":[1156],\"errorMessage\":\"ERR:IEXP\"},{\"pc\":[1372,1386,1403],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[2625],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[2603],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[1736,1753],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[1332,1696],\"errorMessage\":\"ERR:LEXP\"},{\"pc\":[1109,1286,1650,2219],\"errorMessage\":\"ERR:MBFF\"},{\"pc\":[2485],\"errorMessage\":\"ERR:MBSL\"},{\"pc\":[2536],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[2241],\"errorMessage\":\"ERR:OSCD\"},{\"pc\":[1305],\"errorMessage\":\"ERR:PAMA\"},{\"pc\":[1669],\"errorMessage\":\"ERR:PANA\"},{\"pc\":[1358,1722],\"errorMessage\":\"ERR:RFDA\"},{\"pc\":[837,2663,2794,2824],\"errorMessage\":\"IPCT\"},{\"pc\":[365],\"errorMessage\":\"NCCA\"},{\"pc\":[2976,2992],\"errorMessage\":\"account opted into asset\"},{\"pc\":[406,494,515,528,539,656,1449,1802,2520],\"errorMessage\":\"application exists\"},{\"pc\":[1557,1577,1838,1853,2156],\"errorMessage\":\"asset exists\"},{\"pc\":[1228,1290,1310,1318,1337,1348,1395,1413,1429,1443,1471,1502,1515,1544,1589,1654,1674,1682,1701,1712,1745,1763,1779,1783,1796,1806,1824,1835,1842,1861,1879,1883,1896,1905,1922,1942,1960,1964,1976,1980,2009,2013,2017,2056,2060,2099,2103,2108,2147,2151,2223,2248,2255,2263,2270,2277,2282,2290,2294,2381,2389,2393,2469,2507,2658,2678,2693,2711,2819,2841,2902,2910,2937,2966],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[382,761,1052,1095],\"errorMessage\":\"invalid array length header\"},{\"pc\":[963],\"errorMessage\":\"invalid number of bytes for arc4.bool\"},{\"pc\":[1060],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[1001,1019,1046,1265,1274,1629,1638,2207],\"errorMessage\":\"invalid number of bytes for arc4.static_array<arc4.uint8, 32>\"},{\"pc\":[954,973,982,991,1027,1036,1071,2462,2500,2560],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[768],\"errorMessage\":\"invalid number of bytes for bytes\"},{\"pc\":[1100],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig\"},{\"pc\":[1010],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/types/mbr.ts::FunderInfo\"},{\"pc\":[476,634,2762],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[1087],\"errorMessage\":\"invalid tail pointer at index 0 of ((len+utf8[]),uint64)\"},{\"pc\":[1082],\"errorMessage\":\"invalid tuple encoding\"},{\"pc\":[1620],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1256,2552],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGJ5dGVjYmxvY2sgInBheW1lbnRfYXNzZXQiICJzZWxsZXIiICJha2l0YV9kYW8iICJwcml6ZSIgMHgwMDAxICJpc19wcml6ZV9ib3giICJwcmljZSIgImV4cGlyYXRpb24iICJyZXNlcnZlZF9mb3IiICJtYXJrZXRwbGFjZSIgMHgxNTFmN2M3NSAiRVJSOk1CRkYiICJjcmVhdG9yX3JveWFsdHkiICJha2l0YV9lc2Nyb3ciICJtYXJrZXRwbGFjZV9yb3lhbHRpZXMiICJFUlI6SVBBWSIgMHhhZGY5MmFlNCAibmZ0X2ZlZXMiICJFUlI6TEVYUCIgIkVSUjpSRkRBIiAiRVJSOklYRlIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3LTIxCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlc3MgMHg2YTE2MzkzZCAweDY4ZTg2MzQzIC8vIG1ldGhvZCAicHVyY2hhc2UocGF5LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJkZWxpc3QoYWRkcmVzcyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9wdXJjaGFzZV9yb3V0ZUA0IG1haW5fZGVsaXN0X3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNy0yMQogICAgLy8gZXhwb3J0IGNsYXNzIExpc3RpbmcgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBBa2l0YUJhc2VDb250cmFjdCwKICAgIC8vICAgQ29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbiwKICAgIC8vICAgQ2hpbGRDb250cmFjdAogICAgLy8gKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDE0CiAgICBwdXNoYnl0ZXNzIDB4MTcxYzlmODggMHgxOTM5NmM0YSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHgzZWExMTgzMiAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjaGFuZ2VQcmljZSh1aW50NjQpdm9pZCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiLCBtZXRob2QgIm9wdGluKHBheSx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHB1cmNoYXNlQXNhIGNoYW5nZVByaWNlIHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxMSBvcHRpbgogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTctMjEKICAgIC8vIGV4cG9ydCBjbGFzcyBMaXN0aW5nIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQWtpdGFCYXNlQ29udHJhY3QsCiAgICAvLyAgIENvbnRyYWN0V2l0aENyZWF0b3JPbmx5T3B0SW4sCiAgICAvLyAgIENoaWxkQ29udHJhY3QKICAgIC8vICkgewogICAgcHVzaGJ5dGVzIDB4N2I1MGVhOGMgLy8gbWV0aG9kICJjcmVhdGUodWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHN0cmluZyx1aW50NjQsKHN0cmluZyx1aW50NjQpKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKbWFpbl9kZWxpc3Rfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBkZWxpc3QKCm1haW5fcHVyY2hhc2Vfcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQzCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBwdXJjaGFzZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCwgdGltZVRvVW5sb2NrOiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCwgYWxsb2NhdGlvbnM6IGJ5dGVzLCBzdW06IHVpbnQ2NCwgY2xvc2VPdXQ6IHVpbnQ2NCkgLT4gYnl0ZXMsIGJ5dGVzOgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCwgdGltZVRvVW5sb2NrOiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCwgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10sIHN1bTogdWludDY0LCBjbG9zZU91dDogYm9vbGVhbik6IHsgaWQ6IHVpbnQ2NCwgY29zdDogdWludDY0IH0gewogICAgcHJvdG8gNyAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxOQogICAgLy8gYXNzZXJ0KGFzc2V0ICE9PSAwIHx8IGNsb3NlT3V0ID09PSBmYWxzZSwgRVJSX0NBTk5PVF9DTE9TRV9PVVRfT0ZfQUxHT19GT1JCSURERU4pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJueiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMwoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE5CiAgICAvLyBhc3NlcnQoYXNzZXQgIT09IDAgfHwgY2xvc2VPdXQgPT09IGZhbHNlLCBFUlJfQ0FOTk9UX0NMT1NFX09VVF9PRl9BTEdPX0ZPUkJJRERFTikKICAgIGFzc2VydCAvLyBOQ0NBCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTcKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyMwogICAgLy8gbGV0IGNvc3Q6IHVpbnQ2NCA9IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDI1MzAwCiAgICAqCiAgICBwdXNoaW50IDQxNzAwCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI0CiAgICAvLyBpZiAoYXNzZXQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAtNgogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI1LTUzNgogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyOQogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMAogICAgLy8gYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI4LTUzMQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MzIKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MzMKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4N2I3ZGM1ZmMgLy8gbWV0aG9kICJjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KHBheSx1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzcKICAgIC8vIHJldHVybiB7IGlkLCBjb3N0IH0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTM4CiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2lmX2JvZHlAOQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU1MgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTgKICAgIC8vIGlmIChjbG9zZU91dCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTU5CiAgICAvLyB0cmFuc2ZlclR4bi5zZXQoeyBhc3NldENsb3NlVG86IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MgfSkKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NgogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NS01NjgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTY5CiAgICAvLyB0cmFuc2ZlclR4biwKICAgIGl0eG5fbmV4dAogICAgZnJhbWVfZGlnIDQKICAgIGJ6IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfbmV4dF9maWVsZEAxNwogICAgZnJhbWVfZGlnIDUKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X25leHRfZmllbGRAMTc6CiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTUyLTU1NgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NjItNTc0CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdHJhbnNmZXJUeG4sCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzAKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzEKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhhZjFhMTRmMiAvLyBtZXRob2QgImNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMAoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9pZl9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzOQogICAgLy8gY29zdCArPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NAogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NQogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQzLTU0NgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NwogICAgLy8gQXNzZXQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzOTRlYWViMiAvLyBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c2VuZFJlZmVycmFsUGF5bWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnNlbmRSZWZlcnJhbFBheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNlbmRSZWZlcnJhbFBheW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IFJlZmVycmFsUGF5bWVudEluZm8gewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBieXRlcwogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18yIC8vIDgKICAgICE9CiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTIKCnNlbmRSZWZlcnJhbFBheW1lbnRfaWZfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkyCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTQKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDMKICAgIGJueiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTcKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKCnNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTYKICAgIC8vIGlmIChhbW91bnQgPiAwICYmIHJlZmVycmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2OAogICAgLy8gY29uc3QgW3dhbGxldEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXRGZWVzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJ3YWxsZXRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk4CiAgICAvLyBjb25zdCB7IHJlZmVycmVyUGVyY2VudGFnZSB9ID0gZ2V0V2FsbGV0RmVlcyhha2l0YURBTykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSVBDVAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwMQogICAgLy8gaWYgKHJlZmVycmFsRmVlID09PSAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDIKICAgIC8vIHJlZmVycmFsRmVlID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwOAogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIGR1cAogICAgcHVzaGludCA2MDQ4MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEwCiAgICAvLyBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA1LTYxMwogICAgLy8gY29uc3QgeyBjb3N0OiByZWZlcnJhbE1iciB9ID0gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgYWtpdGFEQU8sCiAgICAvLyAgIGFzc2V0LAogICAgLy8gICBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIC8vICAgW3sgYWRkcmVzczogcmVmZXJyZXIsIGFtb3VudDogcmVmZXJyYWxGZWUgfV0sCiAgICAvLyAgIHJlZmVycmFsRmVlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGRpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxMgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwNS02MTMKICAgIC8vIGNvbnN0IHsgY29zdDogcmVmZXJyYWxNYnIgfSA9IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIGFraXRhREFPLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICAvLyAgIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgLy8gICByZWZlcnJhbEZlZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIGNhbGxzdWIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudAogICAgcG9wCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTUKICAgIC8vIHJldHVybiB7IGxlZnRvdmVyOiAoYW1vdW50IC0gcmVmZXJyYWxGZWUpLCByZWZlcnJhbE1iciB9CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxOAogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IGFtb3VudCwgcmVmZXJyYWxNYnI6IDAgfQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZnJhbWVfZGlnIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTc1CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlcikKICAgIHB1c2hieXRlcyAicmVmZXJyZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYxCiAgICAvLyByZXR1cm4gcmVmZXJyZXJPcih3YWxsZXRJRCwgR2xvYmFsLnplcm9BZGRyZXNzKQogICAgYiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cmVmZXJyZXJPckAxOAoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgYiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAMTMKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbWJyLnRzOjpGdW5kZXJJbmZvCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZHVwbiAyCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0KQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpFc2Nyb3dDb25maWcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEwCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTIKICAgIC8vIHRoaXMucHJpemUudmFsdWUgPSBwcml6ZQogICAgZGlnIDE0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOAogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxMwogICAgLy8gdGhpcy5pc1ByaXplQm94LnZhbHVlID0gaXNQcml6ZUJveAogICAgZGlnIDEzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICBkaWcgMTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE1CiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSA9IEFzc2V0KHBheW1lbnRBc3NldCkKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGRpZyA5CiAgICBieiBjcmVhdGVfYm9vbF90cnVlQDUKICAgIGRpZyA5CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUA2CgpjcmVhdGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGJueiBjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDkKICAgIHB1c2hieXRlcyAiRVJSOklFWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SUVYUAoKY3JlYXRlX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNAogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNwogICAgLy8gdGhpcy5leHBpcmF0aW9uLnZhbHVlID0gZXhwaXJhdGlvbgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTgKICAgIC8vIHRoaXMuc2VsbGVyLnZhbHVlID0gc2VsbGVyCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmZ1bmRlci52YWx1ZSA9IGNsb25lKGZ1bmRlcikKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOAogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIwCiAgICAvLyB0aGlzLnJlc2VydmVkRm9yLnZhbHVlID0gcmVzZXJ2ZWRGb3IKICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MAogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTIgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIxCiAgICAvLyB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID0gY3JlYXRvclJveWFsdHkKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MgogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBwdXNoYnl0ZXMgImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyMgogICAgLy8gdGhpcy5nYXRlSUQudmFsdWUgPSBnYXRlSUQKICAgIGRpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjMKICAgIC8vIHRoaXMubWFya2V0cGxhY2UudmFsdWUgPSBtYXJrZXRwbGFjZQogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjQKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTcKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5QWtpdGFEQU9Fc2Nyb3cgfSkKICAgIGJ5dGVjIDEzIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNgogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGNsb25lKGFraXRhREFPRXNjcm93KQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyOQogICAgLy8gdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkubWFya2V0cGxhY2VDb21wb3NhYmxlUGVyY2VudGFnZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjkzCiAgICAvLyBjb25zdCBbbmZ0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c05GVEZlZXMpKQogICAgYnl0ZWMgMTcgLy8gIm5mdF9mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU1CiAgICAvLyBtYXJrZXRwbGFjZVJveWFsdGllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlUm95YWx0aWVzIH0pCiAgICBieXRlYyAxNCAvLyAibWFya2V0cGxhY2Vfcm95YWx0aWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5MwogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy5wdXJjaGFzZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnB1cmNoYXNlOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQzCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQ5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxMSAvLyAiRVJSOk1CRkYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TUJGRgoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOlBBTUEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UEFNQQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9ib29sX3RydWVANwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBwdXJjaGFzZV9ib29sX2ZhbHNlQDgKCnB1cmNoYXNlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCnB1cmNoYXNlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUxCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDExCiAgICBieXRlYyAxOCAvLyAiRVJSOkxFWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TEVYUAoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTMKICAgIC8vIGlmICh0aGlzLnJlc2VydmVkRm9yLnZhbHVlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTMKICAgIC8vIGlmICh0aGlzLnJlc2VydmVkRm9yLnZhbHVlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gbG9nZ2VkQXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzgKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gbG9nZ2VkQXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGJ5dGVjIDE5IC8vICJFUlI6UkZEQSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpSRkRBCgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTcKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDIKICAgIGd0eG5zIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxNwogICAgYnl0ZWMgMTUgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU4CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxOQogICAgYnl0ZWMgMTUgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU5CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IHRoaXMucHJpY2UudmFsdWUsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0aGlzLnByaWNlLnZhbHVlLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDIxCiAgICBieXRlYyAxNSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjEKICAgIC8vIHRoaXMudHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIoYnV5ZXIpCiAgICBkaWcgMQogICAgY2FsbHN1YiB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjMKICAgIC8vIGNvbnN0IGFtb3VudHMgPSB0aGlzLmdldEFtb3VudHModGhpcy5wcmljZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMwCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTIzCiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiBnZXRBbW91bnRzCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjYKICAgIC8vIGxldCBsZWZ0b3ZlcjogdWludDY0ID0gYW1vdW50cy5ha2l0YQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI3CiAgICAvLyBpZiAoYW1vdW50cy5ha2l0YSA+IDApIHsKICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI4CiAgICAvLyAoeyBsZWZ0b3ZlciB9ID0gc2VuZFJlZmVycmFsUGF5bWVudCh0aGlzLmFraXRhREFPLnZhbHVlLCAwLCBhbW91bnRzLmFraXRhKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI4CiAgICAvLyAoeyBsZWZ0b3ZlciB9ID0gc2VuZFJlZmVycmFsUGF5bWVudCh0aGlzLmFraXRhREFPLnZhbHVlLCAwLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNlbmRSZWZlcnJhbFBheW1lbnQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAoKcHVyY2hhc2VfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMxLTEzNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEzMwogICAgLy8gcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NwogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMzCiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzEtMTM1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzEtMTM2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEzOS0xNDQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MQogICAgLy8gYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgZGlnIDMKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MgogICAgLy8gcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTM5LTE0MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzktMTQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU1CiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VfZWxzZV9ib2R5QDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1Ni0xNjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU4CiAgICAvLyBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgZGlnIDMKICAgIHB1c2hpbnQgMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1OQogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU5CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU2LTE2MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1Ni0xNjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMtMzY1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjQKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMtMzY0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2My0zNjUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNDMKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnB1cmNoYXNlX2Vsc2VfYm9keUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYzCiAgICAvLyBjb25zdCBhc3NldFByaXplID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYzCiAgICAvLyBjb25zdCBhc3NldFByaXplID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2Ni0xNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5jcmVhdG9yLAogICAgLy8gICAgIHJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjgKICAgIC8vIGFtb3VudDogYW1vdW50cy5jcmVhdG9yLAogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2OQogICAgLy8gcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIGRpZyAxCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY2LTE3MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY2LTE3MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzQtMTgwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzYKICAgIC8vIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICBzd2FwCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzcKICAgIC8vIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIHN3YXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiBTb2xkIgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3OAogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc4CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzQtMTc5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NC0xODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDI3CgpwdXJjaGFzZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLnB1cmNoYXNlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2VBc2E6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNzYKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4MgogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCAhPT0gMCwgRVJSX1BBWU1FTlRfQVNTRVRfTVVTVF9OT1RfQkVfQUxHTykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzgzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgIT09IDAsIEVSUl9QQVlNRU5UX0FTU0VUX01VU1RfTk9UX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpQQU5BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBBTkEKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0CiAgICAvLyBleHBpcmF0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5RXhwaXJhdGlvbiB9KQogICAgYnl0ZWMgNyAvLyAiZXhwaXJhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VBc2FfYm9vbF90cnVlQDcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0CiAgICAvLyBleHBpcmF0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5RXhwaXJhdGlvbiB9KQogICAgYnl0ZWMgNyAvLyAiZXhwaXJhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYnogcHVyY2hhc2VBc2FfYm9vbF9mYWxzZUA4CgpwdXJjaGFzZUFzYV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpwdXJjaGFzZUFzYV9ib29sX21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTggLy8gIkVSUjpMRVhQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkxFWFAKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg2CiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOAogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg2CiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODcKICAgIC8vIGxvZ2dlZEFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODcKICAgIC8vIGxvZ2dlZEFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE1CiAgICBieXRlYyAxOSAvLyAiRVJSOlJGREEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UkZEQQoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkwCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAyCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMTcKICAgIGJ5dGVjIDIwIC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gdGhpcy5wcmljZS52YWx1ZSwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMwCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkxCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSB0aGlzLnByaWNlLnZhbHVlLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxOQogICAgYnl0ZWMgMjAgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyB0aGlzLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg2CiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4NgogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgZ2V0QW1vdW50cwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg5CiAgICAvLyBsZXQgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudHMuYWtpdGEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MAogICAgLy8gaWYgKGFtb3VudHMuYWtpdGEgPiAwKSB7CiAgICBieiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTEKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kUmVmZXJyYWxQYXltZW50CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKCnB1cmNoYXNlQXNhX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NC0yMDAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NwogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk2CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk4CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTgKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTQtMTk5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTQtMjAwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwMwogICAgLy8gaWYgKCF0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjAzCiAgICAvLyBpZiAoIXRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNgogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA2CiAgICAvLyBpZiAoYXNzZXRQcml6ZS5jcmVhdG9yLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNgogICAgLy8gaWYgKGFzc2V0UHJpemUuY3JlYXRvci5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMDctMjEzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA5CiAgICAvLyBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTAKICAgIC8vIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxMQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjExCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3LTIxMgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3LTIxMwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI4CiAgICAvLyBpZiAodGhpcy5tYXJrZXRwbGFjZS52YWx1ZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjgKICAgIC8vIGlmICh0aGlzLm1hcmtldHBsYWNlLnZhbHVlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOAogICAgLy8gaWYgKHRoaXMubWFya2V0cGxhY2UudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5LTIzNQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMxCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTMKICAgIC8vIG1hcmtldHBsYWNlID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlIH0pCiAgICBieXRlYyA5IC8vICJtYXJrZXRwbGFjZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMxCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzMKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzMwogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOS0yMzQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5LTIzNQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDkKICAgIC8vIGlmIChtYXJrZXRwbGFjZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0OQogICAgLy8gaWYgKG1hcmtldHBsYWNlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTAtMjU2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUzCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyAzCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1NAogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUwLTI1NQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUwLTI1NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxLTI3NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjczCiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjczCiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3MS0yNzUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxLTI3NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTUtMzk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTYKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTUtMzk2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NS0zOTcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNzYKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc5CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4MwogICAgLy8gW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODMKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMuc2VsbGVyLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMuc2VsbGVyIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzgtMjg2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgyCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OC0yODYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLnNlbGxlci52YWx1ZSwgYW1vdW50OiBhbW91bnRzLnNlbGxlciB9XSwKICAgIC8vICAgYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODUKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzgtMjg2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzNQoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTkKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjMKICAgIC8vIFt7IGFkZHJlc3M6IG1hcmtldHBsYWNlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICBkaWcgNQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTgtMjY2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MgogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTgtMjY2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2NQogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OC0yNjYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBtYXJrZXRwbGFjZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMgoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDIKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjUzCiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MgogICAgLy8gW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzctMjQ1CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQwCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQxCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzNy0yNDUKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICAvLyAgIGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDQKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzctMjQ1CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyOQoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNgogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjAKICAgIC8vIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICB1bmNvdmVyIDIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNS0yMjMKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTgKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTkKICAgIC8vIE1BWF9VSU5UNjQsCiAgICBpbnRjIDUgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjE1LTIyMwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICAvLyAgIGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyMgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNS0yMjMKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBjYWxsc3ViIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQKICAgIHBvcG4gMgogICAgYiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI2CgpwdXJjaGFzZUFzYV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZUFzYV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDEKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAzCiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGlzdF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCmRlbGlzdF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5zZWxsZXIudmFsdWUgPT09IGNhbGxlciwgRVJSX09OTFlfU0VMTEVSX0NBTl9ERUxJU1QpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnNlbGxlci52YWx1ZSA9PT0gY2FsbGVyLCBFUlJfT05MWV9TRUxMRVJfQ0FOX0RFTElTVCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIGJueiBkZWxpc3RfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOk9TQ0QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T1NDRAoKZGVsaXN0X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDcKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDcKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwOAogICAgLy8geGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDEyCiAgICAvLyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTUKICAgIC8vIGlmICghKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTUKICAgIC8vIGlmICghKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGlzdF9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE4CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE4CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDIyCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjMtNDI2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjUKICAgIC8vIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjUKICAgIC8vIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjMtNDI2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNwogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTctNDIwCiAgICAvLyBjb25zdCBwYXltZW50QXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjcKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX25leHQKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDExLTQxMwogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNwogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CgpkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkZWxpc3RfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDYtNDA5CiAgICAvLyBjb25zdCBhc3NldFRyYW5zZmVyID0gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI5CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE3LTQyMAogICAgLy8gY29uc3QgcGF5bWVudEFzc2V0VHJhbnNmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI5CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxMS00MTMKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyNAoKZGVsaXN0X2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMyCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOAogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMgogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGlzdF9lbHNlX2JvZHlAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMzLTQzNgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM1CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM1CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMzLTQzNgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzcKICAgIC8vIHBheW1lbnQuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDExLTQxMwogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNwogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgZGVsaXN0X2FmdGVyX2lmX2Vsc2VAMjQKCmRlbGlzdF9lbHNlX2JvZHlAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOQogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA2LTQwOQogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOQogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxMS00MTMKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRlbGlzdF9hZnRlcl9pZl9lbHNlQDI0CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy5jaGFuZ2VQcmljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNoYW5nZVByaWNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDQKICAgIC8vIGNoYW5nZVByaWNlKHByaWNlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5zZWxsZXIudmFsdWUsIEVSUl9NVVNUX0JFX1NFTExFUikKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuc2VsbGVyLnZhbHVlLCBFUlJfTVVTVF9CRV9TRUxMRVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGJueiBjaGFuZ2VQcmljZV9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TUJTTCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpNQlNMCgpjaGFuZ2VQcmljZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzAKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDYKICAgIC8vIHRoaXMucHJpY2UudmFsdWUgPSBwcmljZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0NAogICAgLy8gY2hhbmdlUHJpY2UocHJpY2U6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlQWtpdGFEQU9fYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKdXBkYXRlQWtpdGFEQU9fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbi5vcHRpbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdGluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ3CiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ4CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfRk9SQklEREVOKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IG9wdGluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpGT1JCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZPUkIKCm9wdGluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdGluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdGluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUxCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBkaWcgMQogICAgZ3R4bnMgQW1vdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgID09CiAgICBibnogb3B0aW5fYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOklQTUEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBNQQoKb3B0aW5fYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTMtNTcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1NAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzLTU3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ3CiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmdldEFtb3VudHMoYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRBbW91bnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MQogICAgLy8gcHJpdmF0ZSBnZXRBbW91bnRzKGFtb3VudDogdWludDY0KTogUm95YWx0eUFtb3VudHMgewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MgogICAgLy8gbGV0IGNyZWF0b3JBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MAogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTIgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjIKICAgIC8vIGxldCBjcmVhdG9yQW1vdW50ID0gY2FsY1BlcmNlbnQoYW1vdW50LCB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIElQQ1QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjMKICAgIC8vIGlmIChjcmVhdG9yQW1vdW50ID09PSAwICYmIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5Q3JlYXRvclJveWFsdHkgfSkKICAgIGJ5dGVjIDEyIC8vICJjcmVhdG9yX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjYzCiAgICAvLyBpZiAoY3JlYXRvckFtb3VudCA9PT0gMCAmJiB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDQKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjQKICAgIC8vIGNyZWF0b3JBbW91bnQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjcKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjcKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjkzCiAgICAvLyBjb25zdCBbbmZ0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c05GVEZlZXMpKQogICAgZHVwCiAgICBieXRlYyAxNyAvLyAibmZ0X2ZlZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY3CiAgICAvLyBjb25zdCB7IG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNaW46IG1pbiwgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1heDogbWF4IH0gPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgaW1wYWN0ID0gZ2V0VXNlckltcGFjdCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLnNlbGxlci52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY4CiAgICAvLyBjb25zdCBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuc2VsbGVyLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM2LTEzOQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIEFraXRhU29jaWFsSW1wYWN0LnByb3RvdHlwZS5nZXRVc2VySW1wYWN0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YVNvY2lhbEFwcExpc3QoYWtpdGFEQU8pLmltcGFjdCwKICAgIC8vICAgYXJnczogW2FjY291bnRdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0OQogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YVNvY2lhbEFwcExpc3QpKQogICAgc3dhcAogICAgcHVzaGJ5dGVzICJzYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNwogICAgLy8gYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhkNTc0YmIxMCAvLyBtZXRob2QgImdldFVzZXJJbXBhY3QoYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzEKICAgIC8vIGNvbnN0IG1pbkltcGFjdDogdWludDY0ID0gKGltcGFjdCA+IDEpID8gaW1wYWN0IC0gMSA6IDEKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRBbW91bnRzX3Rlcm5hcnlfZmFsc2VAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLQoKZ2V0QW1vdW50c190ZXJuYXJ5X21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzIKICAgIC8vIHJldHVybiBtYXggLSAoKChtYXggLSBtaW4pICogbWluSW1wYWN0KSAvIElNUEFDVF9ESVZJU09SKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgIC0KICAgIHVuY292ZXIgMgogICAgKgogICAgcHVzaGludCAxMDAwCiAgICAvCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJUENUCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzIKICAgIC8vIGlmIChha2l0YUFtb3VudCA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzMKICAgIC8vIGFraXRhQW1vdW50ID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc2CiAgICAvLyBsZXQgbWFya2V0cGxhY2VBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NQogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTQgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzYKICAgIC8vIGxldCBtYXJrZXRwbGFjZUFtb3VudCA9IGNhbGNQZXJjZW50KGFtb3VudCwgdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJUENUCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGlmIChtYXJrZXRwbGFjZUFtb3VudCA9PT0gMCAmJiB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NQogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTQgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGlmIChtYXJrZXRwbGFjZUFtb3VudCA9PT0gMCAmJiB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gbWFya2V0cGxhY2VBbW91bnQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAyCgpnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjgxCiAgICAvLyBjb25zdCBzZWxsZXJBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIChjcmVhdG9yQW1vdW50ICsgYWtpdGFBbW91bnQgKyAoMiAqIG1hcmtldHBsYWNlQW1vdW50KSkKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIHB1c2hpbnQgMgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgNQogICAgKgogICAgKwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjgzLTg4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBjcmVhdG9yOiBjcmVhdG9yQW1vdW50LAogICAgLy8gICBha2l0YTogYWtpdGFBbW91bnQsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBtYXJrZXRwbGFjZUFtb3VudCwKICAgIC8vICAgc2VsbGVyOiBzZWxsZXJBbW91bnQsCiAgICAvLyB9CiAgICBzd2FwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldEFtb3VudHNfdGVybmFyeV9mYWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTMxCiAgICAvLyBjb25zdCBtaW5JbXBhY3Q6IHVpbnQ2NCA9IChpbXBhY3QgPiAxKSA/IGltcGFjdCAtIDEgOiAxCiAgICBpbnRjXzEgLy8gMQogICAgYiBnZXRBbW91bnRzX3Rlcm5hcnlfbWVyZ2VAMTcKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkxCiAgICAvLyBwcml2YXRlIHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyOiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTMtOTYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vICAgYXJnczogW2J1eWVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5My05NgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbYnV5ZXJdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk3CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHByaXplQXNzZXQgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHByaXplQXNzZXQgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwMgogICAgLy8gaWYgKGJ1eWVyLmlzT3B0ZWRJbihwcml6ZUFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYnogdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA0LTEwNwogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiBidXllciwKICAgIC8vICAgeGZlckFzc2V0OiBwcml6ZUFzc2V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgp0cmFuc2ZlclB1cmNoYXNlVG9CdXllcl9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTQKICAgIC8vIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTE1CiAgICAvLyBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA5LTExNwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgcHJpemVBc3NldC5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogYnV5ZXIsIGFtb3VudDogcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB9XSwKICAgIC8vICAgcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIC8vICAgdHJ1ZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEyCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEzCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwOS0xMTcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNgogICAgLy8gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA5LTExNwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgcHJpemVBc3NldC5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogYnV5ZXIsIGFtb3VudDogcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB9XSwKICAgIC8vICAgcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIC8vICAgdHJ1ZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIHJldHN1Ygo=\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type EscrowConfig = {\n name: string,\n app: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EscrowConfig to the struct representation\n */\nexport function EscrowConfigFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('EscrowConfig', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as EscrowConfig\n}\n\nexport type FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('FunderInfo', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as FunderInfo\n}\n\n/**\n * The argument types for the Listing contract\n */\nexport type ListingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': {\n prize: bigint | number\n isPrizeBox: boolean\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n seller: string\n funder: FunderInfo\n reservedFor: string\n creatorRoyalty: bigint | number\n gateId: bigint | number\n marketplace: string\n version: string\n akitaDao: bigint | number\n akitaDaoEscrow: EscrowConfig\n }\n 'purchase(pay,address,address)void': {\n /**\n * - the payment for purchasing the asset\n */\n payment: AppMethodCallTransactionArgument\n /**\n * - the buyer of the asset\n */\n buyer: string\n marketplace: string\n }\n 'purchaseAsa(axfer,address,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n buyer: string\n marketplace: string\n }\n 'delist(address)void': {\n caller: string\n }\n 'changePrice(uint64)void': {\n price: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'optin(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': [prize: bigint | number, isPrizeBox: boolean, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, seller: string, funder: FunderInfo, reservedFor: string, creatorRoyalty: bigint | number, gateId: bigint | number, marketplace: string, version: string, akitaDao: bigint | number, akitaDaoEscrow: EscrowConfig]\n 'purchase(pay,address,address)void': [payment: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'purchaseAsa(axfer,address,address)void': [assetXfer: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'delist(address)void': [caller: string]\n 'changePrice(uint64)void': [price: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'optin(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type ListingReturns = {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': void\n 'purchase(pay,address,address)void': void\n 'purchaseAsa(axfer,address,address)void': void\n 'delist(address)void': void\n 'changePrice(uint64)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'optin(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Listing smart contract.\n */\nexport type ListingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void' | 'create', {\n argsObj: ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n argsTuple: ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n returns: ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n }>\n & Record<'purchase(pay,address,address)void' | 'purchase', {\n argsObj: ListingArgs['obj']['purchase(pay,address,address)void']\n argsTuple: ListingArgs['tuple']['purchase(pay,address,address)void']\n returns: ListingReturns['purchase(pay,address,address)void']\n }>\n & Record<'purchaseAsa(axfer,address,address)void' | 'purchaseAsa', {\n argsObj: ListingArgs['obj']['purchaseAsa(axfer,address,address)void']\n argsTuple: ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']\n returns: ListingReturns['purchaseAsa(axfer,address,address)void']\n }>\n & Record<'delist(address)void' | 'delist', {\n argsObj: ListingArgs['obj']['delist(address)void']\n argsTuple: ListingArgs['tuple']['delist(address)void']\n returns: ListingReturns['delist(address)void']\n }>\n & Record<'changePrice(uint64)void' | 'changePrice', {\n argsObj: ListingArgs['obj']['changePrice(uint64)void']\n argsTuple: ListingArgs['tuple']['changePrice(uint64)void']\n returns: ListingReturns['changePrice(uint64)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: ListingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: ListingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: ListingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: ListingArgs['obj']['opUp()void']\n argsTuple: ListingArgs['tuple']['opUp()void']\n returns: ListingReturns['opUp()void']\n }>\n & Record<'optin(pay,uint64)void' | 'optin', {\n argsObj: ListingArgs['obj']['optin(pay,uint64)void']\n argsTuple: ListingArgs['tuple']['optin(pay,uint64)void']\n returns: ListingReturns['optin(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the asset for sale: Asset | Application ( Prize Box )\n */\n prize: bigint\n /**\n * whether or not the prize is an asset or a prize box\n */\n isPrizeBox: bigint\n /**\n * the price of the asset\n */\n price: bigint\n /**\n * the asset to use for payment\n */\n paymentAsset: bigint\n /**\n * the timestamp the listing expires on, once this passes all that can be done is delist\n */\n expiration: bigint\n /**\n * the address selling the asset\n */\n seller: string\n /**\n * the address the sale is reserved for\n */\n reservedFor: string\n /**\n * the amount the creator will get for the sale\n */\n creatorRoyalty: bigint\n /**\n * the gate ID to use to check if the user is qualified to buy\n */\n gateId: bigint\n /**\n * The address of the marketplace that listed the asset to send the fee to\n \n IMPORTANT: this is a double sided marketplace fee contract\n the marketplace referred to internally in the contract\n is the listing side marketplace.\n the buyer side marketplace provides their address at\n the time of purchase\n\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the app ID for the akita DAO escrow\n */\n akitaDaoEscrow: EscrowConfig\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type ListingSignatures = keyof ListingTypes['methods']\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Listing smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Listing smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = ListingTypes['state']['global']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type ListingCreateCallParams =\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & {method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type ListingDeleteCallParams =\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase'}>\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase(pay,address,address)void'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type ListingDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: ListingCreateCallParams\n /**\n * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n deleteParams?: ListingDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Listing smart contract\n */\nexport abstract class ListingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends ListingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void':\n return ListingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prize, params.args.isPrizeBox, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.seller, params.args.funder, params.args.reservedFor, params.args.creatorRoyalty, params.args.gateId, params.args.marketplace, params.args.version, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends ListingDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'purchase':\n case 'purchase(pay,address,address)void':\n return ListingParamsFactory.delete.purchase(params)\n case 'delist':\n case 'delist(address)void':\n return ListingParamsFactory.delete.delist(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the Listing smart contract using the purchase(pay,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n purchase(params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'purchase(pay,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.buyer, params.args.marketplace],\n }\n },\n /**\n * Constructs delete ABI call params for the Listing smart contract using the delist(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delist(params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delist(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the purchaseAsa(axfer,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.buyer, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the changePrice(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'changePrice(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.price],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optin(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optin(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Listing smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class ListingFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `ListingFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new ListingClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new ListingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Listing smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: ListingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? ListingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (ListingCreateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? ListingParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ListingDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new ListingClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(ListingParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.purchase(params))\n },\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.delist(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(ListingParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using an ABI method call using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(ListingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']) }, appClient: new ListingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Listing smart contract\n */\nexport class ListingClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `ListingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Listing app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `ListingClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `ListingClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<ListingClient> {\n return new ListingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `ListingClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<ListingClient> {\n return new ListingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optin: (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optin: (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n purchase: async (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.purchase(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchase(pay,address,address)void'])}\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delist: async (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.delist(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['delist(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchaseAsa(axfer,address,address)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n changePrice: async (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.changePrice(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['changePrice(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optin: async (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.optin(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['optin(pay,uint64)void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new ListingClient(this.appClient.clone(params))\n }\n\n /**\n * Methods to access state for the current Listing app\n */\n state = {\n /**\n * Methods to access global state for the current Listing app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n prize: result.prize,\n isPrizeBox: result.isPrizeBox,\n price: result.price,\n paymentAsset: result.paymentAsset,\n expiration: result.expiration,\n seller: result.seller,\n reservedFor: result.reservedFor,\n creatorRoyalty: result.creatorRoyalty,\n gateId: result.gateID,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the prize key in global state\n */\n prize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"prize\")) as bigint | undefined },\n /**\n * Get the current value of the isPrizeBox key in global state\n */\n isPrizeBox: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"isPrizeBox\")) as bigint | undefined },\n /**\n * Get the current value of the price key in global state\n */\n price: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"price\")) as bigint | undefined },\n /**\n * Get the current value of the paymentAsset key in global state\n */\n paymentAsset: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"paymentAsset\")) as bigint | undefined },\n /**\n * Get the current value of the expiration key in global state\n */\n expiration: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"expiration\")) as bigint | undefined },\n /**\n * Get the current value of the seller key in global state\n */\n seller: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"seller\")) as string | undefined },\n /**\n * Get the current value of the reservedFor key in global state\n */\n reservedFor: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"reservedFor\")) as string | undefined },\n /**\n * Get the current value of the creatorRoyalty key in global state\n */\n creatorRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"creatorRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<EscrowConfig | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as EscrowConfig | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): ListingComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a purchaseAsa(axfer,address,address)void method call against the Listing contract\n */\n purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n return this\n },\n /**\n * Add a changePrice(uint64)void method call against the Listing contract\n */\n changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changePrice(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Listing contract\n */\n updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Listing contract\n */\n opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n /**\n * Add a optin(pay,uint64)void method call against the Listing contract\n */\n optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optin(params)))\n return this\n },\n get delete() {\n return {\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.purchase(params)))\n return this\n },\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delist(params)))\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Listing contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as ListingComposer\n }\n}\nexport type ListingComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the purchaseAsa(axfer,address,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchaseAsa(params?: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchaseAsa(axfer,address,address)void'] | undefined]>\n\n /**\n * Calls the changePrice(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n changePrice(params?: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['changePrice(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']>): ListingComposer<[...TReturns, ListingReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the optin(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optin(params?: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']>): ListingComposer<[...TReturns, ListingReturns['optin(pay,uint64)void'] | undefined]>\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchase(pay,address,address)void'] | undefined]>\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): ListingComposer<[...TReturns, ListingReturns['delist(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): ListingComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): ListingComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<ListingComposerResults<TReturns>>\n}\nexport type ListingComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { BaseSDK } from \"../base\";\nimport {\n ListingClient,\n ListingFactory,\n} from '../generated/ListingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n ChangePriceParams,\n ListingState,\n} from \"./types\";\n\n/**\n * SDK for interacting with an individual Listing contract.\n * Use this to manage listing state and change prices.\n * Note: Purchases and delisting should be done through the MarketplaceSDK.\n */\nexport class ListingSDK extends BaseSDK<ListingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: ListingFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the listing.\n */\n async state(): Promise<ListingState> {\n const state = await this.client.state.global.getAll();\n\n return {\n prize: state.prize ?? 0n,\n isPrizeBox: state.isPrizeBox as unknown as boolean ?? false,\n price: state.price ?? 0n,\n paymentAsset: state.paymentAsset ?? 0n,\n expiration: state.expiration ?? 0n,\n seller: state.seller?.toString() ?? '',\n reservedFor: state.reservedFor?.toString() ?? '',\n creatorRoyalty: state.creatorRoyalty ?? 0n,\n gateId: state.gateId ?? 0n,\n marketplace: state.marketplace?.toString() ?? '',\n marketplaceRoyalties: state.marketplaceRoyalties ?? 0n,\n };\n }\n\n /**\n * Checks if the listing has expired.\n */\n async isExpired(): Promise<boolean> {\n const listingState = await this.state();\n if (listingState.expiration === 0n) {\n return false; // No expiration set\n }\n const now = BigInt(Math.floor(Date.now() / 1000));\n return now > listingState.expiration;\n }\n\n /**\n * Checks if the listing is reserved for a specific address.\n */\n async isReserved(): Promise<boolean> {\n const listingState = await this.state();\n return listingState.reservedFor !== '' && listingState.reservedFor !== 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ';\n }\n\n // ========== Write Methods ==========\n\n /**\n * Changes the price of the listing.\n * Can only be called by the seller.\n */\n async changePrice({ sender, signer, price }: ChangePriceParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await this.client.send.changePrice({\n ...sendParams,\n args: { price },\n });\n }\n}\n\n","/**\n * ARC-65 error codes emitted by the Marketplace + Listing contracts.\n *\n * The contracts log `ERR:{code}` via `loggedAssert` / `loggedErr` before\n * failing, where `code` is one of the short alphanumeric tags in this file.\n * Keep this in sync with `akita-sc/smart_contracts/marketplace/errors.ts` —\n * the short codes are the shared wire format between contract and SDK.\n *\n * Use `translateMarketplaceError(code)` to turn a code back into a\n * human-readable message for display in a UI or log.\n */\n\nimport { makeErrorTranslator } from '../errors'\n\n/**\n * Short code → human-readable message for every error the Marketplace and\n * Listing contracts can emit. Ordered roughly the same way as the\n * contract-side file.\n */\nexport const MARKETPLACE_ERROR_MESSAGES: Record<string, string> = {\n // --- Listing validation -------------------------------------------------\n PRLO: 'Lowest price is 4 units for divisibility',\n MNOP: 'Marketplace must be opted into payment asset',\n NALS: 'Not a listing contract',\n IEXP: 'Invalid expiration',\n LEXP: 'Listing expired',\n\n // --- Payment asset ------------------------------------------------------\n PAMA: 'Payment asset must be ALGO',\n PANA: 'Payment asset must not be ALGO',\n\n // --- Access / delist ----------------------------------------------------\n OSCD: 'Only the seller can delist',\n RFDA: 'Reserved for a different address',\n MBSL: 'Must be the seller',\n\n // --- Marketplace plugin -------------------------------------------------\n NENA: 'Not enough of the asset',\n LCNM: 'Listing creator is not the marketplace',\n}\n\n/**\n * Translates a short Marketplace error code (or raw ARC-65 log entry) into a\n * human-readable message. Falls back to the common error table when the code\n * isn't domain-specific. Unknown codes pass through as-is.\n */\nexport const translateMarketplaceError = makeErrorTranslator(MARKETPLACE_ERROR_MESSAGES)\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-VSKDYRSZ.js","../src/marketplace/index.ts","../src/generated/MarketplaceClient.ts","../src/generated/ListingClient.ts","../src/marketplace/listing.ts","../src/marketplace/errors.ts"],"names":["APP_SPEC","_AppFactory","_AppClient"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-VSKDYRSZ.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport algosdk from \"algosdk\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MarketplaceClient,\n MarketplaceFactory,\n MarketplaceArgs,\n} from '../generated/MarketplaceClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport { ListingSDK } from \"./listing\";\nimport {\n ListParams,\n PurchaseParams,\n DelistParams,\n OptInParams,\n} from \"./types\";\nimport { PrizeBoxFactorySDK } from \"../prize-box\";\n\nexport * from \"./errors\";\nexport * from \"./listing\";\nexport * from \"./types\";\n\nexport type MarketplaceContractArgs = MarketplaceArgs[\"obj\"];\n\n/**\n * SDK for interacting with the Marketplace contract.\n * Use this to create listings, purchase items, and delist items.\n */\nexport class MarketplaceSDK extends BaseSDK<MarketplaceClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MarketplaceFactory, ...params }, ENV_VAR_NAMES.MARKETPLACE_APP_ID);\n }\n\n // ========== Factory/Listing Methods ==========\n\n /**\n * Creates a new listing and returns a ListingSDK instance.\n * Can list either an ASA or a PrizeBox based on the `isPrizeBox` flag.\n * @returns ListingSDK for the newly created listing\n */\n async list({\n sender,\n signer,\n isPrizeBox = false,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n ...rest\n }: ListParams): Promise<ListingSDK> {\n\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get the cost for creating a new listing, dynamically querying rewards opt-in state\n const isAlgoPayment = BigInt(paymentAsset) === 0n;\n const prizeId = isPrizeBox ? 0n : BigInt((rest as { asset: bigint | number }).asset);\n const [prizeRewardsOptInCost, paymentRewardsOptInCost] = await Promise.all([\n this.getRewardsOptInCost(prizeId),\n this.getRewardsOptInCost(BigInt(paymentAsset)),\n ]);\n const cost = this.listCost({ isPrizeBox, isAlgoPayment, prizeRewardsOptInCost, paymentRewardsOptInCost });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n let appId: bigint | undefined;\n\n if (isPrizeBox) {\n const { prizeBoxId } = rest as Extract<ListParams, { isPrizeBox: true }>;\n\n const prizeBoxSDK = new PrizeBoxFactorySDK({ algorand: this.algorand, factoryParams: {}}).get({ appId: BigInt(prizeBoxId) })\n const prizeBoxTransferTxn = (await prizeBoxSDK.client.createTransaction.transfer({\n sender,\n signer,\n args: {\n newOwner: this.client.appAddress.toString()\n }\n })).transactions[0];\n\n ({ return: appId } = await this.client.send.listPrizeBox({\n ...sendParams,\n args: {\n prizeBoxTransferTxn,\n payment,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n },\n }));\n } else {\n const { asset, amount, name, proof } = rest as Exclude<ListParams, { isPrizeBox: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n ({ return: appId } = await this.client.send.list({\n ...sendParams,\n args: {\n payment,\n assetXfer,\n price,\n paymentAsset,\n expiration,\n reservedFor,\n gateId,\n marketplace,\n name,\n proof,\n },\n }));\n }\n\n if (appId === undefined) {\n throw new Error('Failed to create new listing');\n }\n\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: sendParams.sender,\n defaultSigner: sendParams.signer,\n },\n });\n }\n\n /**\n * Gets a ListingSDK instance for an existing listing.\n * @param appId - The app ID of the listing\n * @returns ListingSDK for the specified listing\n */\n getListing({ appId }: { appId: bigint }): ListingSDK {\n return new ListingSDK({\n algorand: this.algorand,\n factoryParams: {\n appId,\n defaultSender: this.sendParams.sender,\n defaultSigner: this.sendParams.signer,\n },\n });\n }\n\n /**\n * Checks if the rewards app is already opted into the given asset.\n * Returns 0n if opted in (no cost needed), 100_000n if not.\n */\n private async getRewardsOptInCost(assetId: bigint | number): Promise<bigint> {\n const asset = BigInt(assetId);\n if (asset === 0n) return 0n;\n\n try {\n const akitaDaoAppId = await this.client.state.global.akitaDao();\n if (!akitaDaoAppId) return 100_000n;\n\n const algod = this.algorand.client.algod;\n const daoApp = await algod.applicationById(akitaDaoAppId);\n const globalState = daoApp.params.globalState;\n if (!globalState) return 100_000n;\n\n // Find the 'aal' (akitaAppList) key in AkitaDAO global state\n const aalKey = new TextEncoder().encode('aal');\n const aalEntry = globalState.find(\n (kv: { key: Uint8Array; value: { type: number; bytes: Uint8Array } }) =>\n kv.key.length === aalKey.length && kv.key.every((b: number, i: number) => b === aalKey[i])\n );\n if (!aalEntry || aalEntry.value.type !== 1) return 100_000n;\n\n // Extract rewards app ID (2nd uint64 in ABI-encoded AkitaAppList, bytes 8-15)\n const aalBytes = aalEntry.value.bytes;\n if (aalBytes.length < 16) return 100_000n;\n const view = new DataView(aalBytes.buffer, aalBytes.byteOffset, aalBytes.byteLength);\n const rewardsAppId = view.getBigUint64(8);\n if (rewardsAppId === 0n) return 100_000n;\n\n // Check if rewards app address is already opted into the asset\n const rewardsAddress = algosdk.getApplicationAddress(rewardsAppId).toString();\n const response = await algod.accountAssetInformation(rewardsAddress, asset);\n return response.assetHolding ? 0n : 100_000n;\n } catch {\n // If any lookup fails (e.g. 404 not opted in), assume cost is needed\n return 100_000n;\n }\n }\n\n /**\n * Gets the cost to create a new listing.\n * @param isPrizeBox - Whether the prize is a PrizeBox\n * @param isAlgoPayment - Whether the listing will accept ALGO as payment\n * @param prizeRewardsOptInCost - Rewards app opt-in cost for the prize asset (default: 100,000, pass 0 if already opted in)\n * @param paymentRewardsOptInCost - Rewards app opt-in cost for the payment asset (default: 100,000, pass 0 if already opted in)\n */\n listCost({ isPrizeBox = false, isAlgoPayment = true, prizeRewardsOptInCost = 100_000n, paymentRewardsOptInCost = 100_000n, escrowOptInCost = 0n }: { isPrizeBox?: boolean, isAlgoPayment?: boolean, prizeRewardsOptInCost?: bigint, paymentRewardsOptInCost?: bigint, escrowOptInCost?: bigint } = {}): bigint {\n // Base cost: MIN_PROGRAM_PAGES * (1 + extraProgramPages) + (GLOBAL_STATE_KEY_UINT_COST * globalUints) + (GLOBAL_STATE_KEY_BYTES_COST * globalBytes)\n // Listing arc56 schema: 9 global uints, 6 global bytes, extraProgramPages = 1 (2 total pages)\n // Listing globals: prize, isPrizeBox, price, paymentAsset, expiration, creatorRoyalty, gateID, marketplaceRoyalties (8 uints)\n // + seller, reservedFor, marketplace, akitaDAOEscrow (4 bytes)\n // + AkitaBaseContract: akitaDAO (1 uint), version (1 bytes)\n // + ChildContract: funder (1 bytes)\n // => 9 uints, 6 bytes\n // = (100_000 * 2) + (28_500 * 9) + (50_000 * 6) = 200_000 + 256_500 + 300_000 = 756_500\n const baseCost = 756_500n;\n const minBalance = 100_000n;\n const assetOptInMinBalance = 100_000n;\n const perDisbursement = 67_000n; // MinDisbursementsMBR + UserAllocationMBR\n\n // Asset opt-in MBR for the child contract\n const optinMbr = isPrizeBox\n ? (isAlgoPayment ? 0n : assetOptInMinBalance)\n : (isAlgoPayment ? assetOptInMinBalance : assetOptInMinBalance * 2n);\n\n // Disbursement MBR\n let disbursementMbr = 0n;\n if (!isPrizeBox) {\n // 1 prize + 1 referral + (4 ASA payments if ASA)\n disbursementMbr += perDisbursement + prizeRewardsOptInCost; // prize\n if (isAlgoPayment) {\n disbursementMbr += perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr += perDisbursement * 5n + paymentRewardsOptInCost; // referral + 4 ASA payments\n }\n } else {\n // 1 referral + (3 ASA payments if ASA)\n if (isAlgoPayment) {\n disbursementMbr = perDisbursement; // referral (ALGO)\n } else {\n disbursementMbr = perDisbursement * 4n + paymentRewardsOptInCost; // referral + 3 ASA payments\n }\n }\n\n // Escrow opt-in cost for ASA payments (factory opts escrow into payment asset)\n const escrowCost = isAlgoPayment ? 0n : escrowOptInCost;\n\n return baseCost + minBalance + optinMbr + disbursementMbr + escrowCost;\n }\n\n // ========== Purchase Methods ==========\n\n /**\n * Purchases a listing.\n * Use `isAsa: true` with `paymentAsset` and `paymentAmount` for ASA payments, otherwise ALGO is used.\n * Provide `gateTxn` for gated listings.\n */\n async purchase({\n sender,\n signer,\n listingAppId,\n marketplace,\n isAsa = false,\n gateTxn,\n ...rest\n }: PurchaseParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Use opUps to handle app reference limits (royalty distribution, DAO access, etc.)\n const group = this.client.newGroup();\n\n if (isAsa) {\n const { paymentAsset, paymentAmount } = rest as Extract<PurchaseParams, { isAsa: true }>;\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(paymentAmount),\n assetId: BigInt(paymentAsset),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchaseAsa({\n ...sendParams,\n args: {\n assetXfer,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n } else {\n // Get listing to determine price for ALGO purchases\n const listing = this.getListing({ appId: BigInt(listingAppId) });\n const listingState = await listing.state();\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(listingState.price),\n receiver: this.client.appAddress,\n });\n\n if (gateTxn) {\n group.gatedPurchase({\n ...sendParams,\n args: {\n payment,\n gateTxn,\n appId: listingAppId,\n marketplace,\n },\n });\n } else {\n group.purchase({\n ...sendParams,\n args: {\n payment,\n appId: listingAppId,\n marketplace,\n },\n });\n }\n }\n\n // Add opUps to increase app reference limit\n // purchase + payment (and possibly assetXfer) = 2-3 transactions, so we can add up to 13-14 opUps\n for (let i = 0; i < 10; i++) {\n group.opUp({ ...sendParams, args: {}, note: i > 0 ? `opUp-${i}` : undefined });\n }\n\n await group.send(sendParams);\n }\n\n // ========== OptIn Methods ==========\n\n /**\n * Opts the marketplace into an asset so listings using it as the payment\n * asset can be fulfilled. When the marketplace has a named DAO escrow\n * configured, this also eagerly opts the escrow + every revenue-split\n * escrow in via the revenue-manager plugin, so downstream list/purchase\n * calls don't have to do the rekey dance mid-group.\n *\n * Worst case touches ~10 foreign refs (DAO, wallet, plugin, main escrow,\n * N split escrows, the asset). Since a single app call only holds 8\n * foreign-ref slots, we wrap the optIn in a 2-app-call group (optIn +\n * one opUp) so the resource populator has 16 slots to distribute refs\n * across.\n */\n async optIn({ sender, signer, asset }: OptInParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.client.optInCost({ args: { asset } });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.newGroup()\n .optIn({\n ...sendParams,\n args: { payment, asset },\n maxFee: microAlgo(257_000),\n })\n .opUp({\n ...sendParams,\n args: {},\n maxFee: microAlgo(2_000),\n })\n .send({\n ...sendParams,\n coverAppCallInnerTransactionFees: true,\n populateAppCallResources: true,\n });\n }\n\n // ========== Delist Methods ==========\n\n /**\n * Removes a listing and returns the asset to the seller.\n * Can only be called by the seller.\n */\n async delist({ sender, signer, appId }: DelistParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.delist({\n ...sendParams,\n args: { appId },\n });\n }\n\n // ========== Admin Methods ==========\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDAO({ sender, signer, akitaDao }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAO(uint64)void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n\n /**\n * Updates the Akita DAO Escrow reference.\n */\n async updateAkitaDAOEscrow({ sender, signer, config }: MaybeSigner & MarketplaceContractArgs['updateAkitaDAOEscrow((string,uint64))void']): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDaoEscrow({\n ...sendParams,\n args: { config },\n });\n }\n}\n\n/**\n * Convenience function to create a new listing and return the SDK.\n * Creates a marketplace SDK, creates the listing, and returns the listing SDK.\n */\nexport async function newListing({\n factoryParams,\n algorand,\n readerAccount,\n sendParams,\n ...listParams\n}: NewContractSDKParams & ListParams): Promise<ListingSDK> {\n const marketplace = new MarketplaceSDK({ factoryParams, algorand, readerAccount, sendParams });\n return await marketplace.list(listParams);\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Marketplace\",\"structs\":{\"EscrowConfig\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"app\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"string\",\"name\":\"childVersion\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"list\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"byte[32][]\",\"name\":\"proof\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"listPrizeBox\",\"args\":[{\"type\":\"appl\",\"name\":\"prizeBoxTransferTxn\"},{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"gatedPurchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"appl\",\"name\":\"gateTxn\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"appId\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"uint64\",\"name\":\"appId\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"initBoxedContract\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"size\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"loadBoxedContract\",\"args\":[{\"type\":\"uint64\",\"name\":\"offset\"},{\"type\":\"byte[]\",\"name\":\"data\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"deleteBoxedContract\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction covering MBR for all opt-ins\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to opt into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optIn opts this contract into `asset`. When this contract has a\\nnamed escrow configured (`akitaDAOEscrow.value.name !== ''`), it\\nalso opts the escrow and every revenue-split recipient in through\\nthe revenue-manager plugin — so downstream methods (subscribe,\\nlist, etc.) can transfer to the escrow without doing the plugin-\\nrekey dance mid-group.\\n\\nPayment must cover:\\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\\n - each downstream opt-in the escrow still needs.\\n`splitOptInCount` returns 0 once the escrow is already opted in, so\\nthe charge collapses to just 1 × assetOptInMinBalance on repeat\\ncalls and the escrow branch becomes a no-op.\",\"events\":[],\"recommendations\":{}},{\"name\":\"optInCost\",\"args\":[{\"type\":\"uint64\",\"name\":\"asset\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAOEscrow\",\"args\":[{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"config\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"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\":8,\"bytes\":56},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"childContractVersion\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==\",\"desc\":\"the current version of the child contract\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"EscrowConfig\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the named DAO escrow this contract routes fees to (name + app)\"},\"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\":{\"boxedContract\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMBytes\",\"key\":\"YmM=\"}}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1052,1799],\"errorMessage\":\"Box must have value\"},{\"pc\":[471,1435,3613],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[1677],\"errorMessage\":\"ERR:BMPT\"},{\"pc\":[905,1643,3103],\"errorMessage\":\"ERR:CNST\"},{\"pc\":[2207,2543],\"errorMessage\":\"ERR:FGTE\"},{\"pc\":[2355,2713],\"errorMessage\":\"ERR:HGTE\"},{\"pc\":[3092],\"errorMessage\":\"ERR:ICOR\"},{\"pc\":[978,991,1004,1017,1030,1783,1796,2220,2368],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[3238],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[3211],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[3453],\"errorMessage\":\"ERR:IUPG\"},{\"pc\":[2557,2571,2727,2741],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[2180,2342,2516,2700,2846],\"errorMessage\":\"ERR:NALS\"},{\"pc\":[2952,2980,3136,3381,3424,3491],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[3646],\"errorMessage\":\"ERR:NESC\"},{\"pc\":[1733],\"errorMessage\":\"ERR:NPBO\"},{\"pc\":[894,1632],\"errorMessage\":\"ERR:PRLO\"},{\"pc\":[3671],\"errorMessage\":\"ERR:WESC\"},{\"pc\":[1706],\"errorMessage\":\"NAPB\"},{\"pc\":[606,1196,1217,1254,1283,1325,1489,1692,1704,1942,1962,1990,2032,2073,2170,2241,2332,2389,2506,2592,2690,2762,2836,2972,3128,3185,3312,3373,3416,3483,3735,3751,3829],\"errorMessage\":\"application exists\"},{\"pc\":[1358],\"errorMessage\":\"asset exists\"},{\"pc\":[918,1037,1082,1094,1099,1320,1480,1484,1502,1681,1828,1840,1845,2027,2064,2068,2086,2158,2190,2494,2526,2965,3121,3175,3179,3303,3307,3366,3409,3428,3476,3507,3538,3727],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[474,657,671,687,729,857,872,1438,2908,3004,3355,3393,3616],\"errorMessage\":\"invalid array length header\"},{\"pc\":[678,694,863,2915,3011,3400],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[884],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<bytes[32]>\"},{\"pc\":[3625],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowInfo>\"},{\"pc\":[826,848,1600,1622,2154,2329,2490,2687],\"errorMessage\":\"invalid number of bytes for arc4.static_array<arc4.uint8, 32>\"},{\"pc\":[706,789,802,815,837,1563,1576,1589,1611,2141,2316,2477,2674,2831,2927,2996,3161,3298,3469],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[480],\"errorMessage\":\"invalid number of bytes for bytes\"},{\"pc\":[734,3360],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig\"},{\"pc\":[1444],\"errorMessage\":\"invalid number of bytes for string\"},{\"pc\":[721,3347],\"errorMessage\":\"invalid tail pointer at index 0 of ((len+utf8[]),uint64)\"},{\"pc\":[716,3342],\"errorMessage\":\"invalid tuple encoding\"},{\"pc\":[1543,2132,2468],\"errorMessage\":\"transaction type is appl\"},{\"pc\":[779,2458,2665],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[768,1553,2122,2307,3152],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgMiA2NzAwMCA3NTY1MDAgNTAwMDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgImJjIiAiYWtpdGFfZXNjcm93IiAiRVJSOklQQVkiICJ3YWxsZXQiIDB4MTUxZjdjNzUgIkVSUjpOREFPIiAiRVJSOk5BTFMiICJmdW5kZXIiICJhYWwiICJjaGlsZF9jb250cmFjdF92ZXJzaW9uIiAiZ2F0ZV9pZCIgIkVSUjpJWEZSIiAiRVJSOkNOU1QiIDB4M2VhMTE4MzIgMHhjNTNiMzJjYyAidmVyc2lvbiIgIkVSUjpQUkxPIiBiYXNlNjQoQzRFQlF3PT0pIDB4N2I1MGVhOGMgMHhhZGY5MmFlNCAiRVJSOkZHVEUiIDB4NmExNjM5M2QgIkVSUjpIR1RFIiAweDE3MWM5Zjg4ICJwYWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOC0yNAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgTWFya2V0cGxhY2UgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUAyCgptYWluX3N3aXRjaF9jYXNlX25leHRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4LTI0CiAgICAvLyBAY29udHJhY3QoewogICAgLy8gICBzdGF0ZVRvdGFsczogewogICAgLy8gICAgIGdsb2JhbEJ5dGVzOiBGYWN0b3J5R2xvYmFsU3RhdGVNYXhCeXRlcywKICAgIC8vICAgICBnbG9iYWxVaW50czogRmFjdG9yeUdsb2JhbFN0YXRlTWF4VWludHMKICAgIC8vICAgfQogICAgLy8gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBNYXJrZXRwbGFjZSBleHRlbmRzIEZhY3RvcnlDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIxCiAgICBwdXNoYnl0ZXNzIDB4ZTJmYTllMjEgMHg4MWRjNTE2YSAweDZlOTAzNWNjIDB4NWQ3YTYxNzcgMHhkYWE5NzUxNiAweDAyY2ZiMWNmIDB4Yzk3ZGJiMmUgLy8gbWV0aG9kICJsaXN0KHBheSxheGZlcix1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCxhZGRyZXNzLHN0cmluZyxieXRlWzMyXVtdKXVpbnQ2NCIsIG1ldGhvZCAibGlzdFByaXplQm94KGFwcGwscGF5LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnYXRlZFB1cmNoYXNlKHBheSxhcHBsLHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgInB1cmNoYXNlKHBheSx1aW50NjQsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJnYXRlZFB1cmNoYXNlQXNhKGF4ZmVyLGFwcGwsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAicHVyY2hhc2VBc2EoYXhmZXIsdWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZGVsaXN0KHVpbnQ2NCl2b2lkIgogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHhhZTg0Y2JkOCAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KChzdHJpbmcsdWludDY0KSl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGxpc3QgbGlzdFByaXplQm94IGdhdGVkUHVyY2hhc2UgcHVyY2hhc2UgZ2F0ZWRQdXJjaGFzZUFzYSBwdXJjaGFzZUFzYSBkZWxpc3QgaW5pdEJveGVkQ29udHJhY3QgbG9hZEJveGVkQ29udHJhY3QgZGVsZXRlQm94ZWRDb250cmFjdCBvcHRJbiBvcHRJbkNvc3QgdXBkYXRlQWtpdGFEQU9Fc2Nyb3cgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE5CiAgICBlcnIKCm1haW5fb3BVcF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQxCiAgICAvLyBvcFVwKCk6IHZvaWQgeyB9CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTgtMjQKICAgIC8vIEBjb250cmFjdCh7CiAgICAvLyAgIHN0YXRlVG90YWxzOiB7CiAgICAvLyAgICAgZ2xvYmFsQnl0ZXM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heEJ5dGVzLAogICAgLy8gICAgIGdsb2JhbFVpbnRzOiBGYWN0b3J5R2xvYmFsU3RhdGVNYXhVaW50cwogICAgLy8gICB9CiAgICAvLyB9KQogICAgLy8gZXhwb3J0IGNsYXNzIE1hcmtldHBsYWNlIGV4dGVuZHMgRmFjdG9yeUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDgxMTUzNjI4IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxzdHJpbmcsdWludDY0LChzdHJpbmcsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB1cGRhdGUKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PclR4blNlbmRlcih3YWxsZXRJRDogdWludDY0KSAtPiBieXRlczoKb3JpZ2luT3JUeG5TZW5kZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE0OQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIG9yaWdpbk9yVHhuU2VuZGVyKHdhbGxldElEOiBBcHBsaWNhdGlvbik6IEFjY291bnQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE1MAogICAgLy8gcmV0dXJuIG9yaWdpbk9yKHdhbGxldElELCBUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNDMKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAoKb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpvcmlnaW5PckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTAKICAgIC8vIHJldHVybiBvcmlnaW5Pcih3YWxsZXRJRCwgVHhuLnNlbmRlcikKICAgIHN3YXAKICAgIHJldHN1YgoKb3JpZ2luT3JUeG5TZW5kZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjUtMTY4CiAgICAvLyBjb25zdCBbY29udHJvbGxlZEFjY291bnRCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c0NvbnRyb2xsZWRBZGRyZXNzKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NwogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICBwdXNoYnl0ZXMgImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTUwCiAgICAvLyByZXR1cm4gb3JpZ2luT3Iod2FsbGV0SUQsIFR4bi5zZW5kZXIpCiAgICBiIG9yaWdpbk9yVHhuU2VuZGVyX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6b3JpZ2luT3JANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogdWludDY0LCBhZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24sIGFkZHJlc3M6IEFjY291bnQpOiBBcHBsaWNhdGlvbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBieXRlcwogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgOAogICAgIT0KICAgIGJ6IGdldFdhbGxldElEVXNpbmdBa2l0YURBT19hZnRlcl9pZl9lbHNlQDcKCmdldFdhbGxldElEVXNpbmdBa2l0YURBT19pZl9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE5MgogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpnZXRXYWxsZXRJREA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU9fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxODIKICAgIC8vIHJldHVybiBBcHBsaWNhdGlvbihnZXRXYWxsZXRJRChlc2Nyb3dGYWN0b3J5LCBhZGRyZXNzKSkKICAgIGIgZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdhdGVDaGVjayhnYXRlVHhuOiB1aW50NjQsIGFraXRhREFPOiB1aW50NjQsIGNhbGxlcjogYnl0ZXMsIGlkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2F0ZUNoZWNrOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzEKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnYXRlQ2hlY2soZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sIGFraXRhREFPOiBBcHBsaWNhdGlvbiwgY2FsbGVyOiBBY2NvdW50LCBpZDogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMwogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM0CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzNAogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYm56IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM1CiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM1CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM2CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHg0MzkyMjY1NSAvLyBtZXRob2QgIm11c3RDaGVjayhhZGRyZXNzLHVpbnQ2NCxieXRlW11bXSl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNgogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM3CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18xIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVDaGVja19ib29sX2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM4CiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMyAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMtMjM4CiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyBnYXRlVHhuLm51bUFwcEFyZ3MgPT09IDQgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMikgPT09IGl0b2IoaWQpCiAgICBieiBnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzItMjM5CiAgICAvLyByZXR1cm4gKAogICAgLy8gICBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICAvLyAgIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vICAgZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgLy8gKQogICAgcmV0c3ViCgpnYXRlQ2hlY2tfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMyLTIzOQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gICBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICAvLyAgIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gICBnYXRlVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBHYXRlLnByb3RvdHlwZS5tdXN0Q2hlY2s+KCkgJiYKICAgIC8vICAgZ2F0ZVR4bi5hcHBBcmdzKDEpID09PSBuZXcgQWRkcmVzcyhjYWxsZXIpLmJ5dGVzICYmCiAgICAvLyAgIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnJld2FyZHNPcHRJbkNvc3QoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0OgpyZXdhcmRzT3B0SW5Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiByZXdhcmRzT3B0SW5Db3N0KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTA5CiAgICAvLyBpZiAoYXNzZXQgIT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogcmV3YXJkc09wdEluQ29zdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTExCiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiByZXdhcmRzT3B0SW5Db3N0X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTIKICAgIC8vIHJldHVybiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgcmV0c3ViCgpyZXdhcmRzT3B0SW5Db3N0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE1CiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNwbGl0T3B0SW5Db3VudChha2l0YURBTzogdWludDY0LCBlc2Nyb3c6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB1aW50NjQ6CnNwbGl0T3B0SW5Db3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gc3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgZXNjcm93OiBBY2NvdW50LCBhc3NldDogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyMgogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjQKICAgIC8vIGlmICghZXNjcm93LmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHNwbGl0T3B0SW5Db3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTAzCiAgICAvLyBjb25zdCBbc3BsaXRzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUmV2ZW51ZVNwbGl0cykpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAicmV2ZW51ZV9zcGxpdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyOAogICAgLy8gY291bnQgKz0gc3BsaXRzLmxlbmd0aAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDAgb2YgKChsZW4rdXRmOFtdKSx1aW50NjQpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6RXNjcm93Q29uZmlnCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMgogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzQKICAgIC8vIGNoaWxkQ29udHJhY3RWZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogQmFzZUZhY3RvcnlHbG9iYWxTdGF0ZUtleUNoaWxkQ29udHJhY3RWZXJzaW9uIH0pCiAgICBieXRlYyAxMCAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlID0gY2hpbGRWZXJzaW9uCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM0CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoYWtpdGFEQU9Fc2Nyb3cpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpsaXN0OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MC01MQogICAgLy8gbGlzdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgcHJpY2U6IHVpbnQ2NCwKICAgIC8vICAgcGF5bWVudEFzc2V0OiB1aW50NjQsIC8vIDAgfCBBc3NldAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxieXRlc1szMl0+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1MwogICAgLy8gbG9nZ2VkQXNzZXJ0KHByaWNlID49IDQsIEVSUl9QUklDRV9UT09fTE9XKQogICAgcHVzaGludCA0CiAgICA+PQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE3IC8vICJFUlI6UFJMTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQUkxPCgpsaXN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cywgRVJSX0NPTlRSQUNUX05PVF9TRVQpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAxMyAvLyAiRVJSOkNOU1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Q05TVAoKbGlzdF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU3LTU5CiAgICAvLyBjb25zdCBvcHRpbk1CUjogdWludDY0ID0gaXNBbGdvUGF5bWVudAogICAgLy8gICA/IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIDIKICAgIGRpZyA3CiAgICBibnogbGlzdF90ZXJuYXJ5X2ZhbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjU4CiAgICAvLyA/IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBidXJ5IDE1CgpsaXN0X3Rlcm5hcnlfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjY4CiAgICAvLyBsZXQgZGlzYnVyc2VtZW50TUJSOiB1aW50NjQgPSBkaXNidXJzZW1lbnRDb3N0KDEpICsgcmV3YXJkc09wdEluQ29zdCh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LmlkKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjgKICAgIC8vIGxldCBkaXNidXJzZW1lbnRNQlI6IHVpbnQ2NCA9IGRpc2J1cnNlbWVudENvc3QoMSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDExCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGR1cAogICAgYnVyeSAyMQogICAgY2FsbHN1YiByZXdhcmRzT3B0SW5Db3N0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2NzAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NjgKICAgIC8vIGxldCBkaXNidXJzZW1lbnRNQlI6IHVpbnQ2NCA9IGRpc2J1cnNlbWVudENvc3QoMSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQpCiAgICArCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2OQogICAgLy8gaWYgKGlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA3CiAgICBibnogbGlzdF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcwCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCgxKQogICAgZGlnIDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUwMQogICAgLy8gcmV0dXJuIChNaW5EaXNidXJzZW1lbnRzTUJSICsgVXNlckFsbG9jYXRpb25NQlIpICogY291bnQKICAgIGludGMgNCAvLyA2NzAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzAKICAgIC8vIGRpc2J1cnNlbWVudE1CUiArPSBkaXNidXJzZW1lbnRDb3N0KDEpCiAgICArCiAgICBidXJ5IDE3CgpsaXN0X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3Ni03OAogICAgLy8gY29uc3QgZXNjcm93T3B0SW5Db3N0OiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDcKICAgIGJueiBsaXN0X3Rlcm5hcnlfZmFsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjc3CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0X3Rlcm5hcnlfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo4MAogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTYKICAgICsKICAgIGRpZyAxOAogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODItODQKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICogKDEgKyBsaXN0aW5nLmV4dHJhUHJvZ3JhbVBhZ2VzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgaW50YyA1IC8vIDc1NjUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6ODItODUKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICogKDEgKyBsaXN0aW5nLmV4dHJhUHJvZ3JhbVBhZ2VzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBsaXN0aW5nLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogbGlzdGluZy5nbG9iYWxCeXRlcykgKwogICAgLy8gY2hpbGRBcHBNQlIKICAgICsKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjg5CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBsaXN0X2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWNfMyAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKbGlzdF9hZnRlcl9hc3NlcnRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0b3RhbE1CUiwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMQogICAgZ3R4bnMgQW1vdW50CiAgICBkaWcgMTMKICAgID09CiAgICBibnogbGlzdF9hZnRlcl9hc3NlcnRAMTgKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmxpc3RfYWZ0ZXJfYXNzZXJ0QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTMKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuc2VuZGVyID09PSBUeG4uc2VuZGVyLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogbGlzdF9hZnRlcl9hc3NlcnRAMjAKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmxpc3RfYWZ0ZXJfYXNzZXJ0QDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6OTQKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDIyCiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0X2FmdGVyX2Fzc2VydEAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk1CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID4gMCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSAxNQogICAgYm56IGxpc3RfYWZ0ZXJfYXNzZXJ0QDI0CiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0X2FmdGVyX2Fzc2VydEAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk3CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eSA9IHJveWFsdGllcyh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LCBuYW1lLCBwcm9vZikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjk3CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eSA9IHJveWFsdGllcyh0aGlzLmFraXRhREFPLnZhbHVlLCBhc3NldFhmZXIueGZlckFzc2V0LCBuYW1lLCBwcm9vZikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDIxCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQxOAogICAgLy8gbGV0IGNyZWF0b3JSb3lhbHR5OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjAKICAgIC8vIGlmICghKHByb29mLmxlbmd0aCA+IDApKSB7CiAgICBkdXAKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDIxCiAgICAvLyByZXR1cm4gQ3JlYXRvclJveWFsdHlEZWZhdWx0CiAgICBwdXNoaW50IDUwMDAKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyb3lhbHRpZXNANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAwCiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IGFwcHJvdmFsUHJvZ3JhbSA9IHRoaXMuYm94ZWRDb250cmFjdC5leHRyYWN0KDAsIHRoaXMuYm94ZWRDb250cmFjdC5sZW5ndGgpCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEwNgogICAgLy8gYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIGRpZyAxOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTEKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTIKICAgIC8vIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogdG90YWxNQlIgfSwKICAgIGRpZyAxNQogICAgZ3R4bnMgU2VuZGVyCiAgICBkaWcgMTcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE0CiAgICAvLyBjcmVhdG9yUm95YWx0eSwKICAgIGRpZyAyMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTcKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjExOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjExOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMTkKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjYxCiAgICAvLyBjb25zdCBsaXN0aW5nID0gY29tcGlsZUFyYzQoTGlzdGluZykKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBpbnRjXzIgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgOQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMtMTIzCiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo2MQogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBieXRlYyAxOCAvLyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHVuY292ZXIgNwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGJ5dGVjIDE5IC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCxib29sLHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsKGFkZHJlc3MsdWludDY0KSxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxzdHJpbmcsdWludDY0LChzdHJpbmcsdWludDY0KSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTA3CiAgICAvLyBmYWxzZSwKICAgIHB1c2hieXRlcyAweDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDExCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTAzLTEyMwogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICAgICAgZmFsc2UsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICBjcmVhdG9yUm95YWx0eSwKICAgIC8vICAgICAgIGdhdGVJRCwKICAgIC8vICAgICAgIG1hcmtldHBsYWNlLAogICAgLy8gICAgICAgdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbYXBwcm92YWxQcm9ncmFtXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogbGlzdGluZy5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgfSkKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMDMtMTI1CiAgICAvLyBjb25zdCBsaXN0aW5nQXBwID0gbGlzdGluZy5jYWxsCiAgICAvLyAgIC5jcmVhdGUoewogICAgLy8gICAgIGFyZ3M6IFsKICAgIC8vICAgICAgIGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyAgICAgICBmYWxzZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIGNyZWF0b3JSb3lhbHR5LAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgLy8gICAuaXR4bgogICAgLy8gICAuY3JlYXRlZEFwcAogICAgZ2l0eG4gMCBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMjgtMTMzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzAKICAgIC8vIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzMQogICAgLy8gYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIGRpZyAyMQogICAgKwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEyOC0xMzIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTI4LTEzMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzNi0xNDUKICAgIC8vIGxpc3RpbmcuY2FsbC5vcHRpbih7CiAgICAvLyAgIGFwcElkOiBsaXN0aW5nQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE0MAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQxCiAgICAvLyBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjEzOS0xNDIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxMzYtMTQ1CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAib3B0aW4ocGF5LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ4LTE1NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE1MAogICAgLy8gYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyAxNAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNDgtMTUzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTQ4LTE1NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTYKICAgIC8vIGlmICghaXNBbGdvUGF5bWVudCkgewogICAgZGlnIDcKICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTU4LTE2NwogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE2MgogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxNQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNjEtMTY0CiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNTgtMTY3CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTcwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTcwCiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0X2FmdGVyX2lmX2Vsc2VAMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE3MQogICAgLy8gdGhpcy5vcHRBa2l0YUVzY3Jvd0luQW5kU2VuZChBc3NldChwYXltZW50QXNzZXQpLCAwKQogICAgZGlnIDcKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG9wdEFraXRhRXNjcm93SW5BbmRTZW5kCiAgICBwb3AKCmxpc3RfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwLTUxCiAgICAvLyBsaXN0KAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBwcmljZTogdWludDY0LAogICAgLy8gICBwYXltZW50QXNzZXQ6IHVpbnQ2NCwgLy8gMCB8IEFzc2V0CiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgcmVzZXJ2ZWRGb3I6IEFjY291bnQsCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBwcm9vZjogUHJvb2YKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxpc3RfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDI1LTQzNQogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHlTdHJpbmcgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZpZWRSZWFkPih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgYXNzZXQuY3JlYXRvciwKICAgIC8vICAgICBuYW1lLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoaXRvYihhc3NldC5pZCkpKSwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICAxLAogICAgLy8gICAgICdyb3lhbHR5JywKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDI4CiAgICAvLyBhc3NldC5jcmVhdG9yLAogICAgZGlnIDE4CiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMAogICAgLy8gc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgc3dhcAogICAgaXRvYgogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDMyCiAgICAvLyAxLAogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGRpZyAyMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjYKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4MGNmMWI5Y2YgLy8gbWV0aG9kICJ2ZXJpZmllZFJlYWQoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQsc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzMwogICAgLy8gJ3JveWFsdHknLAogICAgcHVzaGJ5dGVzIDB4MDAwNzcyNmY3OTYxNmM3NDc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MjUtNDM1CiAgICAvLyBjb25zdCBjcmVhdG9yUm95YWx0eVN0cmluZyA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZmllZFJlYWQ+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdChha2l0YURBTykubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBhc3NldC5jcmVhdG9yLAogICAgLy8gICAgIG5hbWUsCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihpdG9iKGFzc2V0LmlkKSkpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgJ3JveWFsdHknLAogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc3RyaW5nCiAgICBleHRyYWN0IDYgMAogICAgZHVwCiAgICBidXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQzNwogICAgLy8gaWYgKEJ5dGVzKGNyZWF0b3JSb3lhbHR5U3RyaW5nKS5sZW5ndGggPiAwKSB7CiAgICBsZW4KICAgIGJ6IGxpc3RfYWZ0ZXJfaWZfZWxzZUA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MzgKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gYnRvaShCeXRlcyhjcmVhdG9yUm95YWx0eVN0cmluZykpCiAgICBkaWcgMjAKICAgIGJ0b2kKICAgIGJ1cnkgMTgKCmxpc3RfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQxCiAgICAvLyBpZiAoY3JlYXRvclJveWFsdHkgPiBDcmVhdG9yUm95YWx0eU1heGltdW1TaW5nbGUpIHsKICAgIGRpZyAxNwogICAgaW50YyA2IC8vIDUwMDAwCiAgICA+CiAgICBieiBsaXN0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cm95YWx0aWVzQDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0MgogICAgLy8gcmV0dXJuIENyZWF0b3JSb3lhbHR5TWF4aW11bVNpbmdsZQogICAgaW50YyA2IC8vIDUwMDAwCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo5NwogICAgLy8gY29uc3QgY3JlYXRvclJveWFsdHkgPSByb3lhbHRpZXModGhpcy5ha2l0YURBTy52YWx1ZSwgYXNzZXRYZmVyLnhmZXJBc3NldCwgbmFtZSwgcHJvb2YpCiAgICBiIGxpc3RfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyb3lhbHRpZXNANDMKCmxpc3RfdGVybmFyeV9mYWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjc4CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3OAogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NzgKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAqCiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUAxNAoKbGlzdF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo3MgogICAgLy8gZGlzYnVyc2VtZW50TUJSICs9IGRpc2J1cnNlbWVudENvc3QoNSkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHBheW1lbnRBc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA4CiAgICBjYWxsc3ViIHJld2FyZHNPcHRJbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgcHVzaGludCAzMzUwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjcyCiAgICAvLyBkaXNidXJzZW1lbnRNQlIgKz0gZGlzYnVyc2VtZW50Q29zdCg1KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgZGlnIDE3CiAgICArCiAgICBidXJ5IDE3CiAgICBiIGxpc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKbGlzdF90ZXJuYXJ5X2ZhbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo1OQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAyCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBidXJ5IDE1CiAgICBiIGxpc3RfdGVybmFyeV9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmxpc3RQcml6ZUJveFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cmxpc3RQcml6ZUJveDoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzgtMTg3CiAgICAvLyBsaXN0UHJpemVCb3goCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTg4CiAgICAvLyBsb2dnZWRBc3NlcnQocHJpY2UgPj0gNCwgRVJSX1BSSUNFX1RPT19MT1cpCiAgICBwdXNoaW50IDQKICAgID49CiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxNyAvLyAiRVJSOlBSTE8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UFJMTwoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE4OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAxMyAvLyAiRVJSOkNOU1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Q05TVAoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTkyCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDIwIC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5Mi0xOTMKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gcHJpemVCb3hUcmFuc2ZlclR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYnogbGlzdFByaXplQm94X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTkzCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICBkaWcgOAogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxOTItMTkzCiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KCkgJiYKICAgIC8vIHByaXplQm94VHJhbnNmZXJUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsaXN0UHJpemVCb3hfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKbGlzdFByaXplQm94X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5MS0xOTQKICAgIC8vIGxvZ2dlZEFzc2VydCgoCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oKSAmJgogICAgLy8gICBwcml6ZUJveFRyYW5zZmVyVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyApLCBFUlJfQkFEX01FVEhPRF9QUklaRV9CT1hfVFJBTlNGRVJfTkVFREVEKQogICAgYm56IGxpc3RQcml6ZUJveF9hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOkJNUFQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Qk1QVAoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgOQogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0OQogICAgLy8gYXNzZXJ0KHByaXplQm94LmNyZWF0b3IgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykucHJpemVCb3gpLmFkZHJlc3MsIEVSUl9OT1RfQV9QUklaRV9CT1gpCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgOSAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NDkKICAgIC8vIGFzc2VydChwcml6ZUJveC5jcmVhdG9yID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnByaXplQm94KS5hZGRyZXNzLCBFUlJfTk9UX0FfUFJJWkVfQk9YKQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTkFQQgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTAKICAgIC8vIGNvbnN0IFtvd25lckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHByaXplQm94LCBCeXRlcyhQcml6ZUJveEdsb2JhbFN0YXRlS2V5T3duZXIpKQogICAgcHVzaGJ5dGVzICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5NQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdldFByaXplQm94T3duZXIodGhpcy5ha2l0YURBTy52YWx1ZSwgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZCkgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX1BSSVpFX0JPWF9PV05FUikKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGxpc3RQcml6ZUJveF9hZnRlcl9hc3NlcnRAMTMKICAgIHB1c2hieXRlcyAiRVJSOk5QQk8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TlBCTwoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjE5OC0yMDAKICAgIC8vIGNvbnN0IG9wdGluTUJSOiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MTk5CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMAogICAgLy8gaWYgKGlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBibnogbGlzdFByaXplQm94X2Vsc2VfYm9keUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MDEKICAgIC8vIHJldHVybiAoTWluRGlzYnVyc2VtZW50c01CUiArIFVzZXJBbGxvY2F0aW9uTUJSKSAqIGNvdW50CiAgICBpbnRjIDQgLy8gNjcwMDAKICAgIGJ1cnkgMTQKCmxpc3RQcml6ZUJveF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE3LTIxOQogICAgLy8gY29uc3QgZXNjcm93T3B0SW5Db3N0OiB1aW50NjQgPSBpc0FsZ29QYXltZW50CiAgICAvLyAgID8gMAogICAgLy8gICA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgZGlnIDQKICAgIGJueiBsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE4CiAgICAvLyA/IDAKICAgIGludGNfMCAvLyAwCgpsaXN0UHJpemVCb3hfdGVybmFyeV9tZXJnZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIyMQogICAgLy8gY29uc3QgY2hpbGRBcHBNQlI6IHVpbnQ2NCA9IEdsb2JhbC5taW5CYWxhbmNlICsgb3B0aW5NQlIgKyBkaXNidXJzZW1lbnRNQlIgKyBlc2Nyb3dPcHRJbkNvc3QKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICBkaWcgMTMKICAgICsKICAgIGRpZyAxNQogICAgKwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjIzLTIyNQogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKiAoMSArIGxpc3RpbmcuZXh0cmFQcm9ncmFtUGFnZXMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBsaXN0aW5nLmdsb2JhbEJ5dGVzKSArCiAgICBpbnRjIDUgLy8gNzU2NTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjMtMjI2CiAgICAvLyBNSU5fUFJPR1JBTV9QQUdFUyAqICgxICsgbGlzdGluZy5leHRyYVByb2dyYW1QYWdlcykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogbGlzdGluZy5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIGxpc3RpbmcuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIGNoaWxkQXBwTUJSCiAgICArCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMjkKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA3CiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAyNAogICAgYnl0ZWNfMyAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKbGlzdFByaXplQm94X2FmdGVyX2Fzc2VydEAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0b3RhbE1CUiwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA3CiAgICBndHhucyBBbW91bnQKICAgIGRpZyAxMAogICAgPT0KICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfYXNzZXJ0QDI2CiAgICBieXRlY18zIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpsaXN0UHJpemVCb3hfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzMwogICAgLy8gY29uc3QgYXBwcm92YWxQcm9ncmFtID0gdGhpcy5ib3hlZENvbnRyYWN0LmV4dHJhY3QoMCwgdGhpcy5ib3hlZENvbnRyYWN0Lmxlbmd0aCkKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjMzCiAgICAvLyBjb25zdCBhcHByb3ZhbFByb2dyYW0gPSB0aGlzLmJveGVkQ29udHJhY3QuZXh0cmFjdCgwLCB0aGlzLmJveGVkQ29udHJhY3QubGVuZ3RoKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIzNi0yNTYKICAgIC8vIGNvbnN0IGxpc3RpbmdBcHAgPSBsaXN0aW5nLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgcHJpemVCb3hUcmFuc2ZlclR4bi5hcHBJZC5pZCwKICAgIC8vICAgICAgIHRydWUsCiAgICAvLyAgICAgICBwcmljZSwKICAgIC8vICAgICAgIHBheW1lbnRBc3NldCwKICAgIC8vICAgICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgICAgeyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgLy8gICAgICAgcmVzZXJ2ZWRGb3IsCiAgICAvLyAgICAgICAwLAogICAgLy8gICAgICAgZ2F0ZUlELAogICAgLy8gICAgICAgbWFya2V0cGxhY2UsCiAgICAvLyAgICAgICB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgICAgIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFthcHByb3ZhbFByb2dyYW1dLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBsaXN0aW5nLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM5CiAgICAvLyBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgZGlnIDExCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NAogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI0NQogICAgLy8geyBhY2NvdW50OiBwYXltZW50LnNlbmRlciwgYW1vdW50OiB0b3RhbE1CUiB9LAogICAgZGlnIDExCiAgICBndHhucyBTZW5kZXIKICAgIGRpZyAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDcKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjUwCiAgICAvLyB0aGlzLmNoaWxkQ29udHJhY3RWZXJzaW9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTAKICAgIC8vIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI1MQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNTIKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjUyCiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBFeHRyYVByb2dyYW1QYWdlcwogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDkKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtVWludAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgbGlzdGluZyA9IGNvbXBpbGVBcmM0KExpc3RpbmcpCiAgICBieXRlYyAxOCAvLyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHVuY292ZXIgNwogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBieXRlYyAxOSAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLChhZGRyZXNzLHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3Msc3RyaW5nLHVpbnQ2NCwoc3RyaW5nLHVpbnQ2NCkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNDAKICAgIC8vIHRydWUsCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA3CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1NgogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjM2LTI1OAogICAgLy8gY29uc3QgbGlzdGluZ0FwcCA9IGxpc3RpbmcuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLmlkLAogICAgLy8gICAgICAgdHJ1ZSwKICAgIC8vICAgICAgIHByaWNlLAogICAgLy8gICAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHRvdGFsTUJSIH0sCiAgICAvLyAgICAgICByZXNlcnZlZEZvciwKICAgIC8vICAgICAgIDAsCiAgICAvLyAgICAgICBnYXRlSUQsCiAgICAvLyAgICAgICBtYXJrZXRwbGFjZSwKICAgIC8vICAgICAgIHRoaXMuY2hpbGRDb250cmFjdFZlcnNpb24udmFsdWUsCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICAgICAgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW2FwcHJvdmFsUHJvZ3JhbV0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGxpc3RpbmcuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MS0yNjYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBsaXN0aW5nQXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZSArIGRpc2J1cnNlbWVudE1CUgogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI2MwogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjY0CiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgZGlnIDE3CiAgICArCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjYxLTI2NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlICsgZGlzYnVyc2VtZW50TUJSCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjEtMjY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLm1pbkJhbGFuY2UgKyBkaXNidXJzZW1lbnRNQlIKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjY5LTI3MgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiBwcml6ZUJveFRyYW5zZmVyVHhuLmFwcElkLAogICAgLy8gICBhcmdzOiBbbGlzdGluZ0FwcC5hZGRyZXNzXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzEKICAgIC8vIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNjktMjcyCiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHByaXplQm94VHJhbnNmZXJUeG4uYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtsaXN0aW5nQXBwLmFkZHJlc3NdLAogICAgLy8gfSkKICAgIGJ5dGVjIDIwIC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc0CiAgICAvLyBpZiAoIWlzQWxnb1BheW1lbnQpIHsKICAgIGRpZyA0CiAgICBieiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjc2LTI4NQogICAgLy8gbGlzdGluZy5jYWxsLm9wdGluKHsKICAgIC8vICAgYXBwSWQ6IGxpc3RpbmdBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogb3B0aW5NQlIsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgcGF5bWVudEFzc2V0LAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI4MAogICAgLy8gcmVjZWl2ZXI6IGxpc3RpbmdBcHAuYWRkcmVzcywKICAgIGRpZyAxMgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMTMKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzktMjgyCiAgICAvLyBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IG9wdGluTUJSLAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyNzYtMjg1CiAgICAvLyBsaXN0aW5nLmNhbGwub3B0aW4oewogICAgLy8gICBhcHBJZDogbGlzdGluZ0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogbGlzdGluZ0FwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBvcHRpbk1CUiwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBwYXltZW50QXNzZXQsCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJvcHRpbihwYXksdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg4CiAgICAvLyBpZiAoIXRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KHBheW1lbnRBc3NldCkpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjg5CiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKEFzc2V0KHBheW1lbnRBc3NldCksIDApCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQKICAgIHBvcAoKbGlzdFByaXplQm94X2FmdGVyX2lmX2Vsc2VAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoxNzgtMTg3CiAgICAvLyBsaXN0UHJpemVCb3goCiAgICAvLyAgIHByaXplQm94VHJhbnNmZXJUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHByaWNlOiB1aW50NjQsCiAgICAvLyAgIHBheW1lbnRBc3NldDogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIHJlc2VydmVkRm9yOiBBY2NvdW50LAogICAgLy8gICBnYXRlSUQ6IHVpbnQ2NCwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB1aW50NjQgewogICAgZGlnIDEyCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpsaXN0UHJpemVCb3hfdGVybmFyeV9mYWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxOQogICAgLy8gOiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgQXNzZXQocGF5bWVudEFzc2V0KSkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MjE5CiAgICAvLyA6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBBc3NldChwYXltZW50QXNzZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4MgogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18yIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTkKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIEFzc2V0KHBheW1lbnRBc3NldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgNwogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgICoKICAgIGIgbGlzdFByaXplQm94X3Rlcm5hcnlfbWVyZ2VAMjIKCmxpc3RQcml6ZUJveF9lbHNlX2JvZHlAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMTMKICAgIC8vIGRpc2J1cnNlbWVudE1CUiA9IGRpc2J1cnNlbWVudENvc3QoNCkgKyByZXdhcmRzT3B0SW5Db3N0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHBheW1lbnRBc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMwogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICBjYWxsc3ViIHJld2FyZHNPcHRJbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTAxCiAgICAvLyByZXR1cm4gKE1pbkRpc2J1cnNlbWVudHNNQlIgKyBVc2VyQWxsb2NhdGlvbk1CUikgKiBjb3VudAogICAgcHVzaGludCAyNjgwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjIxMwogICAgLy8gZGlzYnVyc2VtZW50TUJSID0gZGlzYnVyc2VtZW50Q29zdCg0KSArIHJld2FyZHNPcHRJbkNvc3QodGhpcy5ha2l0YURBTy52YWx1ZSwgcGF5bWVudEFzc2V0KQogICAgKwogICAgYnVyeSAxNAogICAgYiBsaXN0UHJpemVCb3hfYWZ0ZXJfaWZfZWxzZUAxOQoKbGlzdFByaXplQm94X3Rlcm5hcnlfZmFsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czoyMDAKICAgIC8vIDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGJ1cnkgMTIKICAgIGIgbGlzdFByaXplQm94X3Rlcm5hcnlfbWVyZ2VAMTYKCmxpc3RQcml6ZUJveF9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBsaXN0UHJpemVCb3hfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmdhdGVkUHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpnYXRlZFB1cmNoYXNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mjk2LTMwMQogICAgLy8gZ2F0ZWRQdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBnYXRlVHhuOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzAyCiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwMgogICAgLy8gY29uc3Qgd2FsbGV0ID0gZ2V0V2FsbGV0SURVc2luZ0FraXRhREFPKHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwMwogICAgLy8gY29uc3Qgb3JpZ2luID0gb3JpZ2luT3JUeG5TZW5kZXIod2FsbGV0KQogICAgY2FsbHN1YiBvcmlnaW5PclR4blNlbmRlcgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA1CiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogZ2F0ZWRQdXJjaGFzZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNyAvLyAiRVJSOk5BTFMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFMUwoKZ2F0ZWRQdXJjaGFzZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgZ2F0ZUlEID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KGFwcElkLCBCeXRlcyhMaXN0aW5nR2xvYmFsU3RhdGVLZXlHYXRlSUQpKVswXQogICAgZGlnIDIKICAgIGJ5dGVjIDExIC8vICJnYXRlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA3CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA3CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIG9yaWdpbiwgZ2F0ZUlEKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICBzd2FwCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGdhdGVDaGVjawogICAgYm56IGdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDIxIC8vICJFUlI6RkdURSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpGR1RFCgpnYXRlZFB1cmNoYXNlX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzA4CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgNAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmdhdGVkUHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgZHVwCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTEKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogY3JlYXRvciwgYW1vdW50IH0gPSBnZXRGdW5kZXIoYXBwSWQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxNC0zMjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE4CiAgICAvLyByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTkKICAgIC8vIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICBkaWcgOAogICAgZ3R4bnMgQW1vdW50CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzE3LTMyMAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMxNC0zMjQKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBwYXltZW50LmFtb3VudCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjEKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMTQtMzI0CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyMiAvLyBtZXRob2QgInB1cmNoYXNlKHBheSxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzI2LTMzMQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjYtMzMwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMjYtMzMxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjI5Ni0zMDEKICAgIC8vIGdhdGVkUHVyY2hhc2UoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo6TWFya2V0cGxhY2UucHVyY2hhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjMzNC0zMzgKICAgIC8vIHB1cmNoYXNlKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzM5CiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDcgLy8gIkVSUjpOQUxTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5BTFMKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDEKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAyMyAvLyAiRVJSOkhHVEUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SEdURQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDIKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjXzMgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQ1CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IGNyZWF0b3IsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDgtMzU4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MgogICAgLy8gcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICBkaWcgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzUzCiAgICAvLyBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgZGlnIDYKICAgIGd0eG5zIEFtb3VudAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM1MS0zNTQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNDgtMzU4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2UoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzU1CiAgICAvLyBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzQ4LTM1OAogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IHBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDUKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjIgLy8gbWV0aG9kICJwdXJjaGFzZShwYXksYWRkcmVzcyxhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM2MC0zNjUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwLTM2NAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzYwLTM2NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozMzQtMzM4CiAgICAvLyBwdXJjaGFzZSgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLmdhdGVkUHVyY2hhc2VBc2Fbcm91dGluZ10oKSAtPiB2b2lkOgpnYXRlZFB1cmNoYXNlQXNhOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNjgtMzczCiAgICAvLyBnYXRlZFB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgZ2F0ZVR4bjogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUeG4sCiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgbWFya2V0cGxhY2U6IEFjY291bnQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzQKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyh0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCB3YWxsZXQgPSBnZXRXYWxsZXRJRFVzaW5nQWtpdGFEQU8odGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldFdhbGxldElEVXNpbmdBa2l0YURBTwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc1CiAgICAvLyBjb25zdCBvcmlnaW4gPSBvcmlnaW5PclR4blNlbmRlcih3YWxsZXQpCiAgICBjYWxsc3ViIG9yaWdpbk9yVHhuU2VuZGVyCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzcKICAgIC8vIGxvZ2dlZEFzc2VydChhcHBJZC5jcmVhdG9yID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX05PVF9BX0xJU1RJTkcpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA3IC8vICJFUlI6TkFMUyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOQUxTCgpnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Mzc4CiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMgogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzkKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozNzkKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgb3JpZ2luLCBnYXRlSUQpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDUKICAgIHN3YXAKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZ2F0ZUNoZWNrCiAgICBibnogZ2F0ZWRQdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgMjEgLy8gIkVSUjpGR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZHVEUKCmdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODAKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1RSQU5TRkVSKQogICAgZGlnIDQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDEyIC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpnYXRlZFB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzgxCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID4gMCwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYnVyeSA3CiAgICBibnogZ2F0ZWRQdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCmdhdGVkUHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ1NQogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkaWcgMgogICAgZHVwCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODQKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czozODctMzk4CiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzkxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgZGlnIDIKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5MwogICAgLy8geGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgZGlnIDgKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyA5CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5MC0zOTQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vIH0pLAogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4Ny0zOTgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM5NQogICAgLy8gVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjM4Ny0zOTgKICAgIC8vIGxpc3RpbmcuY2FsbC5wdXJjaGFzZUFzYSh7CiAgICAvLyAgIGFwcElkLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICAgIGFzc2V0UmVjZWl2ZXI6IGFwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICAgICAgeGZlckFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LAogICAgLy8gICAgIH0pLAogICAgLy8gICAgIFR4bi5zZW5kZXIsCiAgICAvLyAgICAgbWFya2V0cGxhY2UKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAyNCAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDAyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MDAtNDAxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDAwLTQwMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6MzY4LTM3MwogICAgLy8gZ2F0ZWRQdXJjaGFzZUFzYSgKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24sCiAgICAvLyAgIG1hcmtldHBsYWNlOiBBY2NvdW50LAogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6Ok1hcmtldHBsYWNlLnB1cmNoYXNlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2VBc2E6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwNS00MDkKICAgIC8vIHB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDEwCiAgICAvLyBsb2dnZWRBc3NlcnQoYXBwSWQuY3JlYXRvciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9OT1RfQV9MSVNUSU5HKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDcgLy8gIkVSUjpOQUxTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5BTFMKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDExCiAgICAvLyBjb25zdCBnYXRlSUQgPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoYXBwSWQsIEJ5dGVzKExpc3RpbmdHbG9iYWxTdGF0ZUtleUdhdGVJRCkpWzBdCiAgICBkaWcgMQogICAgYnl0ZWMgMTEgLy8gImdhdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTIKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlSUQgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGJ6IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1CiAgICBieXRlYyAyMyAvLyAiRVJSOkhHVEUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SEdURQoKcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTMKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1RSQU5TRkVSKQogICAgZGlnIDIKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyAxMiAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKcHVyY2hhc2VBc2FfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MTQKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPiAwLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAyCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBidXJ5IDUKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZGlnIDEKICAgIGR1cAogICAgYnl0ZWMgOCAvLyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDE3CiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGdldEZ1bmRlcihhcHBJZCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDIwLTQzMQogICAgLy8gbGlzdGluZy5jYWxsLnB1cmNoYXNlQXNhKHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgICAgYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIC8vICAgICAgIGFzc2V0QW1vdW50OiBhc3NldFhmZXIuYXNzZXRBbW91bnQsCiAgICAvLyAgICAgICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgVHhuLnNlbmRlciwKICAgIC8vICAgICBtYXJrZXRwbGFjZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQyNAogICAgLy8gYXNzZXRSZWNlaXZlcjogYXBwSWQuYWRkcmVzcywKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjYKICAgIC8vIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIGRpZyA2CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjMtNDI3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogYXNzZXRYZmVyLmFzc2V0QW1vdW50LAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQsCiAgICAvLyB9KSwKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjAtNDMxCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjgKICAgIC8vIFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MjAtNDMxCiAgICAvLyBsaXN0aW5nLmNhbGwucHVyY2hhc2VBc2EoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgICBhc3NldFJlY2VpdmVyOiBhcHBJZC5hZGRyZXNzLAogICAgLy8gICAgICAgYXNzZXRBbW91bnQ6IGFzc2V0WGZlci5hc3NldEFtb3VudCwKICAgIC8vICAgICAgIHhmZXJBc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBUeG4uc2VuZGVyLAogICAgLy8gICAgIG1hcmtldHBsYWNlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJwdXJjaGFzZUFzYShheGZlcixhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMzLTQzNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDMzLTQzNAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzMy00MzUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQwNS00MDkKICAgIC8vIHB1cmNoYXNlQXNhKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uLAogICAgLy8gICBtYXJrZXRwbGFjZTogQWNjb3VudCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjpNYXJrZXRwbGFjZS5kZWxpc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxpc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0MzgKICAgIC8vIGRlbGlzdChhcHBJZDogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQzOQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfTElTVElORykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGlzdF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNyAvLyAiRVJSOk5BTFMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFMUwoKZGVsaXN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NTUKICAgIC8vIGNvbnN0IFtmdW5kZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhhcHBJZCwgQnl0ZXMoR2xvYmFsU3RhdGVLZXlGdW5kZXIpKQogICAgZHVwbiAyCiAgICBieXRlYyA4IC8vICJmdW5kZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDIKICAgIC8vIGNvbnN0IHsgYWNjb3VudDogcmVjZWl2ZXIsIGFtb3VudCB9ID0gZ2V0RnVuZGVyKGFwcElkKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDUtNDQ4CiAgICAvLyBsaXN0aW5nLmNhbGwuZGVsaXN0KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NDcKICAgIC8vIGFyZ3M6IFtUeG4uc2VuZGVyXSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9tYXJrZXRwbGFjZS5hbGdvLnRzOjQ0NS00NDgKICAgIC8vIGxpc3RpbmcuY2FsbC5kZWxpc3QoewogICAgLy8gICBhcHBJZCwKICAgIC8vICAgYXJnczogW1R4bi5zZW5kZXJdLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2OGU4NjM0MyAvLyBtZXRob2QgImRlbGlzdChhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTAtNDUyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbWFya2V0cGxhY2UuYWxnby50czo0NTAtNDUxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgYW1vdW50LCByZWNlaXZlciB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDUwLTQ1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL21hcmtldHBsYWNlLmFsZ28udHM6NDM4CiAgICAvLyBkZWxpc3QoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5pbml0Qm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDIKICAgIC8vIGluaXRCb3hlZENvbnRyYWN0KHZlcnNpb246IHN0cmluZywgc2l6ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgMTAgLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDQKICAgIC8vIGlmICghdGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANAogICAgYnl0ZWMgNiAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmluaXRCb3hlZENvbnRyYWN0X2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5sb2FkQm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvYWRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU0CiAgICAvLyBjb25zdCBleHBlY3RlZFByZXZpb3VzQ2FsbHM6IHVpbnQ2NCA9IG9mZnNldCAvIDIwMzIKICAgIHB1c2hpbnQgMjAzMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTUKICAgIC8vIGNvbnN0IHR4biA9IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwSW5kZXggLSBleHBlY3RlZFByZXZpb3VzQ2FsbHMgLSAxKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIHN3YXAKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3CiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTkKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjAKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYwCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYxCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxNSAvLyBtZXRob2QgImluaXRCb3hlZENvbnRyYWN0KHN0cmluZyx1aW50NjQpdm9pZCIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MQogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjIKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNjIKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgLy8gJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICBieiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpsb2FkQm94ZWRDb250cmFjdF9ib29sX21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ni02MwogICAgLy8gbG9nZ2VkQXNzZXJ0KCgKICAgIC8vICAgdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICAgJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICAgJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIC8vICAgJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAgICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgLy8gICAmJiB0eG4uc2VuZGVyID09PSBUeG4uc2VuZGVyCiAgICAvLyApLCBFUlJfSU5WQUxJRF9DQUxMX09SREVSKQogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMQogICAgcHVzaGJ5dGVzICJFUlI6SUNPUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJQ09SCgpsb2FkQm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzEgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmJveGVkQ29udHJhY3QuZXhpc3RzLCBFUlJfQ09OVFJBQ1RfTk9UX1NFVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMTMgLy8gIkVSUjpDTlNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkNOU1QKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMSAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjIDQgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiBkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgpkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18xIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwbiAyCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTk2CiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NgogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdEluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGRpZyAzCiAgICBndHhucyBBbW91bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICArCiAgICAqCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwNAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMDUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwMi0yMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE1CiAgICAvLyBpZiAoY291bnQgPiAwICYmIGVzY3Jvdy5uYW1lICE9PSAnJykgewogICAgZHVwCiAgICBieiBvcHRJbl9hZnRlcl9pZl9lbHNlQDkKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgIT0KICAgIGJ6IG9wdEluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE2CiAgICAvLyB0aGlzLm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKGFzc2V0LCAwKQogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG9wdEFraXRhRXNjcm93SW5BbmRTZW5kCiAgICBwb3AKCm9wdEluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4MgogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhRXNjcm93IH0pCiAgICBieXRlY18yIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjIKICAgIC8vIGNvbnN0IGNvdW50ID0gc3BsaXRPcHRJbkNvdW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsIGFzc2V0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogKDEgKyBjb3VudCkKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgKwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRob3V0QWtpdGFPcHRJbi51cGRhdGVBa2l0YURBT0VzY3Jvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPRXNjcm93OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODQKICAgIC8vIHVwZGF0ZUFraXRhREFPRXNjcm93KGNvbmZpZzogRXNjcm93Q29uZmlnKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDAgb2YgKChsZW4rdXRmOFtdKSx1aW50NjQpCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkVzY3Jvd0NvbmZpZwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODUKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODUKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPRXNjcm93X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT0VzY3Jvd19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg2CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoY29uZmlnKQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NAogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coY29uZmlnOiBFc2Nyb3dDb25maWcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6VXBncmFkZWFibGVBa2l0YUJhc2VDb250cmFjdC51cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNiAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKdXBkYXRlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDkKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgYnl0ZWMgMjUgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ5CiAgICAvLyBjb25zdCB1cGRhdGVQbHVnaW4gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnVwZGF0ZQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjUwCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgPT09IHVwZGF0ZVBsdWdpbiwgRVJSX0lOVkFMSURfVVBHUkFERSkKICAgIGdsb2JhbCBDYWxsZXJBcHBsaWNhdGlvbklECiAgICA9PQogICAgYm56IHVwZGF0ZV9hZnRlcl9hc3NlcnRANQogICAgcHVzaGJ5dGVzICJFUlI6SVVQRyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVVBHCgp1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MQogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0NgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWMgNCAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA2IC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUZlZUdlbmVyYXRvckNvbnRyYWN0Lm9wdEFraXRhRXNjcm93SW5BbmRTZW5kKGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cm9wdEFraXRhRXNjcm93SW5BbmRTZW5kOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE1CiAgICAvLyBwcm90ZWN0ZWQgb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmQoYXNzZXQ6IEFzc2V0LCBhbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAyNSAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE4CiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjAKICAgIC8vIGNvbnN0IGVzY3JvdyA9IGNsb25lKHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIwCiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIxCiAgICAvLyBjb25zdCB7IGlkIH0gPSB0aGlzLmdldEVzY3Jvdyhlc2Nyb3cubmFtZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBzd2FwCiAgICBieXRlYyA0IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk3CiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgOQogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dJbmZvPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTAwCiAgICAvLyBsb2dnZWRBc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBibnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOk5FU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVTQwoKb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjIKICAgIC8vIGxvZ2dlZEFzc2VydChpZCA9PT0gZXNjcm93LmFwcC5pZCwgRVJSX1dST05HX0VTQ1JPV19GT1JfT1BFUkFUSU9OKQogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyA4CiAgICA9PQogICAgYm56IG9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2Fzc2VydEAyCiAgICBwdXNoYnl0ZXMgIkVSUjpXRVNDIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOldFU0MKCm9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI0LTEzMwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiB3YWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgICBDYWxsZXJUeXBlR2xvYmFsLAogICAgLy8gICAgIGVzY3Jvdy5uYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4NWFkZjMzOGYgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTMwCiAgICAvLyBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzMQogICAgLy8gW10KICAgIHB1c2hieXRlcyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMjQtMTMzCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHdhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJldmVudWVNYW5hZ2VyLAogICAgLy8gICAgIENhbGxlclR5cGVHbG9iYWwsCiAgICAvLyAgICAgZXNjcm93Lm5hbWUsCiAgICAvLyAgICAgWzBdLCAvLyBhbGwgdGhlIGFraXRhIGVzY3Jvd3MgaGF2ZSBtZXRob2QgcmVzdHJpY3Rpb25zIHdpdGggb3B0aW4gYmVpbmcgaW5kZXggMAogICAgLy8gICAgIFtdCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM2CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM2CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEzNwogICAgLy8gZXNjcm93LmFwcC5hZGRyZXNzLAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM1LTEzOQogICAgLy8gY29uc3Qgb3B0SW5Db3VudCA9IHNwbGl0T3B0SW5Db3VudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICBhc3NldAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQxCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIG9wdEluQ291bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTUwCiAgICAvLyByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0OS0xNTIKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNDYKICAgIC8vIHdhbGxldCwKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ4CiAgICAvLyBbYXNzZXQuaWRdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0NwogICAgLy8gdHJ1ZSwKICAgIHB1c2hieXRlcyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0My0xNTQKICAgIC8vIGl0eG5Db21wb3NlLm5leHQ8dHlwZW9mIFJldmVudWVNYW5hZ2VyUGx1Z2luU3R1Yi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJldmVudWVNYW5hZ2VyLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgd2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgW2Fzc2V0LmlkXSwKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1NgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7IGFwcElkOiB3YWxsZXQgfSkKICAgIGl0eG5fbmV4dAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg2Y2MzZjYwNiAvLyBtZXRob2QgImFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE1OAogICAgLy8gaWYgKGFtb3VudCA+IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogb3B0QWtpdGFFc2Nyb3dJbkFuZFNlbmRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTktMTY1CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0KAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIH0pCiAgICAvLyApCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2MQogICAgLy8gYXNzZXRSZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNjAtMTY0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCm9wdEFraXRhRXNjcm93SW5BbmRTZW5kX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE2OAogICAgLy8gaXR4bkNvbXBvc2Uuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNzAKICAgIC8vIHJldHVybiBtYnJBbW91bnQKICAgIHJldHN1Ygo=\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type EscrowConfig = {\n name: string,\n app: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EscrowConfig to the struct representation\n */\nexport function EscrowConfigFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('EscrowConfig', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as EscrowConfig\n}\n\n/**\n * The argument types for the Marketplace contract\n */\nexport type MarketplaceArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,string,uint64,(string,uint64))void': {\n version: string\n childVersion: string\n akitaDao: bigint | number\n akitaDaoEscrow: EscrowConfig\n }\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': {\n payment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n name: string\n proof: Uint8Array[]\n }\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': {\n prizeBoxTransferTxn: AppMethodCallTransactionArgument\n payment: AppMethodCallTransactionArgument\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n reservedFor: string\n gateId: bigint | number\n marketplace: string\n }\n 'gatedPurchase(pay,appl,uint64,address)void': {\n payment?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchase(pay,uint64,address)void': {\n payment: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': {\n assetXfer?: AppMethodCallTransactionArgument\n gateTxn: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'purchaseAsa(axfer,uint64,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n appId: bigint | number\n marketplace: string\n }\n 'delist(uint64)void': {\n appId: bigint | number\n }\n 'initBoxedContract(string,uint64)void': {\n version: string\n size: bigint | number\n }\n 'loadBoxedContract(uint64,byte[])void': {\n offset: bigint | number\n data: Uint8Array\n }\n 'deleteBoxedContract()void': Record<string, never>\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction covering MBR for all opt-ins\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to opt into\n */\n asset: bigint | number\n }\n 'optInCost(uint64)uint64': {\n asset: bigint | number\n }\n 'updateAkitaDAOEscrow((string,uint64))void': {\n config: EscrowConfig\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,string,uint64,(string,uint64))void': [version: string, childVersion: string, akitaDao: bigint | number, akitaDaoEscrow: EscrowConfig]\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': [payment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string, name: string, proof: Uint8Array[]]\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': [prizeBoxTransferTxn: AppMethodCallTransactionArgument, payment: AppMethodCallTransactionArgument, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, reservedFor: string, gateId: bigint | number, marketplace: string]\n 'gatedPurchase(pay,appl,uint64,address)void': [payment: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchase(pay,uint64,address)void': [payment: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument | undefined, gateTxn: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'purchaseAsa(axfer,uint64,address)void': [assetXfer: AppMethodCallTransactionArgument, appId: bigint | number, marketplace: string]\n 'delist(uint64)void': [appId: bigint | number]\n 'initBoxedContract(string,uint64)void': [version: string, size: bigint | number]\n 'loadBoxedContract(uint64,byte[])void': [offset: bigint | number, data: Uint8Array]\n 'deleteBoxedContract()void': []\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'optInCost(uint64)uint64': [asset: bigint | number]\n 'updateAkitaDAOEscrow((string,uint64))void': [config: EscrowConfig]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MarketplaceReturns = {\n 'create(string,string,uint64,(string,uint64))void': void\n 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64': bigint\n 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64': bigint\n 'gatedPurchase(pay,appl,uint64,address)void': void\n 'purchase(pay,uint64,address)void': void\n 'gatedPurchaseAsa(axfer,appl,uint64,address)void': void\n 'purchaseAsa(axfer,uint64,address)void': void\n 'delist(uint64)void': void\n 'initBoxedContract(string,uint64)void': void\n 'loadBoxedContract(uint64,byte[])void': void\n 'deleteBoxedContract()void': void\n 'optIn(pay,uint64)void': void\n 'optInCost(uint64)uint64': bigint\n 'updateAkitaDAOEscrow((string,uint64))void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n}\n\n/**\n * Defines the types of available calls and state of the Marketplace smart contract.\n */\nexport type MarketplaceTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,string,uint64,(string,uint64))void' | 'create', {\n argsObj: MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void']\n argsTuple: MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']\n returns: MarketplaceReturns['create(string,string,uint64,(string,uint64))void']\n }>\n & Record<'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' | 'list', {\n argsObj: MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n argsTuple: MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n returns: MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']\n }>\n & Record<'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' | 'listPrizeBox', {\n argsObj: MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n argsTuple: MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n returns: MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']\n }>\n & Record<'gatedPurchase(pay,appl,uint64,address)void' | 'gatedPurchase', {\n argsObj: MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void']\n }>\n & Record<'purchase(pay,uint64,address)void' | 'purchase', {\n argsObj: MarketplaceArgs['obj']['purchase(pay,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']\n returns: MarketplaceReturns['purchase(pay,uint64,address)void']\n }>\n & Record<'gatedPurchaseAsa(axfer,appl,uint64,address)void' | 'gatedPurchaseAsa', {\n argsObj: MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n returns: MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void']\n }>\n & Record<'purchaseAsa(axfer,uint64,address)void' | 'purchaseAsa', {\n argsObj: MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void']\n argsTuple: MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']\n returns: MarketplaceReturns['purchaseAsa(axfer,uint64,address)void']\n }>\n & Record<'delist(uint64)void' | 'delist', {\n argsObj: MarketplaceArgs['obj']['delist(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['delist(uint64)void']\n returns: MarketplaceReturns['delist(uint64)void']\n }>\n & Record<'initBoxedContract(string,uint64)void' | 'initBoxedContract', {\n argsObj: MarketplaceArgs['obj']['initBoxedContract(string,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']\n returns: MarketplaceReturns['initBoxedContract(string,uint64)void']\n }>\n & Record<'loadBoxedContract(uint64,byte[])void' | 'loadBoxedContract', {\n argsObj: MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void']\n argsTuple: MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']\n returns: MarketplaceReturns['loadBoxedContract(uint64,byte[])void']\n }>\n & Record<'deleteBoxedContract()void' | 'deleteBoxedContract', {\n argsObj: MarketplaceArgs['obj']['deleteBoxedContract()void']\n argsTuple: MarketplaceArgs['tuple']['deleteBoxedContract()void']\n returns: MarketplaceReturns['deleteBoxedContract()void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: MarketplaceArgs['obj']['optIn(pay,uint64)void']\n argsTuple: MarketplaceArgs['tuple']['optIn(pay,uint64)void']\n returns: MarketplaceReturns['optIn(pay,uint64)void']\n }>\n & Record<'optInCost(uint64)uint64' | 'optInCost', {\n argsObj: MarketplaceArgs['obj']['optInCost(uint64)uint64']\n argsTuple: MarketplaceArgs['tuple']['optInCost(uint64)uint64']\n returns: MarketplaceReturns['optInCost(uint64)uint64']\n }>\n & Record<'updateAkitaDAOEscrow((string,uint64))void' | 'updateAkitaDAOEscrow', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']\n returns: MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: MarketplaceArgs['obj']['update(string)void']\n argsTuple: MarketplaceArgs['tuple']['update(string)void']\n returns: MarketplaceReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: MarketplaceArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: MarketplaceReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: MarketplaceArgs['obj']['opUp()void']\n argsTuple: MarketplaceArgs['tuple']['opUp()void']\n returns: MarketplaceReturns['opUp()void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the current version of the child contract\n */\n childContractVersion: string\n /**\n * the named DAO escrow this contract routes fees to (name + app)\n */\n akitaDaoEscrow: EscrowConfig\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {\n boxedContract: BinaryState\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MarketplaceSignatures = keyof MarketplaceTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MarketplaceNonVoidMethodSignatures = keyof MarketplaceTypes['methods'] extends infer T ? T extends keyof MarketplaceTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Marketplace smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Marketplace smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MarketplaceSignatures> = MarketplaceTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MarketplaceTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MarketplaceTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MarketplaceCreateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & {method: 'create(string,string,uint64,(string,uint64))void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type MarketplaceUpdateCallParams =\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MarketplaceDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: MarketplaceCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: MarketplaceUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Marketplace smart contract\n */\nexport abstract class MarketplaceParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MarketplaceCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,string,uint64,(string,uint64))void':\n return MarketplaceParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(string,string,uint64,(string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends MarketplaceUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return MarketplaceParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the Marketplace smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.assetXfer, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace, params.args.name, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prizeBoxTransferTxn, params.args.payment, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.reservedFor, params.args.gateId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchase(pay,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchase(pay,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchase(pay,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchase(pay,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'gatedPurchaseAsa(axfer,appl,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.gateTxn, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the purchaseAsa(axfer,uint64,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.appId, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the delist(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'delist(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.appId],\n }\n }\n /**\n * Constructs a no op call for the initBoxedContract(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'initBoxedContract(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size],\n }\n }\n /**\n * Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'loadBoxedContract(uint64,byte[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data],\n }\n }\n /**\n * Constructs a no op call for the deleteBoxedContract()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteBoxedContract()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the optInCost(uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optInCost(uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAOEscrow((string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAOEscrow((string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.config],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Marketplace smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MarketplaceFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `MarketplaceFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new MarketplaceClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new MarketplaceClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Marketplace smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: MarketplaceDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MarketplaceParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MarketplaceCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? MarketplaceParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (MarketplaceUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MarketplaceClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(MarketplaceParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(MarketplaceParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Marketplace smart contract using an ABI method call using the create(string,string,uint64,(string,uint64))void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MarketplaceArgs['obj']['create(string,string,uint64,(string,uint64))void'] | MarketplaceArgs['tuple']['create(string,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(MarketplaceParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MarketplaceReturns['create(string,string,uint64,(string,uint64))void']) }, appClient: new MarketplaceClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Marketplace smart contract\n */\nexport class MarketplaceClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `MarketplaceClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Marketplace app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MarketplaceClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `MarketplaceClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MarketplaceClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<MarketplaceClient> {\n return new MarketplaceClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n return this.appClient.params.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n return this.appClient.createTransaction.update(MarketplaceParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n list: (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.list(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n listPrizeBox: (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.listPrizeBox(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchase: (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchase: (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchase(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n gatedPurchaseAsa: (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n delist: (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.delist(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n initBoxedContract: (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.initBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n loadBoxedContract: (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.loadBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteBoxedContract: (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optInCost: (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.optInCost(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDaoEscrow: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(MarketplaceParamsFactory.opUp(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams & { onComplete?: OnApplicationComplete.UpdateApplication }) => {\n const result = await this.appClient.send.update(MarketplaceParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n list: async (params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.list(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n listPrizeBox: async (params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.listPrizeBox(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchase(pay,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchase: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchase(pay,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchase: async (params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchase(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchase(pay,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `gatedPurchaseAsa(axfer,appl,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n gatedPurchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.gatedPurchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `purchaseAsa(axfer,uint64,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `delist(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n delist: async (params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.delist(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['delist(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `initBoxedContract(string,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n initBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.initBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['initBoxedContract(string,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n loadBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.loadBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['loadBoxedContract(uint64,byte[])void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `deleteBoxedContract()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteBoxedContract: async (params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.deleteBoxedContract(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['deleteBoxedContract()void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optInCost: async (params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['optInCost(uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDaoEscrow: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDaoEscrow(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Marketplace smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | MarketplaceReturns['opUp()void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new MarketplaceClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Marketplace smart contract using the `optInCost(uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>) {\n const result = await this.appClient.send.call(MarketplaceParamsFactory.optInCost(params))\n return result.return as unknown as MarketplaceReturns['optInCost(uint64)uint64']\n }\n\n /**\n * Methods to access state for the current Marketplace app\n */\n state = {\n /**\n * Methods to access global state for the current Marketplace app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n childContractVersion: result.childContractVersion,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the childContractVersion key in global state\n */\n childContractVersion: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"childContractVersion\")) as string | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<EscrowConfig | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as EscrowConfig | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Marketplace app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n boxedContract: new BinaryStateValue(result.boxedContract),\n }\n },\n /**\n * Get the current value of the boxedContract key in box state\n */\n boxedContract: async (): Promise<BinaryState> => { return new BinaryStateValue((await this.appClient.state.box.getValue(\"boxedContract\")) as Uint8Array | undefined) },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): MarketplaceComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 method call against the Marketplace contract\n */\n list(params: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.list(params)))\n return this\n },\n /**\n * Add a listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 method call against the Marketplace contract\n */\n listPrizeBox(params: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.listPrizeBox(params)))\n return this\n },\n /**\n * Add a gatedPurchase(pay,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchase(params: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchase(params)))\n return this\n },\n /**\n * Add a purchase(pay,uint64,address)void method call against the Marketplace contract\n */\n purchase(params: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchase(params)))\n return this\n },\n /**\n * Add a gatedPurchaseAsa(axfer,appl,uint64,address)void method call against the Marketplace contract\n */\n gatedPurchaseAsa(params: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedPurchaseAsa(params)))\n return this\n },\n /**\n * Add a purchaseAsa(axfer,uint64,address)void method call against the Marketplace contract\n */\n purchaseAsa(params: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n return this\n },\n /**\n * Add a delist(uint64)void method call against the Marketplace contract\n */\n delist(params: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.delist(params)))\n return this\n },\n /**\n * Add a initBoxedContract(string,uint64)void method call against the Marketplace contract\n */\n initBoxedContract(params: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)))\n return this\n },\n /**\n * Add a loadBoxedContract(uint64,byte[])void method call against the Marketplace contract\n */\n loadBoxedContract(params: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)))\n return this\n },\n /**\n * Add a deleteBoxedContract()void method call against the Marketplace contract\n */\n deleteBoxedContract(params: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)))\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Marketplace contract\n */\n optIn(params: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n return this\n },\n /**\n * Add a optInCost(uint64)uint64 method call against the Marketplace contract\n */\n optInCost(params: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)))\n return this\n },\n /**\n * Add a updateAkitaDAOEscrow((string,uint64))void method call against the Marketplace contract\n */\n updateAkitaDaoEscrow(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Marketplace contract\n */\n updateAkitaDao(params: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Marketplace contract\n */\n opUp(params: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Marketplace contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as MarketplaceComposer\n }\n}\nexport type MarketplaceComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n list(params?: CallParams<MarketplaceArgs['obj']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | MarketplaceArgs['tuple']['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['list(pay,axfer,uint64,uint64,uint64,address,uint64,address,string,byte[32][])uint64'] | undefined]>\n\n /**\n * Calls the listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n listPrizeBox(params?: CallParams<MarketplaceArgs['obj']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | MarketplaceArgs['tuple']['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['listPrizeBox(appl,pay,uint64,uint64,uint64,address,uint64,address)uint64'] | undefined]>\n\n /**\n * Calls the gatedPurchase(pay,appl,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedPurchase(params?: CallParams<MarketplaceArgs['obj']['gatedPurchase(pay,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchase(pay,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchase(pay,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchase(pay,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<MarketplaceArgs['obj']['purchase(pay,uint64,address)void'] | MarketplaceArgs['tuple']['purchase(pay,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchase(pay,uint64,address)void'] | undefined]>\n\n /**\n * Calls the gatedPurchaseAsa(axfer,appl,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n gatedPurchaseAsa(params?: CallParams<MarketplaceArgs['obj']['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | MarketplaceArgs['tuple']['gatedPurchaseAsa(axfer,appl,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['gatedPurchaseAsa(axfer,appl,uint64,address)void'] | undefined]>\n\n /**\n * Calls the purchaseAsa(axfer,uint64,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchaseAsa(params?: CallParams<MarketplaceArgs['obj']['purchaseAsa(axfer,uint64,address)void'] | MarketplaceArgs['tuple']['purchaseAsa(axfer,uint64,address)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['purchaseAsa(axfer,uint64,address)void'] | undefined]>\n\n /**\n * Calls the delist(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<MarketplaceArgs['obj']['delist(uint64)void'] | MarketplaceArgs['tuple']['delist(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['delist(uint64)void'] | undefined]>\n\n /**\n * Calls the initBoxedContract(string,uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n initBoxedContract(params?: CallParams<MarketplaceArgs['obj']['initBoxedContract(string,uint64)void'] | MarketplaceArgs['tuple']['initBoxedContract(string,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['initBoxedContract(string,uint64)void'] | undefined]>\n\n /**\n * Calls the loadBoxedContract(uint64,byte[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n loadBoxedContract(params?: CallParams<MarketplaceArgs['obj']['loadBoxedContract(uint64,byte[])void'] | MarketplaceArgs['tuple']['loadBoxedContract(uint64,byte[])void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['loadBoxedContract(uint64,byte[])void'] | undefined]>\n\n /**\n * Calls the deleteBoxedContract()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteBoxedContract(params?: CallParams<MarketplaceArgs['obj']['deleteBoxedContract()void'] | MarketplaceArgs['tuple']['deleteBoxedContract()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['deleteBoxedContract()void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optIn opts this contract into `asset`. When this contract has a\n named escrow configured (`akitaDAOEscrow.value.name !== ''`), it\n also opts the escrow and every revenue-split recipient in through\n the revenue-manager plugin — so downstream methods (subscribe,\n list, etc.) can transfer to the escrow without doing the plugin-\n rekey dance mid-group.\n \n Payment must cover:\n - this contract's own opt-in (1 × assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n `splitOptInCount` returns 0 once the escrow is already opted in, so\n the charge collapses to just 1 × assetOptInMinBalance on repeat\n calls and the escrow branch becomes a no-op.\n\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<MarketplaceArgs['obj']['optIn(pay,uint64)void'] | MarketplaceArgs['tuple']['optIn(pay,uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the optInCost(uint64)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optInCost(params?: CallParams<MarketplaceArgs['obj']['optInCost(uint64)uint64'] | MarketplaceArgs['tuple']['optInCost(uint64)uint64']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['optInCost(uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAOEscrow((string,uint64))void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDaoEscrow(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAOEscrow((string,uint64))void'] | MarketplaceArgs['tuple']['updateAkitaDAOEscrow((string,uint64))void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAOEscrow((string,uint64))void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<MarketplaceArgs['obj']['updateAkitaDAO(uint64)void'] | MarketplaceArgs['tuple']['updateAkitaDAO(uint64)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<MarketplaceArgs['obj']['opUp()void'] | MarketplaceArgs['tuple']['opUp()void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['opUp()void'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the Marketplace smart contract using the update(string)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<MarketplaceArgs['obj']['update(string)void'] | MarketplaceArgs['tuple']['update(string)void']>): MarketplaceComposer<[...TReturns, MarketplaceReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Marketplace smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): MarketplaceComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): MarketplaceComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MarketplaceComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MarketplaceComposerResults<TReturns>>\n}\nexport type MarketplaceComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Listing\",\"structs\":{\"EscrowConfig\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"app\",\"type\":\"uint64\"}],\"FunderInfo\":[{\"name\":\"account\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"uint64\",\"name\":\"prize\"},{\"type\":\"bool\",\"name\":\"isPrizeBox\"},{\"type\":\"uint64\",\"name\":\"price\"},{\"type\":\"uint64\",\"name\":\"paymentAsset\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"address\",\"name\":\"seller\"},{\"type\":\"(address,uint64)\",\"struct\":\"FunderInfo\",\"name\":\"funder\"},{\"type\":\"address\",\"name\":\"reservedFor\"},{\"type\":\"uint64\",\"name\":\"creatorRoyalty\"},{\"type\":\"uint64\",\"name\":\"gateID\"},{\"type\":\"address\",\"name\":\"marketplace\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"},{\"type\":\"(string,uint64)\",\"struct\":\"EscrowConfig\",\"name\":\"akitaDAOEscrow\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"desc\":\"create the listing application\",\"events\":[],\"recommendations\":{}},{\"name\":\"purchase\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"- the payment for purchasing the asset\"},{\"type\":\"address\",\"name\":\"buyer\",\"desc\":\"- the buyer of the asset\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"purchaseAsa\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"address\",\"name\":\"buyer\"},{\"type\":\"address\",\"name\":\"marketplace\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"delist\",\"args\":[{\"type\":\"address\",\"name\":\"caller\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"DeleteApplication\"]},\"readonly\":false,\"desc\":\"Deletes the app and returns the asset/mbr to the seller\",\"events\":[],\"recommendations\":{}},{\"name\":\"changePrice\",\"args\":[{\"type\":\"uint64\",\"name\":\"price\"}],\"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\":{}},{\"name\":\"optin\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":9,\"bytes\":6},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"prize\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpemU=\",\"desc\":\"the asset for sale: Asset | Application ( Prize Box )\"},\"isPrizeBox\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"aXNfcHJpemVfYm94\",\"desc\":\"whether or not the prize is an asset or a prize box\"},\"price\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cHJpY2U=\",\"desc\":\"the price of the asset\"},\"paymentAsset\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"cGF5bWVudF9hc3NldA==\",\"desc\":\"the asset to use for payment\"},\"expiration\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZXhwaXJhdGlvbg==\",\"desc\":\"the timestamp the listing expires on, once this passes all that can be done is delist\"},\"seller\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"c2VsbGVy\",\"desc\":\"the address selling the asset\"},\"reservedFor\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"cmVzZXJ2ZWRfZm9y\",\"desc\":\"the address the sale is reserved for\"},\"creatorRoyalty\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Y3JlYXRvcl9yb3lhbHR5\",\"desc\":\"the amount the creator will get for the sale\"},\"gateID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"Z2F0ZV9pZA==\",\"desc\":\"the gate ID to use to check if the user is qualified to buy\"},\"marketplace\":{\"keyType\":\"AVMString\",\"valueType\":\"address\",\"key\":\"bWFya2V0cGxhY2U=\",\"desc\":\"The address of the marketplace that listed the asset to send the fee to\\n\\nIMPORTANT: this is a double sided marketplace fee contract\\nthe marketplace referred to internally in the contract\\nis the listing side marketplace.\\nthe buyer side marketplace provides their address at\\nthe time of purchase\"},\"marketplaceRoyalties\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"bWFya2V0cGxhY2Vfcm95YWx0aWVz\",\"desc\":\"the amount the marketplaces will get for the sale\"},\"akitaDAOEscrow\":{\"keyType\":\"AVMString\",\"valueType\":\"EscrowConfig\",\"key\":\"YWtpdGFfZXNjcm93\",\"desc\":\"the app ID for the akita DAO escrow\"},\"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\"},\"funder\":{\"keyType\":\"AVMString\",\"valueType\":\"FunderInfo\",\"key\":\"ZnVuZGVy\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[471,629,758,2757],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[2581],\"errorMessage\":\"ERR:FORB\"},{\"pc\":[1156],\"errorMessage\":\"ERR:IEXP\"},{\"pc\":[1372,1386,1403],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[2625],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[2603],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[1736,1753],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[1332,1696],\"errorMessage\":\"ERR:LEXP\"},{\"pc\":[1109,1286,1650,2219],\"errorMessage\":\"ERR:MBFF\"},{\"pc\":[2485],\"errorMessage\":\"ERR:MBSL\"},{\"pc\":[2536],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[2241],\"errorMessage\":\"ERR:OSCD\"},{\"pc\":[1305],\"errorMessage\":\"ERR:PAMA\"},{\"pc\":[1669],\"errorMessage\":\"ERR:PANA\"},{\"pc\":[1358,1722],\"errorMessage\":\"ERR:RFDA\"},{\"pc\":[837,2663,2794,2824],\"errorMessage\":\"IPCT\"},{\"pc\":[365],\"errorMessage\":\"NCCA\"},{\"pc\":[2976,2992],\"errorMessage\":\"account opted into asset\"},{\"pc\":[406,494,515,528,539,656,1449,1802,2520],\"errorMessage\":\"application exists\"},{\"pc\":[1557,1577,1838,1853,2156],\"errorMessage\":\"asset exists\"},{\"pc\":[1228,1290,1310,1318,1337,1348,1395,1413,1429,1443,1471,1502,1515,1544,1589,1654,1674,1682,1701,1712,1745,1763,1779,1783,1796,1806,1824,1835,1842,1861,1879,1883,1896,1905,1922,1942,1960,1964,1976,1980,2009,2013,2017,2056,2060,2099,2103,2108,2147,2151,2223,2248,2255,2263,2270,2277,2282,2290,2294,2381,2389,2393,2469,2507,2658,2678,2693,2711,2819,2841,2902,2910,2937,2966],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[382,761,1052,1095],\"errorMessage\":\"invalid array length header\"},{\"pc\":[963],\"errorMessage\":\"invalid number of bytes for arc4.bool\"},{\"pc\":[1060],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[1001,1019,1046,1265,1274,1629,1638,2207],\"errorMessage\":\"invalid number of bytes for arc4.static_array<arc4.uint8, 32>\"},{\"pc\":[954,973,982,991,1027,1036,1071,2462,2500,2560],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[768],\"errorMessage\":\"invalid number of bytes for bytes\"},{\"pc\":[1100],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig\"},{\"pc\":[1010],\"errorMessage\":\"invalid number of bytes for smart_contracts/utils/types/mbr.ts::FunderInfo\"},{\"pc\":[476,634,2762],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[1087],\"errorMessage\":\"invalid tail pointer at index 0 of ((len+utf8[]),uint64)\"},{\"pc\":[1082],\"errorMessage\":\"invalid tuple encoding\"},{\"pc\":[1620],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[1256,2552],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIGJ5dGVjYmxvY2sgInBheW1lbnRfYXNzZXQiICJzZWxsZXIiICJha2l0YV9kYW8iICJwcml6ZSIgMHgwMDAxICJpc19wcml6ZV9ib3giICJwcmljZSIgImV4cGlyYXRpb24iICJyZXNlcnZlZF9mb3IiICJtYXJrZXRwbGFjZSIgMHgxNTFmN2M3NSAiRVJSOk1CRkYiICJjcmVhdG9yX3JveWFsdHkiICJha2l0YV9lc2Nyb3ciICJtYXJrZXRwbGFjZV9yb3lhbHRpZXMiICJFUlI6SVBBWSIgMHhhZGY5MmFlNCAibmZ0X2ZlZXMiICJFUlI6TEVYUCIgIkVSUjpSRkRBIiAiRVJSOklYRlIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3LTIxCiAgICAvLyBleHBvcnQgY2xhc3MgTGlzdGluZyBleHRlbmRzIGNsYXNzZXMoCiAgICAvLyAgIEFraXRhQmFzZUNvbnRyYWN0LAogICAgLy8gICBDb250cmFjdFdpdGhDcmVhdG9yT25seU9wdEluLAogICAgLy8gICBDaGlsZENvbnRyYWN0CiAgICAvLyApIHsKICAgIHB1c2hieXRlc3MgMHg2YTE2MzkzZCAweDY4ZTg2MzQzIC8vIG1ldGhvZCAicHVyY2hhc2UocGF5LGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJkZWxpc3QoYWRkcmVzcyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9wdXJjaGFzZV9yb3V0ZUA0IG1haW5fZGVsaXN0X3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNy0yMQogICAgLy8gZXhwb3J0IGNsYXNzIExpc3RpbmcgZXh0ZW5kcyBjbGFzc2VzKAogICAgLy8gICBBa2l0YUJhc2VDb250cmFjdCwKICAgIC8vICAgQ29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbiwKICAgIC8vICAgQ2hpbGRDb250cmFjdAogICAgLy8gKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDE0CiAgICBwdXNoYnl0ZXNzIDB4MTcxYzlmODggMHgxOTM5NmM0YSAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHgzZWExMTgzMiAvLyBtZXRob2QgInB1cmNoYXNlQXNhKGF4ZmVyLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjaGFuZ2VQcmljZSh1aW50NjQpdm9pZCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiLCBtZXRob2QgIm9wdGluKHBheSx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHB1cmNoYXNlQXNhIGNoYW5nZVByaWNlIHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxMSBvcHRpbgogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTctMjEKICAgIC8vIGV4cG9ydCBjbGFzcyBMaXN0aW5nIGV4dGVuZHMgY2xhc3NlcygKICAgIC8vICAgQWtpdGFCYXNlQ29udHJhY3QsCiAgICAvLyAgIENvbnRyYWN0V2l0aENyZWF0b3JPbmx5T3B0SW4sCiAgICAvLyAgIENoaWxkQ29udHJhY3QKICAgIC8vICkgewogICAgcHVzaGJ5dGVzIDB4N2I1MGVhOGMgLy8gbWV0aG9kICJjcmVhdGUodWludDY0LGJvb2wsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcywoYWRkcmVzcyx1aW50NjQpLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHN0cmluZyx1aW50NjQsKHN0cmluZyx1aW50NjQpKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKbWFpbl9kZWxpc3Rfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBkZWxpc3QKCm1haW5fcHVyY2hhc2Vfcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQzCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBwdXJjaGFzZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoYWtpdGFEQU86IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCwgdGltZVRvVW5sb2NrOiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCwgYWxsb2NhdGlvbnM6IGJ5dGVzLCBzdW06IHVpbnQ2NCwgY2xvc2VPdXQ6IHVpbnQ2NCkgLT4gYnl0ZXMsIGJ5dGVzOgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MTgKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgYXNzZXQ6IHVpbnQ2NCwgdGltZVRvVW5sb2NrOiB1aW50NjQsIGV4cGlyYXRpb246IHVpbnQ2NCwgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10sIHN1bTogdWludDY0LCBjbG9zZU91dDogYm9vbGVhbik6IHsgaWQ6IHVpbnQ2NCwgY29zdDogdWludDY0IH0gewogICAgcHJvdG8gNyAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUxOQogICAgLy8gYXNzZXJ0KGFzc2V0ICE9PSAwIHx8IGNsb3NlT3V0ID09PSBmYWxzZSwgRVJSX0NBTk5PVF9DTE9TRV9PVVRfT0ZfQUxHT19GT1JCSURERU4pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJueiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMwoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTE5CiAgICAvLyBhc3NlcnQoYXNzZXQgIT09IDAgfHwgY2xvc2VPdXQgPT09IGZhbHNlLCBFUlJfQ0FOTk9UX0NMT1NFX09VVF9PRl9BTEdPX0ZPUkJJRERFTikKICAgIGFzc2VydCAvLyBOQ0NBCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBmcmFtZV9kaWcgLTcKICAgIHB1c2hieXRlcyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjAKICAgIC8vIGNvbnN0IHJld2FyZHNBcHAgPSBnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLnJld2FyZHMKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyMwogICAgLy8gbGV0IGNvc3Q6IHVpbnQ2NCA9IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDI1MzAwCiAgICAqCiAgICBwdXNoaW50IDQxNzAwCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI0CiAgICAvLyBpZiAoYXNzZXQgPT09IDApIHsKICAgIGZyYW1lX2RpZyAtNgogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI1LTUzNgogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyOQogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzMAogICAgLy8gYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKSArIHN1bQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTI4LTUzMQogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vIH0pLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MjUtNTM2CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpICsgc3VtCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MzIKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1MzMKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUyNS01MzYKICAgIC8vIGlkID0gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUuY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudD4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogTWluRGlzYnVyc2VtZW50c01CUiArIChVc2VyQWxsb2NhdGlvbk1CUiAqIGFsbG9jYXRpb25zLmxlbmd0aCkgKyBzdW0KICAgIC8vICAgICB9KSwKICAgIC8vICAgICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgICAgZXhwaXJhdGlvbiwKICAgIC8vICAgICBhbGxvY2F0aW9ucwogICAgLy8gICBdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4N2I3ZGM1ZmMgLy8gbWV0aG9kICJjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KHBheSx1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgMTAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzcKICAgIC8vIHJldHVybiB7IGlkLCBjb3N0IH0KICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTM4CiAgICAvLyBpZiAoIUFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MuaXNPcHRlZEluKEFzc2V0KGFzc2V0KSkpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2lmX2JvZHlAOQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU1MgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NTgKICAgIC8vIGlmIChjbG9zZU91dCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTU5CiAgICAvLyB0cmFuc2ZlclR4bi5zZXQoeyBhc3NldENsb3NlVG86IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MgfSkKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDUKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NgogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU2NS01NjgKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTY5CiAgICAvLyB0cmFuc2ZlclR4biwKICAgIGl0eG5fbmV4dAogICAgZnJhbWVfZGlnIDQKICAgIGJ6IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfbmV4dF9maWVsZEAxNwogICAgZnJhbWVfZGlnIDUKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X25leHRfZmllbGRAMTc6CiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTUyLTU1NgogICAgLy8gY29uc3QgdHJhbnNmZXJUeG4gPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogc3VtLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NjItNTc0CiAgICAvLyBpZCA9IGFiaUNhbGw8dHlwZW9mIFJld2FyZHMucHJvdG90eXBlLmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoVXNlckFsbG9jYXRpb25NQlIgKiBhbGxvY2F0aW9ucy5sZW5ndGgpCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgdHJhbnNmZXJUeG4sCiAgICAvLyAgICAgdGltZVRvVW5sb2NrLAogICAgLy8gICAgIGV4cGlyYXRpb24sCiAgICAvLyAgICAgYWxsb2NhdGlvbnMKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzAKICAgIC8vIHRpbWVUb1VubG9jaywKICAgIGZyYW1lX2RpZyAtNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NzEKICAgIC8vIGV4cGlyYXRpb24sCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTYyLTU3NAogICAgLy8gaWQgPSBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5jcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50Pih7CiAgICAvLyAgIGFwcElkOiByZXdhcmRzQXBwLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihyZXdhcmRzQXBwKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBNaW5EaXNidXJzZW1lbnRzTUJSICsgKFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoKQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIHRyYW5zZmVyVHhuLAogICAgLy8gICAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgICBleHBpcmF0aW9uLAogICAgLy8gICAgIGFsbG9jYXRpb25zCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhhZjFhMTRmMiAvLyBtZXRob2QgImNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQocGF5LGF4ZmVyLHVpbnQ2NCx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfaWZfZWxzZUAyMAoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9pZl9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjUzOQogICAgLy8gY29zdCArPSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NAogICAgLy8gcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NQogICAgLy8gYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQzLTU0NgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyB9KSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQwLTU0OQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUmV3YXJkcy5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IHJld2FyZHNBcHAsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHJld2FyZHNBcHApLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgLy8gICAgIH0pLAogICAgLy8gICAgIEFzc2V0KGFzc2V0KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0NwogICAgLy8gQXNzZXQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NDAtNTQ5CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBSZXdhcmRzLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV3YXJkc0FwcCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogQXBwbGljYXRpb24ocmV3YXJkc0FwcCkuYWRkcmVzcywKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgQXNzZXQoYXNzZXQpCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgzOTRlYWViMiAvLyBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9pZl9lbHNlQDEyCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6c2VuZFJlZmVycmFsUGF5bWVudChha2l0YURBTzogdWludDY0LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CnNlbmRSZWZlcnJhbFBheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU5MQogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNlbmRSZWZlcnJhbFBheW1lbnQoYWtpdGFEQU86IEFwcGxpY2F0aW9uLCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IFJlZmVycmFsUGF5bWVudEluZm8gewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTIKICAgIC8vIGNvbnN0IHdhbGxldCA9IGdldFdhbGxldElEVXNpbmdBa2l0YURBTyhha2l0YURBTywgVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTkKICAgIC8vIGNvbnN0IFtvdGhlckFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNPdGhlckFwcExpc3QpKQogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoYnl0ZXMgIm9hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjQKICAgIC8vIHJldHVybiBnZXRPdGhlckFwcExpc3QoYWtpdGFEQU8pLmVzY3JvdwogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTg2LTE4OQogICAgLy8gY29uc3QgZGF0YSA9IGFiaUNhbGw8dHlwZW9mIEVzY3Jvd0ZhY3RvcnkucHJvdG90eXBlLmdldD4oewogICAgLy8gICBhcHBJZDogZXNjcm93RmFjdG9yeSwKICAgIC8vICAgYXJnczogW2FkZHJlc3NdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgzYzFhNmYzMyAvLyBtZXRob2QgImdldChhZGRyZXNzKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBieXRlcwogICAgZXh0cmFjdCA2IDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTEKICAgIC8vIGlmIChCeXRlcyhkYXRhKS5sZW5ndGggPT09IDAgfHwgQnl0ZXMoZGF0YSkubGVuZ3RoICE9PSA4KSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18yIC8vIDgKICAgICE9CiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTIKCnNlbmRSZWZlcnJhbFBheW1lbnRfaWZfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTkyCiAgICAvLyByZXR1cm4gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OmdldFdhbGxldElEQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNjEKICAgIC8vIHJldHVybiByZWZlcnJlck9yKHdhbGxldElELCBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNTQKICAgIC8vIGlmICh3YWxsZXRJRC5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDMKICAgIGJueiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VAMTcKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKCnNlbmRSZWZlcnJhbFBheW1lbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjpyZWZlcnJlck9yQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1OTYKICAgIC8vIGlmIChhbW91bnQgPiAwICYmIHJlZmVycmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAxCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2OAogICAgLy8gY29uc3QgW3dhbGxldEZlZXNCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXRGZWVzKSkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGJ5dGVzICJ3YWxsZXRfZmVlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTk4CiAgICAvLyBjb25zdCB7IHJlZmVycmVyUGVyY2VudGFnZSB9ID0gZ2V0V2FsbGV0RmVlcyhha2l0YURBTykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDgKICAgIC8vIGFzc2VydChwIDw9IERJVklTT1IsIEVSUl9JTlZBTElEX1BFUkNFTlRBR0UpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSVBDVAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMDkKICAgIC8vIHJldHVybiBvcC5kaXZ3KC4uLm9wLm11bHcoYSwgcCksIERJVklTT1IpCiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIGRpdncKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwMQogICAgLy8gaWYgKHJlZmVycmFsRmVlID09PSAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MDIKICAgIC8vIHJlZmVycmFsRmVlID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwOAogICAgLy8gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA5CiAgICAvLyAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIGR1cAogICAgcHVzaGludCA2MDQ4MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjEwCiAgICAvLyBbeyBhZGRyZXNzOiByZWZlcnJlciwgYW1vdW50OiByZWZlcnJhbEZlZSB9XSwKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjA1LTYxMwogICAgLy8gY29uc3QgeyBjb3N0OiByZWZlcnJhbE1iciB9ID0gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgYWtpdGFEQU8sCiAgICAvLyAgIGFzc2V0LAogICAgLy8gICBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gICAoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCArIE9ORV9XRUVLKSwKICAgIC8vICAgW3sgYWRkcmVzczogcmVmZXJyZXIsIGFtb3VudDogcmVmZXJyYWxGZWUgfV0sCiAgICAvLyAgIHJlZmVycmFsRmVlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGRpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxMgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYwNS02MTMKICAgIC8vIGNvbnN0IHsgY29zdDogcmVmZXJyYWxNYnIgfSA9IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIGFraXRhREFPLAogICAgLy8gICBhc3NldCwKICAgIC8vICAgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vICAgKEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyBPTkVfV0VFSyksCiAgICAvLyAgIFt7IGFkZHJlc3M6IHJlZmVycmVyLCBhbW91bnQ6IHJlZmVycmFsRmVlIH1dLAogICAgLy8gICByZWZlcnJhbEZlZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIGNhbGxzdWIgY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudAogICAgcG9wCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MTUKICAgIC8vIHJldHVybiB7IGxlZnRvdmVyOiAoYW1vdW50IC0gcmVmZXJyYWxGZWUpLCByZWZlcnJhbE1iciB9CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYxOAogICAgLy8gcmV0dXJuIHsgbGVmdG92ZXI6IGFtb3VudCwgcmVmZXJyYWxNYnI6IDAgfQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxNzMtMTc2CiAgICAvLyBjb25zdCBbcmVmZXJyZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcygKICAgIC8vICAgd2FsbGV0SUQsCiAgICAvLyAgIEJ5dGVzKEFic3RyYWN0QWNjb3VudEdsb2JhbFN0YXRlS2V5c1JlZmVycmVyKQogICAgLy8gKQogICAgZnJhbWVfZGlnIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTc1CiAgICAvLyBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNSZWZlcnJlcikKICAgIHB1c2hieXRlcyAicmVmZXJyZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE3My0xNzYKICAgIC8vIGNvbnN0IFtyZWZlcnJlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKAogICAgLy8gICB3YWxsZXRJRCwKICAgIC8vICAgQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzUmVmZXJyZXIpCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTYxCiAgICAvLyByZXR1cm4gcmVmZXJyZXJPcih3YWxsZXRJRCwgR2xvYmFsLnplcm9BZGRyZXNzKQogICAgYiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6cmVmZXJyZXJPckAxOAoKc2VuZFJlZmVycmFsUGF5bWVudF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxOTUKICAgIC8vIHJldHVybiBidG9pKGRhdGEpCiAgICBmcmFtZV9kaWcgNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE4MgogICAgLy8gcmV0dXJuIEFwcGxpY2F0aW9uKGdldFdhbGxldElEKGVzY3Jvd0ZhY3RvcnksIGFkZHJlc3MpKQogICAgYiBzZW5kUmVmZXJyYWxQYXltZW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo6Z2V0V2FsbGV0SURAMTMKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvdHlwZXMvbWJyLnRzOjpGdW5kZXJJbmZvCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZHVwbiAyCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0KQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpFc2Nyb3dDb25maWcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzEwCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTIKICAgIC8vIHRoaXMucHJpemUudmFsdWUgPSBwcml6ZQogICAgZGlnIDE0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOAogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxMwogICAgLy8gdGhpcy5pc1ByaXplQm94LnZhbHVlID0gaXNQcml6ZUJveAogICAgZGlnIDEzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5wcmljZS52YWx1ZSA9IHByaWNlCiAgICBkaWcgMTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE1CiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSA9IEFzc2V0KHBheW1lbnRBc3NldCkKICAgIGRpZyAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGRpZyA5CiAgICBieiBjcmVhdGVfYm9vbF90cnVlQDUKICAgIGRpZyA5CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUA2CgpjcmVhdGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoZXhwaXJhdGlvbiA9PT0gMCB8fCBleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0lOVkFMSURfRVhQSVJBVElPTikKICAgIGJueiBjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDkKICAgIHB1c2hieXRlcyAiRVJSOklFWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SUVYUAoKY3JlYXRlX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNAogICAgLy8gZXhwaXJhdGlvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUV4cGlyYXRpb24gfSkKICAgIGJ5dGVjIDcgLy8gImV4cGlyYXRpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMxNwogICAgLy8gdGhpcy5leHBpcmF0aW9uLnZhbHVlID0gZXhwaXJhdGlvbgogICAgZGlnIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMTgKICAgIC8vIHRoaXMuc2VsbGVyLnZhbHVlID0gc2VsbGVyCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9jaGlsZC50czoxMQogICAgLy8gZnVuZGVyID0gR2xvYmFsU3RhdGU8RnVuZGVySW5mbz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5RnVuZGVyIH0pCiAgICBwdXNoYnl0ZXMgImZ1bmRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmZ1bmRlci52YWx1ZSA9IGNsb25lKGZ1bmRlcikKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOAogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIwCiAgICAvLyB0aGlzLnJlc2VydmVkRm9yLnZhbHVlID0gcmVzZXJ2ZWRGb3IKICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MAogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTIgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIxCiAgICAvLyB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID0gY3JlYXRvclJveWFsdHkKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MgogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBwdXNoYnl0ZXMgImdhdGVfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyMgogICAgLy8gdGhpcy5nYXRlSUQudmFsdWUgPSBnYXRlSUQKICAgIGRpZyA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjMKICAgIC8vIHRoaXMubWFya2V0cGxhY2UudmFsdWUgPSBtYXJrZXRwbGFjZQogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgcHVzaGJ5dGVzICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjQKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IGFraXRhREFPCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTcKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5QWtpdGFEQU9Fc2Nyb3cgfSkKICAgIGJ5dGVjIDEzIC8vICJha2l0YV9lc2Nyb3ciCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyNgogICAgLy8gdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSA9IGNsb25lKGFraXRhREFPRXNjcm93KQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyOQogICAgLy8gdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkubWFya2V0cGxhY2VDb21wb3NhYmxlUGVyY2VudGFnZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjkzCiAgICAvLyBjb25zdCBbbmZ0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c05GVEZlZXMpKQogICAgYnl0ZWMgMTcgLy8gIm5mdF9mZWVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjU1CiAgICAvLyBtYXJrZXRwbGFjZVJveWFsdGllcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlUm95YWx0aWVzIH0pCiAgICBieXRlYyAxNCAvLyAibWFya2V0cGxhY2Vfcm95YWx0aWVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMjkKICAgIC8vIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUgPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpLm1hcmtldHBsYWNlQ29tcG9zYWJsZVBlcmNlbnRhZ2UKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI5MwogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy5wdXJjaGFzZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnB1cmNoYXNlOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQzCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQ5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxMSAvLyAiRVJSOk1CRkYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TUJGRgoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwLCBFUlJfUEFZTUVOVF9BU1NFVF9NVVNUX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOlBBTUEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UEFNQQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1MQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBwdXJjaGFzZV9ib29sX3RydWVANwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzQKICAgIC8vIGV4cGlyYXRpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlFeHBpcmF0aW9uIH0pCiAgICBieXRlYyA3IC8vICJleHBpcmF0aW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBieiBwdXJjaGFzZV9ib29sX2ZhbHNlQDgKCnB1cmNoYXNlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCnB1cmNoYXNlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzUxCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDExCiAgICBieXRlYyAxOCAvLyAiRVJSOkxFWFAiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TEVYUAoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTMKICAgIC8vIGlmICh0aGlzLnJlc2VydmVkRm9yLnZhbHVlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTMKICAgIC8vIGlmICh0aGlzLnJlc2VydmVkRm9yLnZhbHVlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gbG9nZ2VkQXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzgKICAgIC8vIHJlc2VydmVkRm9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVJlc2VydmVkRm9yIH0pCiAgICBieXRlYyA4IC8vICJyZXNlcnZlZF9mb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1NAogICAgLy8gbG9nZ2VkQXNzZXJ0KGJ1eWVyID09PSB0aGlzLnJlc2VydmVkRm9yLnZhbHVlLCBFUlJfUkVTRVJWRURfRk9SX0RJRkZFUkVOVF9BRERSRVNTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGJ5dGVjIDE5IC8vICJFUlI6UkZEQSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpSRkRBCgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNTcKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDIKICAgIGd0eG5zIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxNwogICAgYnl0ZWMgMTUgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU4CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IHB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxOQogICAgYnl0ZWMgMTUgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnB1cmNoYXNlX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzU5CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IHRoaXMucHJpY2UudmFsdWUsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM1OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0aGlzLnByaWNlLnZhbHVlLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBibnogcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDIxCiAgICBieXRlYyAxNSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKcHVyY2hhc2VfYWZ0ZXJfYXNzZXJ0QDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjEKICAgIC8vIHRoaXMudHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIoYnV5ZXIpCiAgICBkaWcgMQogICAgY2FsbHN1YiB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjMKICAgIC8vIGNvbnN0IGFtb3VudHMgPSB0aGlzLmdldEFtb3VudHModGhpcy5wcmljZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMwCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTIzCiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiBnZXRBbW91bnRzCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMjYKICAgIC8vIGxldCBsZWZ0b3ZlcjogdWludDY0ID0gYW1vdW50cy5ha2l0YQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI3CiAgICAvLyBpZiAoYW1vdW50cy5ha2l0YSA+IDApIHsKICAgIGJ6IHB1cmNoYXNlX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI4CiAgICAvLyAoeyBsZWZ0b3ZlciB9ID0gc2VuZFJlZmVycmFsUGF5bWVudCh0aGlzLmFraXRhREFPLnZhbHVlLCAwLCBhbW91bnRzLmFraXRhKSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTI4CiAgICAvLyAoeyBsZWZ0b3ZlciB9ID0gc2VuZFJlZmVycmFsUGF5bWVudCh0aGlzLmFraXRhREFPLnZhbHVlLCAwLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHNlbmRSZWZlcnJhbFBheW1lbnQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAoKcHVyY2hhc2VfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMxLTEzNgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEzMwogICAgLy8gcmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NwogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTMzCiAgICAvLyByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzEtMTM1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzEtMTM2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEzOS0xNDQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MQogICAgLy8gYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgZGlnIDMKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE0MgogICAgLy8gcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNDIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTM5LTE0MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMzktMTQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTQ3LTE1MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICAgIHJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNTUKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU1CiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VfZWxzZV9ib2R5QDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1Ni0xNjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU4CiAgICAvLyBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgZGlnIDMKICAgIHB1c2hpbnQgMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1OQogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU5CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTU2LTE2MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLnNlbGxlciwKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE1Ni0xNjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMtMzY1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjQKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNjMtMzY0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2My0zNjUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNDMKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnB1cmNoYXNlX2Vsc2VfYm9keUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYzCiAgICAvLyBjb25zdCBhc3NldFByaXplID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTYzCiAgICAvLyBjb25zdCBhc3NldFByaXplID0gQXNzZXQodGhpcy5wcml6ZS52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2Ni0xNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5jcmVhdG9yLAogICAgLy8gICAgIHJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNjgKICAgIC8vIGFtb3VudDogYW1vdW50cy5jcmVhdG9yLAogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE2OQogICAgLy8gcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIGRpZyAxCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY2LTE3MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTY2LTE3MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgcmVjZWl2ZXI6IGFzc2V0UHJpemUuY3JlYXRvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzQtMTgwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzYKICAgIC8vIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICBzd2FwCiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzcKICAgIC8vIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIHN3YXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiBTb2xkIgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3OAogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTc4CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxNzQtMTc5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudHMuc2VsbGVyLAogICAgLy8gICAgIG5vdGU6IFN0cmluZyhhc3NldFByaXplLm5hbWUpICsgJyBTb2xkJywKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE3NC0xODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgICAgbm90ZTogU3RyaW5nKGFzc2V0UHJpemUubmFtZSkgKyAnIFNvbGQnLAogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBwdXJjaGFzZV9hZnRlcl9pZl9lbHNlQDI3CgpwdXJjaGFzZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLnB1cmNoYXNlQXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVyY2hhc2VBc2E6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNzYKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4MgogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgRVJSX01VU1RfQkVfQ0FMTEVEX0ZST01fRkFDVE9SWSkKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCAhPT0gMCwgRVJSX1BBWU1FTlRfQVNTRVRfTVVTVF9OT1RfQkVfQUxHTykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzgzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQgIT09IDAsIEVSUl9QQVlNRU5UX0FTU0VUX01VU1RfTk9UX0JFX0FMR08pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpQQU5BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBBTkEKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmV4cGlyYXRpb24udmFsdWUgPT09IDAgfHwgdGhpcy5leHBpcmF0aW9uLnZhbHVlID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX0xJU1RJTkdfRVhQSVJFRCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0CiAgICAvLyBleHBpcmF0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5RXhwaXJhdGlvbiB9KQogICAgYnl0ZWMgNyAvLyAiZXhwaXJhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogcHVyY2hhc2VBc2FfYm9vbF90cnVlQDcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM0CiAgICAvLyBleHBpcmF0aW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5RXhwaXJhdGlvbiB9KQogICAgYnl0ZWMgNyAvLyAiZXhwaXJhdGlvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5leHBpcmF0aW9uLnZhbHVlID09PSAwIHx8IHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9MSVNUSU5HX0VYUElSRUQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYnogcHVyY2hhc2VBc2FfYm9vbF9mYWxzZUA4CgpwdXJjaGFzZUFzYV9ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpwdXJjaGFzZUFzYV9ib29sX21lcmdlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZXhwaXJhdGlvbi52YWx1ZSA9PT0gMCB8fCB0aGlzLmV4cGlyYXRpb24udmFsdWUgPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfTElTVElOR19FWFBJUkVEKQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTggLy8gIkVSUjpMRVhQIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkxFWFAKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg2CiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOAogICAgLy8gcmVzZXJ2ZWRGb3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UmVzZXJ2ZWRGb3IgfSkKICAgIGJ5dGVjIDggLy8gInJlc2VydmVkX2ZvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mzg2CiAgICAvLyBpZiAodGhpcy5yZXNlcnZlZEZvci52YWx1ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODcKICAgIC8vIGxvZ2dlZEFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM4CiAgICAvLyByZXNlcnZlZEZvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlSZXNlcnZlZEZvciB9KQogICAgYnl0ZWMgOCAvLyAicmVzZXJ2ZWRfZm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozODcKICAgIC8vIGxvZ2dlZEFzc2VydChidXllciA9PT0gdGhpcy5yZXNlcnZlZEZvci52YWx1ZSwgRVJSX1JFU0VSVkVEX0ZPUl9ESUZGRVJFTlRfQUREUkVTUykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDE1CiAgICBieXRlYyAxOSAvLyAiRVJSOlJGREEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UkZEQQoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkwCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAyCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMTcKICAgIGJ5dGVjIDIwIC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpwdXJjaGFzZUFzYV9hZnRlcl9hc3NlcnRAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5MQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFzc2V0WGZlci5hc3NldEFtb3VudCA9PT0gdGhpcy5wcmljZS52YWx1ZSwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMwCiAgICAvLyBwcmljZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaWNlIH0pCiAgICBieXRlYyA2IC8vICJwcmljZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkxCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSB0aGlzLnByaWNlLnZhbHVlLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYm56IHB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxOQogICAgYnl0ZWMgMjAgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCnB1cmNoYXNlQXNhX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzkzCiAgICAvLyB0aGlzLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg2CiAgICAvLyBjb25zdCBhbW91bnRzID0gdGhpcy5nZXRBbW91bnRzKHRoaXMucHJpY2UudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMAogICAgLy8gcHJpY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcmljZSB9KQogICAgYnl0ZWMgNiAvLyAicHJpY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE4NgogICAgLy8gY29uc3QgYW1vdW50cyA9IHRoaXMuZ2V0QW1vdW50cyh0aGlzLnByaWNlLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgZ2V0QW1vdW50cwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTg5CiAgICAvLyBsZXQgbGVmdG92ZXI6IHVpbnQ2NCA9IGFtb3VudHMuYWtpdGEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MAogICAgLy8gaWYgKGFtb3VudHMuYWtpdGEgPiAwKSB7CiAgICBieiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTEKICAgIC8vICh7IGxlZnRvdmVyIH0gPSBzZW5kUmVmZXJyYWxQYXltZW50KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLCBhbW91bnRzLmFraXRhKSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5MQogICAgLy8gKHsgbGVmdG92ZXIgfSA9IHNlbmRSZWZlcnJhbFBheW1lbnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsIGFtb3VudHMuYWtpdGEpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kUmVmZXJyYWxQYXltZW50CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKCnB1cmNoYXNlQXNhX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjE5NC0yMDAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGxlZnRvdmVyLAogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUuYXBwLmFkZHJlc3MsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NwogICAgLy8gYWtpdGFEQU9Fc2Nyb3cgPSBHbG9iYWxTdGF0ZTxFc2Nyb3dDb25maWc+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlBa2l0YURBT0VzY3JvdyB9KQogICAgYnl0ZWMgMTMgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk2CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTk4CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTgKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTQtMTk5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxOTQtMjAwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBsZWZ0b3ZlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwMwogICAgLy8gaWYgKCF0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjAzCiAgICAvLyBpZiAoIXRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNgogICAgLy8gcHJpemUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQcml6ZSB9KQogICAgYnl0ZWNfMyAvLyAicHJpemUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgYXNzZXRQcml6ZSA9IEFzc2V0KHRoaXMucHJpemUudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA2CiAgICAvLyBpZiAoYXNzZXRQcml6ZS5jcmVhdG9yLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIwNgogICAgLy8gaWYgKGFzc2V0UHJpemUuY3JlYXRvci5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMDctMjEzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA5CiAgICAvLyBhc3NldFJlY2VpdmVyOiBhc3NldFByaXplLmNyZWF0b3IsCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTAKICAgIC8vIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxMQogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjExCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3LTIxMgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjA3LTIxMwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogYXNzZXRQcml6ZS5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI4CiAgICAvLyBpZiAodGhpcy5tYXJrZXRwbGFjZS52YWx1ZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1MwogICAgLy8gbWFya2V0cGxhY2UgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5TWFya2V0cGxhY2UgfSkKICAgIGJ5dGVjIDkgLy8gIm1hcmtldHBsYWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjgKICAgIC8vIGlmICh0aGlzLm1hcmtldHBsYWNlLnZhbHVlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOAogICAgLy8gaWYgKHRoaXMubWFya2V0cGxhY2UudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5LTIzNQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMxCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NTMKICAgIC8vIG1hcmtldHBsYWNlID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleU1hcmtldHBsYWNlIH0pCiAgICBieXRlYyA5IC8vICJtYXJrZXRwbGFjZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMxCiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjMyCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyA0CiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzMKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzMwogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyOS0yMzQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjI5LTIzNQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDkKICAgIC8vIGlmIChtYXJrZXRwbGFjZS5pc09wdGVkSW4odGhpcy5wYXltZW50QXNzZXQudmFsdWUpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0OQogICAgLy8gaWYgKG1hcmtldHBsYWNlLmlzT3B0ZWRJbih0aGlzLnBheW1lbnRBc3NldC52YWx1ZSkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJ6IHB1cmNoYXNlQXNhX2Vsc2VfYm9keUAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTAtMjU2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBtYXJrZXRwbGFjZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUzCiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIGRpZyAzCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1NAogICAgLy8geGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUwLTI1NQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjUwLTI1NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogbWFya2V0cGxhY2UsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcwCiAgICAvLyBpZiAodGhpcy5zZWxsZXIudmFsdWUuaXNPcHRlZEluKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICBieiBwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxLTI3NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjczCiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjczCiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc0CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzQKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3MS0yNzUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnBheW1lbnRBc3NldC52YWx1ZSwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjcxLTI3NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTUtMzk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTYKICAgIC8vIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozOTUtMzk2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsgY2xvc2VSZW1haW5kZXJUbzogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM5NS0zOTcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNzYKICAgIC8vIEBhYmltZXRob2QoeyBPbkNvbXBsZXRlQWN0aW9uOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwdXJjaGFzZUFzYV9lbHNlX2JvZHlAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6Mjc5CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjMyCiAgICAvLyBwYXltZW50QXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVBheW1lbnRBc3NldCB9KQogICAgYnl0ZWNfMCAvLyAicGF5bWVudF9hc3NldCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4MwogICAgLy8gW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODMKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMuc2VsbGVyLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMuc2VsbGVyIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzgtMjg2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgxCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjgyCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI3OC0yODYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLnNlbGxlci52YWx1ZSwgYW1vdW50OiBhbW91bnRzLnNlbGxlciB9XSwKICAgIC8vICAgYW1vdW50cy5zZWxsZXIsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyODUKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNzgtMjg2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5zZWxsZXIudmFsdWUsIGFtb3VudDogYW1vdW50cy5zZWxsZXIgfV0sCiAgICAvLyAgIGFtb3VudHMuc2VsbGVyLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzNQoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTkKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OQogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MAogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNjMKICAgIC8vIFt7IGFkZHJlc3M6IG1hcmtldHBsYWNlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICBkaWcgNQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTgtMjY2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MQogICAgLy8gMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2MgogICAgLy8gTUFYX1VJTlQ2NCwKICAgIGludGMgNSAvLyAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNTgtMjY2CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogbWFya2V0cGxhY2UsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIC8vICAgYW1vdW50cy5tYXJrZXRwbGFjZSwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2NQogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI1OC0yNjYKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBtYXJrZXRwbGFjZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAzMgoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDIKICAgIC8vIFt7IGFkZHJlc3M6IHRoaXMubWFya2V0cGxhY2UudmFsdWUsIGFtb3VudDogYW1vdW50cy5tYXJrZXRwbGFjZSB9XSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjUzCiAgICAvLyBtYXJrZXRwbGFjZSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZSB9KQogICAgYnl0ZWMgOSAvLyAibWFya2V0cGxhY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI0MgogICAgLy8gW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzctMjQ1CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQwCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjQxCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIzNy0yNDUKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiB0aGlzLm1hcmtldHBsYWNlLnZhbHVlLCBhbW91bnQ6IGFtb3VudHMubWFya2V0cGxhY2UgfV0sCiAgICAvLyAgIGFtb3VudHMubWFya2V0cGxhY2UsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyNDQKICAgIC8vIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMzctMjQ1CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICB0aGlzLnBheW1lbnRBc3NldC52YWx1ZS5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogdGhpcy5tYXJrZXRwbGFjZS52YWx1ZSwgYW1vdW50OiBhbW91bnRzLm1hcmtldHBsYWNlIH1dLAogICAgLy8gICBhbW91bnRzLm1hcmtldHBsYWNlLAogICAgLy8gICBmYWxzZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIGIgcHVyY2hhc2VBc2FfYWZ0ZXJfaWZfZWxzZUAyOQoKcHVyY2hhc2VBc2FfZWxzZV9ib2R5QDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNgogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozMgogICAgLy8gcGF5bWVudEFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlQYXltZW50QXNzZXQgfSkKICAgIGJ5dGVjXzAgLy8gInBheW1lbnRfYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMjAKICAgIC8vIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICB1bmNvdmVyIDIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNS0yMjMKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTgKICAgIC8vIDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyMTkKICAgIC8vIE1BWF9VSU5UNjQsCiAgICBpbnRjIDUgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjE1LTIyMwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXltZW50QXNzZXQudmFsdWUuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGFzc2V0UHJpemUuY3JlYXRvciwgYW1vdW50OiBhbW91bnRzLmNyZWF0b3IgfV0sCiAgICAvLyAgIGFtb3VudHMuY3JlYXRvciwKICAgIC8vICAgZmFsc2UKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIyMgogICAgLy8gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjIxNS0yMjMKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkLAogICAgLy8gICAwLAogICAgLy8gICBNQVhfVUlOVDY0LAogICAgLy8gICBbeyBhZGRyZXNzOiBhc3NldFByaXplLmNyZWF0b3IsIGFtb3VudDogYW1vdW50cy5jcmVhdG9yIH1dLAogICAgLy8gICBhbW91bnRzLmNyZWF0b3IsCiAgICAvLyAgIGZhbHNlCiAgICAvLyApCiAgICBjYWxsc3ViIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQKICAgIHBvcG4gMgogICAgYiBwdXJjaGFzZUFzYV9hZnRlcl9pZl9lbHNlQDI2CgpwdXJjaGFzZUFzYV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwdXJjaGFzZUFzYV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmRlbGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGlzdDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDEKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAzCiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTVVTVF9CRV9DQUxMRURfRlJPTV9GQUNUT1JZKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGlzdF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTEgLy8gIkVSUjpNQkZGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk1CRkYKCmRlbGlzdF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA0CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5zZWxsZXIudmFsdWUgPT09IGNhbGxlciwgRVJSX09OTFlfU0VMTEVSX0NBTl9ERUxJU1QpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDQKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLnNlbGxlci52YWx1ZSA9PT0gY2FsbGVyLCBFUlJfT05MWV9TRUxMRVJfQ0FOX0RFTElTVCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIGJueiBkZWxpc3RfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOk9TQ0QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6T1NDRAoKZGVsaXN0X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDcKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDcKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSA1CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQwOAogICAgLy8geGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDgKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDEyCiAgICAvLyBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTUKICAgIC8vIGlmICghKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTUKICAgIC8vIGlmICghKHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLmlkID09PSAwKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGlzdF9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE4CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE4CiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE5CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzIKICAgIC8vIHBheW1lbnRBc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UGF5bWVudEFzc2V0IH0pCiAgICBieXRlY18wIC8vICJwYXltZW50X2Fzc2V0IgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDIyCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVsaXN0X2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjMtNDI2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjUKICAgIC8vIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czozNgogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVNlbGxlciB9KQogICAgYnl0ZWNfMSAvLyAic2VsbGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjUKICAgIC8vIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjMtNDI2CiAgICAvLyBhYmlDYWxsPHR5cGVvZiBQcml6ZUJveC5wcm90b3R5cGUudHJhbnNmZXI+KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMucHJpemUudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLnNlbGxlci52YWx1ZV0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJ0cmFuc2ZlcihhZGRyZXNzKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNwogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MTctNDIwCiAgICAvLyBjb25zdCBwYXltZW50QXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wYXltZW50QXNzZXQudmFsdWUsCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjcKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX25leHQKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDExLTQxMwogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQyNwogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50QXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CgpkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAxCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpkZWxpc3RfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MDYtNDA5CiAgICAvLyBjb25zdCBhc3NldFRyYW5zZmVyID0gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI5CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDE3LTQyMAogICAgLy8gY29uc3QgcGF5bWVudEFzc2V0VHJhbnNmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldENsb3NlVG86IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMucGF5bWVudEFzc2V0LnZhbHVlLAogICAgLy8gfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDI5CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKGFzc2V0VHJhbnNmZXIsIHBheW1lbnRBc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxMS00MTMKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MjkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudEFzc2V0VHJhbnNmZXIsIHBheW1lbnQpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkZWxpc3RfYWZ0ZXJfaWZfZWxzZUAyNAoKZGVsaXN0X2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMyCiAgICAvLyBpZiAodGhpcy5pc1ByaXplQm94LnZhbHVlKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoyOAogICAgLy8gaXNQcml6ZUJveCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlJc1ByaXplQm94IH0pCiAgICBieXRlYyA1IC8vICJpc19wcml6ZV9ib3giCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzMgogICAgLy8gaWYgKHRoaXMuaXNQcml6ZUJveC52YWx1ZSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGlzdF9lbHNlX2JvZHlAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMzLTQzNgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM1CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzYKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlTZWxsZXIgfSkKICAgIGJ5dGVjXzEgLy8gInNlbGxlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM1CiAgICAvLyBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDM0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDMzLTQzNgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbdGhpcy5zZWxsZXIudmFsdWVdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzcKICAgIC8vIHBheW1lbnQuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDExLTQxMwogICAgLy8gY29uc3QgcGF5bWVudCA9IGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIGNsb3NlUmVtYWluZGVyVG86IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzNwogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgZGVsaXN0X2FmdGVyX2lmX2Vsc2VAMjQKCmRlbGlzdF9lbHNlX2JvZHlAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOQogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDA2LTQwOQogICAgLy8gY29uc3QgYXNzZXRUcmFuc2ZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0Q2xvc2VUbzogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQzOQogICAgLy8gaXR4bi5zdWJtaXRHcm91cChhc3NldFRyYW5zZmVyLCBwYXltZW50KQogICAgaXR4bl9uZXh0CiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQxMS00MTMKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBjbG9zZVJlbWFpbmRlclRvOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MzkKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoYXNzZXRUcmFuc2ZlciwgcGF5bWVudCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGRlbGlzdF9hZnRlcl9pZl9lbHNlQDI0CgoKLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo6TGlzdGluZy5jaGFuZ2VQcmljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNoYW5nZVByaWNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDQKICAgIC8vIGNoYW5nZVByaWNlKHByaWNlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5zZWxsZXIudmFsdWUsIEVSUl9NVVNUX0JFX1NFTExFUikKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuc2VsbGVyLnZhbHVlLCBFUlJfTVVTVF9CRV9TRUxMRVIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGJueiBjaGFuZ2VQcmljZV9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TUJTTCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpNQlNMCgpjaGFuZ2VQcmljZV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MzAKICAgIC8vIHByaWNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpY2UgfSkKICAgIGJ5dGVjIDYgLy8gInByaWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0NDYKICAgIC8vIHRoaXMucHJpY2UudmFsdWUgPSBwcmljZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjQ0NAogICAgLy8gY2hhbmdlUHJpY2UocHJpY2U6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18yIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlQWtpdGFEQU9fYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKdXBkYXRlQWtpdGFEQU9fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoQ3JlYXRvck9ubHlPcHRJbi5vcHRpbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdGluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ3CiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ4CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfRk9SQklEREVOKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYm56IG9wdGluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpGT1JCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZPUkIKCm9wdGluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdGluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdGluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUxCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBkaWcgMQogICAgZ3R4bnMgQW1vdW50CiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgID09CiAgICBibnogb3B0aW5fYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOklQTUEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBNQQoKb3B0aW5fYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTMtNTcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo1NAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6NTUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjUzLTU3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjQ3CiAgICAvLyBvcHRpbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLmdldEFtb3VudHMoYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRBbW91bnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MQogICAgLy8gcHJpdmF0ZSBnZXRBbW91bnRzKGFtb3VudDogdWludDY0KTogUm95YWx0eUFtb3VudHMgewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2MgogICAgLy8gbGV0IGNyZWF0b3JBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo0MAogICAgLy8gY3JlYXRvclJveWFsdHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlDcmVhdG9yUm95YWx0eSB9KQogICAgYnl0ZWMgMTIgLy8gImNyZWF0b3Jfcm95YWx0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjIKICAgIC8vIGxldCBjcmVhdG9yQW1vdW50ID0gY2FsY1BlcmNlbnQoYW1vdW50LCB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA4CiAgICAvLyBhc3NlcnQocCA8PSBESVZJU09SLCBFUlJfSU5WQUxJRF9QRVJDRU5UQUdFKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIElQQ1QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTA5CiAgICAvLyByZXR1cm4gb3AuZGl2dyguLi5vcC5tdWx3KGEsIHApLCBESVZJU09SKQogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICBpbnRjIDQgLy8gMTAwMDAwCiAgICBkaXZ3CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjMKICAgIC8vIGlmIChjcmVhdG9yQW1vdW50ID09PSAwICYmIHRoaXMuY3JlYXRvclJveWFsdHkudmFsdWUgPiAwICYmIGFtb3VudCA+IDApIHsKICAgIGJueiBnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NDAKICAgIC8vIGNyZWF0b3JSb3lhbHR5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5Q3JlYXRvclJveWFsdHkgfSkKICAgIGJ5dGVjIDEyIC8vICJjcmVhdG9yX3JveWFsdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjYzCiAgICAvLyBpZiAoY3JlYXRvckFtb3VudCA9PT0gMCAmJiB0aGlzLmNyZWF0b3JSb3lhbHR5LnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDQKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjQKICAgIC8vIGNyZWF0b3JBbW91bnQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjcKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzIgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NjcKICAgIC8vIGNvbnN0IHsgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1pbjogbWluLCBtYXJrZXRwbGFjZVNhbGVQZXJjZW50YWdlTWF4OiBtYXggfSA9IGdldE5GVEZlZXModGhpcy5ha2l0YURBTy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjkzCiAgICAvLyBjb25zdCBbbmZ0RmVlc0J5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c05GVEZlZXMpKQogICAgZHVwCiAgICBieXRlYyAxNyAvLyAibmZ0X2ZlZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY3CiAgICAvLyBjb25zdCB7IG1hcmtldHBsYWNlU2FsZVBlcmNlbnRhZ2VNaW46IG1pbiwgbWFya2V0cGxhY2VTYWxlUGVyY2VudGFnZU1heDogbWF4IH0gPSBnZXRORlRGZWVzKHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo2OAogICAgLy8gY29uc3QgaW1wYWN0ID0gZ2V0VXNlckltcGFjdCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLnNlbGxlci52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjM2CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5U2VsbGVyIH0pCiAgICBieXRlY18xIC8vICJzZWxsZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjY4CiAgICAvLyBjb25zdCBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIHRoaXMuc2VsbGVyLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM2LTEzOQogICAgLy8gcmV0dXJuIGFiaUNhbGw8dHlwZW9mIEFraXRhU29jaWFsSW1wYWN0LnByb3RvdHlwZS5nZXRVc2VySW1wYWN0Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YVNvY2lhbEFwcExpc3QoYWtpdGFEQU8pLmltcGFjdCwKICAgIC8vICAgYXJnczogW2FjY291bnRdCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0OQogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YVNvY2lhbEFwcExpc3QpKQogICAgc3dhcAogICAgcHVzaGJ5dGVzICJzYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNwogICAgLy8gYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHhkNTc0YmIxMCAvLyBtZXRob2QgImdldFVzZXJJbXBhY3QoYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzEKICAgIC8vIGNvbnN0IG1pbkltcGFjdDogdWludDY0ID0gKGltcGFjdCA+IDEpID8gaW1wYWN0IC0gMSA6IDEKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRBbW91bnRzX3Rlcm5hcnlfZmFsc2VAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLQoKZ2V0QW1vdW50c190ZXJuYXJ5X21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzIKICAgIC8vIHJldHVybiBtYXggLSAoKChtYXggLSBtaW4pICogbWluSW1wYWN0KSAvIElNUEFDVF9ESVZJU09SKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgIC0KICAgIHVuY292ZXIgMgogICAgKgogICAgcHVzaGludCAxMDAwCiAgICAvCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJUENUCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzIKICAgIC8vIGlmIChha2l0YUFtb3VudCA9PT0gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzMKICAgIC8vIGFraXRhQW1vdW50ID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjc2CiAgICAvLyBsZXQgbWFya2V0cGxhY2VBbW91bnQgPSBjYWxjUGVyY2VudChhbW91bnQsIHRoaXMubWFya2V0cGxhY2VSb3lhbHRpZXMudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NQogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTQgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzYKICAgIC8vIGxldCBtYXJrZXRwbGFjZUFtb3VudCA9IGNhbGNQZXJjZW50KGFtb3VudCwgdGhpcy5tYXJrZXRwbGFjZVJveWFsdGllcy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOAogICAgLy8gYXNzZXJ0KHAgPD0gRElWSVNPUiwgRVJSX0lOVkFMSURfUEVSQ0VOVEFHRSkKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJUENUCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEwOQogICAgLy8gcmV0dXJuIG9wLmRpdncoLi4ub3AubXVsdyhhLCBwKSwgRElWSVNPUikKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgaW50YyA0IC8vIDEwMDAwMAogICAgZGl2dwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGlmIChtYXJrZXRwbGFjZUFtb3VudCA9PT0gMCAmJiB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBibnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo1NQogICAgLy8gbWFya2V0cGxhY2VSb3lhbHRpZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBMaXN0aW5nR2xvYmFsU3RhdGVLZXlNYXJrZXRwbGFjZVJveWFsdGllcyB9KQogICAgYnl0ZWMgMTQgLy8gIm1hcmtldHBsYWNlX3JveWFsdGllcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6NzcKICAgIC8vIGlmIChtYXJrZXRwbGFjZUFtb3VudCA9PT0gMCAmJiB0aGlzLm1hcmtldHBsYWNlUm95YWx0aWVzLnZhbHVlID4gMCAmJiBhbW91bnQgPiAwKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZ2V0QW1vdW50c19hZnRlcl9pZl9lbHNlQDExCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGdldEFtb3VudHNfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo3OAogICAgLy8gbWFya2V0cGxhY2VBbW91bnQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAyCgpnZXRBbW91bnRzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjgxCiAgICAvLyBjb25zdCBzZWxsZXJBbW91bnQ6IHVpbnQ2NCA9IGFtb3VudCAtIChjcmVhdG9yQW1vdW50ICsgYWtpdGFBbW91bnQgKyAoMiAqIG1hcmtldHBsYWNlQW1vdW50KSkKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIHB1c2hpbnQgMgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgNQogICAgKgogICAgKwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjgzLTg4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBjcmVhdG9yOiBjcmVhdG9yQW1vdW50LAogICAgLy8gICBha2l0YTogYWtpdGFBbW91bnQsCiAgICAvLyAgIG1hcmtldHBsYWNlOiBtYXJrZXRwbGFjZUFtb3VudCwKICAgIC8vICAgc2VsbGVyOiBzZWxsZXJBbW91bnQsCiAgICAvLyB9CiAgICBzd2FwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldEFtb3VudHNfdGVybmFyeV9mYWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTMxCiAgICAvLyBjb25zdCBtaW5JbXBhY3Q6IHVpbnQ2NCA9IChpbXBhY3QgPiAxKSA/IGltcGFjdCAtIDEgOiAxCiAgICBpbnRjXzEgLy8gMQogICAgYiBnZXRBbW91bnRzX3Rlcm5hcnlfbWVyZ2VAMTcKCgovLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjpMaXN0aW5nLnRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjkxCiAgICAvLyBwcml2YXRlIHRyYW5zZmVyUHVyY2hhc2VUb0J1eWVyKGJ1eWVyOiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI4CiAgICAvLyBpc1ByaXplQm94ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleUlzUHJpemVCb3ggfSkKICAgIGJ5dGVjIDUgLy8gImlzX3ByaXplX2JveCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTIKICAgIC8vIGlmICh0aGlzLmlzUHJpemVCb3gudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2ZlclB1cmNoYXNlVG9CdXllcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTMtOTYKICAgIC8vIGFiaUNhbGw8dHlwZW9mIFByaXplQm94LnByb3RvdHlwZS50cmFuc2Zlcj4oewogICAgLy8gICBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIC8vICAgYXJnczogW2J1eWVyXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk0CiAgICAvLyBhcHBJZDogdGhpcy5wcml6ZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjI2CiAgICAvLyBwcml6ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IExpc3RpbmdHbG9iYWxTdGF0ZUtleVByaXplIH0pCiAgICBieXRlY18zIC8vICJwcml6ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6OTQKICAgIC8vIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czo5My05NgogICAgLy8gYWJpQ2FsbDx0eXBlb2YgUHJpemVCb3gucHJvdG90eXBlLnRyYW5zZmVyPih7CiAgICAvLyAgIGFwcElkOiB0aGlzLnByaXplLnZhbHVlLAogICAgLy8gICBhcmdzOiBbYnV5ZXJdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAidHJhbnNmZXIoYWRkcmVzcyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjk3CiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHByaXplQXNzZXQgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MjYKICAgIC8vIHByaXplID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTGlzdGluZ0dsb2JhbFN0YXRlS2V5UHJpemUgfSkKICAgIGJ5dGVjXzMgLy8gInByaXplIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHByaXplQXNzZXQgPSBBc3NldCh0aGlzLnByaXplLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwMgogICAgLy8gaWYgKGJ1eWVyLmlzT3B0ZWRJbihwcml6ZUFzc2V0KSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYnogdHJhbnNmZXJQdXJjaGFzZVRvQnV5ZXJfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA0LTEwNwogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRDbG9zZVRvOiBidXllciwKICAgIC8vICAgeGZlckFzc2V0OiBwcml6ZUFzc2V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgp0cmFuc2ZlclB1cmNoYXNlVG9CdXllcl9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTAKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL21hcmtldHBsYWNlL2xpc3RpbmcuYWxnby50czoxMTQKICAgIC8vIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTE1CiAgICAvLyBwcml6ZUFzc2V0LmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyAyCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA5LTExNwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgcHJpemVBc3NldC5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogYnV5ZXIsIGFtb3VudDogcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB9XSwKICAgIC8vICAgcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIC8vICAgdHJ1ZQogICAgLy8gKQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEyCiAgICAvLyAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTEzCiAgICAvLyBNQVhfVUlOVDY0LAogICAgaW50YyA1IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjEwOS0xMTcKICAgIC8vIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnQoCiAgICAvLyAgIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICAvLyAgIHByaXplQXNzZXQuaWQsCiAgICAvLyAgIDAsCiAgICAvLyAgIE1BWF9VSU5UNjQsCiAgICAvLyAgIFt7IGFkZHJlc3M6IGJ1eWVyLCBhbW91bnQ6IHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcykgfV0sCiAgICAvLyAgIHByaXplQXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIHRydWUKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWFya2V0cGxhY2UvbGlzdGluZy5hbGdvLnRzOjExNgogICAgLy8gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tYXJrZXRwbGFjZS9saXN0aW5nLmFsZ28udHM6MTA5LTExNwogICAgLy8gY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudCgKICAgIC8vICAgdGhpcy5ha2l0YURBTy52YWx1ZSwKICAgIC8vICAgcHJpemVBc3NldC5pZCwKICAgIC8vICAgMCwKICAgIC8vICAgTUFYX1VJTlQ2NCwKICAgIC8vICAgW3sgYWRkcmVzczogYnV5ZXIsIGFtb3VudDogcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSB9XSwKICAgIC8vICAgcHJpemVBc3NldC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIC8vICAgdHJ1ZQogICAgLy8gKQogICAgY2FsbHN1YiBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50CiAgICBwb3BuIDIKICAgIHJldHN1Ygo=\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type EscrowConfig = {\n name: string,\n app: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a EscrowConfig to the struct representation\n */\nexport function EscrowConfigFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('EscrowConfig', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as EscrowConfig\n}\n\nexport type FunderInfo = {\n account: string,\n amount: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a FunderInfo to the struct representation\n */\nexport function FunderInfoFromTuple(abiTuple: [string, bigint]) {\n const abiStructType = ABIStructType.fromStruct('FunderInfo', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as FunderInfo\n}\n\n/**\n * The argument types for the Listing contract\n */\nexport type ListingArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': {\n prize: bigint | number\n isPrizeBox: boolean\n price: bigint | number\n paymentAsset: bigint | number\n expiration: bigint | number\n seller: string\n funder: FunderInfo\n reservedFor: string\n creatorRoyalty: bigint | number\n gateId: bigint | number\n marketplace: string\n version: string\n akitaDao: bigint | number\n akitaDaoEscrow: EscrowConfig\n }\n 'purchase(pay,address,address)void': {\n /**\n * - the payment for purchasing the asset\n */\n payment: AppMethodCallTransactionArgument\n /**\n * - the buyer of the asset\n */\n buyer: string\n marketplace: string\n }\n 'purchaseAsa(axfer,address,address)void': {\n assetXfer: AppMethodCallTransactionArgument\n buyer: string\n marketplace: string\n }\n 'delist(address)void': {\n caller: string\n }\n 'changePrice(uint64)void': {\n price: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'optin(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': [prize: bigint | number, isPrizeBox: boolean, price: bigint | number, paymentAsset: bigint | number, expiration: bigint | number, seller: string, funder: FunderInfo, reservedFor: string, creatorRoyalty: bigint | number, gateId: bigint | number, marketplace: string, version: string, akitaDao: bigint | number, akitaDaoEscrow: EscrowConfig]\n 'purchase(pay,address,address)void': [payment: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'purchaseAsa(axfer,address,address)void': [assetXfer: AppMethodCallTransactionArgument, buyer: string, marketplace: string]\n 'delist(address)void': [caller: string]\n 'changePrice(uint64)void': [price: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'optin(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type ListingReturns = {\n 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void': void\n 'purchase(pay,address,address)void': void\n 'purchaseAsa(axfer,address,address)void': void\n 'delist(address)void': void\n 'changePrice(uint64)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'optin(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Listing smart contract.\n */\nexport type ListingTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void' | 'create', {\n argsObj: ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n argsTuple: ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n returns: ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']\n }>\n & Record<'purchase(pay,address,address)void' | 'purchase', {\n argsObj: ListingArgs['obj']['purchase(pay,address,address)void']\n argsTuple: ListingArgs['tuple']['purchase(pay,address,address)void']\n returns: ListingReturns['purchase(pay,address,address)void']\n }>\n & Record<'purchaseAsa(axfer,address,address)void' | 'purchaseAsa', {\n argsObj: ListingArgs['obj']['purchaseAsa(axfer,address,address)void']\n argsTuple: ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']\n returns: ListingReturns['purchaseAsa(axfer,address,address)void']\n }>\n & Record<'delist(address)void' | 'delist', {\n argsObj: ListingArgs['obj']['delist(address)void']\n argsTuple: ListingArgs['tuple']['delist(address)void']\n returns: ListingReturns['delist(address)void']\n }>\n & Record<'changePrice(uint64)void' | 'changePrice', {\n argsObj: ListingArgs['obj']['changePrice(uint64)void']\n argsTuple: ListingArgs['tuple']['changePrice(uint64)void']\n returns: ListingReturns['changePrice(uint64)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: ListingArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: ListingArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: ListingReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: ListingArgs['obj']['opUp()void']\n argsTuple: ListingArgs['tuple']['opUp()void']\n returns: ListingReturns['opUp()void']\n }>\n & Record<'optin(pay,uint64)void' | 'optin', {\n argsObj: ListingArgs['obj']['optin(pay,uint64)void']\n argsTuple: ListingArgs['tuple']['optin(pay,uint64)void']\n returns: ListingReturns['optin(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the asset for sale: Asset | Application ( Prize Box )\n */\n prize: bigint\n /**\n * whether or not the prize is an asset or a prize box\n */\n isPrizeBox: bigint\n /**\n * the price of the asset\n */\n price: bigint\n /**\n * the asset to use for payment\n */\n paymentAsset: bigint\n /**\n * the timestamp the listing expires on, once this passes all that can be done is delist\n */\n expiration: bigint\n /**\n * the address selling the asset\n */\n seller: string\n /**\n * the address the sale is reserved for\n */\n reservedFor: string\n /**\n * the amount the creator will get for the sale\n */\n creatorRoyalty: bigint\n /**\n * the gate ID to use to check if the user is qualified to buy\n */\n gateId: bigint\n /**\n * The address of the marketplace that listed the asset to send the fee to\n \n IMPORTANT: this is a double sided marketplace fee contract\n the marketplace referred to internally in the contract\n is the listing side marketplace.\n the buyer side marketplace provides their address at\n the time of purchase\n\n */\n marketplace: string\n /**\n * the amount the marketplaces will get for the sale\n */\n marketplaceRoyalties: bigint\n /**\n * the app ID for the akita DAO escrow\n */\n akitaDaoEscrow: EscrowConfig\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n funder: FunderInfo\n }\n maps: {}\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type ListingSignatures = keyof ListingTypes['methods']\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Listing smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Listing smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends ListingSignatures> = ListingTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = ListingTypes['state']['global']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type ListingCreateCallParams =\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & {method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines supported delete method params for this smart contract\n */\nexport type ListingDeleteCallParams =\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase'}>\n | Expand<CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & {method: 'purchase(pay,address,address)void'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist'}>\n | Expand<CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & {method: 'delist(address)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type ListingDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: ListingCreateCallParams\n /**\n * Delete transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n deleteParams?: ListingDeleteCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Listing smart contract\n */\nexport abstract class ListingParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends ListingCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void':\n return ListingParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.prize, params.args.isPrizeBox, params.args.price, params.args.paymentAsset, params.args.expiration, params.args.seller, params.args.funder, params.args.reservedFor, params.args.creatorRoyalty, params.args.gateId, params.args.marketplace, params.args.version, params.args.akitaDao, params.args.akitaDaoEscrow],\n }\n },\n }\n }\n\n /**\n * Gets available delete ABI call param factories\n */\n static get delete() {\n return {\n _resolveByMethod<TParams extends ListingDeleteCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'purchase':\n case 'purchase(pay,address,address)void':\n return ListingParamsFactory.delete.purchase(params)\n case 'delist':\n case 'delist(address)void':\n return ListingParamsFactory.delete.delist(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs delete ABI call params for the Listing smart contract using the purchase(pay,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n purchase(params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'purchase(pay,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.buyer, params.args.marketplace],\n }\n },\n /**\n * Constructs delete ABI call params for the Listing smart contract using the delist(address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n delist(params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): AppClientMethodCallParams {\n return {\n ...params,\n method: 'delist(address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.caller],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the purchaseAsa(axfer,address,address)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'purchaseAsa(axfer,address,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.buyer, params.args.marketplace],\n }\n }\n /**\n * Constructs a no op call for the changePrice(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'changePrice(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.price],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the optin(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optin(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Listing smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class ListingFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `ListingFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new ListingClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new ListingClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Listing smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: ListingDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? ListingParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (ListingCreateCallParams & { args: Uint8Array[] }) : undefined,\n deleteParams: params.deleteParams?.method ? ListingParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams as (ListingDeleteCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new ListingClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(ListingParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployDelete methods\n */\n deployDelete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.purchase(params))\n },\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The deployDelete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n return this.appFactory.params.deployDelete(ListingParamsFactory.delete.delist(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(ListingParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Listing smart contract using an ABI method call using the create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void ABI method.\n *\n * create the listing application\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<ListingArgs['obj']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void'] | ListingArgs['tuple']['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(ListingParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | ListingReturns['create(uint64,bool,uint64,uint64,uint64,address,(address,uint64),address,uint64,uint64,address,string,uint64,(string,uint64))void']) }, appClient: new ListingClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Listing smart contract\n */\nexport class ListingClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `ListingClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Listing app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `ListingClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `ListingClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<ListingClient> {\n return new ListingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `ListingClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<ListingClient> {\n return new ListingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete params\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.params.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optin: (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.purchase(params))\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete transaction\n */\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n return this.appClient.createTransaction.delete(ListingParamsFactory.delete.delist(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n purchaseAsa: (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.purchaseAsa(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n changePrice: (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.changePrice(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optin: (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(ListingParamsFactory.optin(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available delete methods\n */\n delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the `purchase(pay,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n purchase: async (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']> & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.purchase(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchase(pay,address,address)void'])}\n },\n\n /**\n * Deletes an existing instance of the Listing smart contract using the `delist(address)void` ABI method.\n *\n * Deletes the app and returns the asset/mbr to the seller\n *\n * @param params The params for the smart contract call\n * @returns The delete result\n */\n delist: async (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']> & SendParams & { onComplete?: OnApplicationComplete.DeleteApplication }) => {\n const result = await this.appClient.send.delete(ListingParamsFactory.delete.delist(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['delist(address)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Listing smart contract using the `purchaseAsa(axfer,address,address)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n purchaseAsa: async (params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.purchaseAsa(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['purchaseAsa(axfer,address,address)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `changePrice(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n changePrice: async (params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.changePrice(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['changePrice(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(ListingParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Listing smart contract using the `optin(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optin: async (params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(ListingParamsFactory.optin(params))\n return {...result, return: result.return as unknown as (undefined | ListingReturns['optin(pay,uint64)void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new ListingClient(this.appClient.clone(params))\n }\n\n /**\n * Methods to access state for the current Listing app\n */\n state = {\n /**\n * Methods to access global state for the current Listing app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n prize: result.prize,\n isPrizeBox: result.isPrizeBox,\n price: result.price,\n paymentAsset: result.paymentAsset,\n expiration: result.expiration,\n seller: result.seller,\n reservedFor: result.reservedFor,\n creatorRoyalty: result.creatorRoyalty,\n gateId: result.gateID,\n marketplace: result.marketplace,\n marketplaceRoyalties: result.marketplaceRoyalties,\n akitaDaoEscrow: result.akitaDAOEscrow,\n version: result.version,\n akitaDao: result.akitaDAO,\n funder: result.funder,\n }\n },\n /**\n * Get the current value of the prize key in global state\n */\n prize: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"prize\")) as bigint | undefined },\n /**\n * Get the current value of the isPrizeBox key in global state\n */\n isPrizeBox: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"isPrizeBox\")) as bigint | undefined },\n /**\n * Get the current value of the price key in global state\n */\n price: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"price\")) as bigint | undefined },\n /**\n * Get the current value of the paymentAsset key in global state\n */\n paymentAsset: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"paymentAsset\")) as bigint | undefined },\n /**\n * Get the current value of the expiration key in global state\n */\n expiration: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"expiration\")) as bigint | undefined },\n /**\n * Get the current value of the seller key in global state\n */\n seller: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"seller\")) as string | undefined },\n /**\n * Get the current value of the reservedFor key in global state\n */\n reservedFor: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"reservedFor\")) as string | undefined },\n /**\n * Get the current value of the creatorRoyalty key in global state\n */\n creatorRoyalty: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"creatorRoyalty\")) as bigint | undefined },\n /**\n * Get the current value of the gateID key in global state\n */\n gateId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"gateID\")) as bigint | undefined },\n /**\n * Get the current value of the marketplace key in global state\n */\n marketplace: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"marketplace\")) as string | undefined },\n /**\n * Get the current value of the marketplaceRoyalties key in global state\n */\n marketplaceRoyalties: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"marketplaceRoyalties\")) as bigint | undefined },\n /**\n * Get the current value of the akitaDAOEscrow key in global state\n */\n akitaDaoEscrow: async (): Promise<EscrowConfig | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAOEscrow\")) as EscrowConfig | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n /**\n * Get the current value of the funder key in global state\n */\n funder: async (): Promise<FunderInfo | undefined> => { return (await this.appClient.state.global.getValue(\"funder\")) as FunderInfo | undefined },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): ListingComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a purchaseAsa(axfer,address,address)void method call against the Listing contract\n */\n purchaseAsa(params: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.purchaseAsa(params)))\n return this\n },\n /**\n * Add a changePrice(uint64)void method call against the Listing contract\n */\n changePrice(params: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changePrice(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Listing contract\n */\n updateAkitaDao(params: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Listing contract\n */\n opUp(params: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n /**\n * Add a optin(pay,uint64)void method call against the Listing contract\n */\n optin(params: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optin(params)))\n return this\n },\n get delete() {\n return {\n purchase: (params: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.purchase(params)))\n return this\n },\n delist: (params: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>) => {\n promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.delist(params)))\n return this\n },\n }\n },\n /**\n * Add a clear state call to the Listing contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as ListingComposer\n }\n}\nexport type ListingComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the purchaseAsa(axfer,address,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchaseAsa(params?: CallParams<ListingArgs['obj']['purchaseAsa(axfer,address,address)void'] | ListingArgs['tuple']['purchaseAsa(axfer,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchaseAsa(axfer,address,address)void'] | undefined]>\n\n /**\n * Calls the changePrice(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n changePrice(params?: CallParams<ListingArgs['obj']['changePrice(uint64)void'] | ListingArgs['tuple']['changePrice(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['changePrice(uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<ListingArgs['obj']['updateAkitaDAO(uint64)void'] | ListingArgs['tuple']['updateAkitaDAO(uint64)void']>): ListingComposer<[...TReturns, ListingReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<ListingArgs['obj']['opUp()void'] | ListingArgs['tuple']['opUp()void']>): ListingComposer<[...TReturns, ListingReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the optin(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optin(params?: CallParams<ListingArgs['obj']['optin(pay,uint64)void'] | ListingArgs['tuple']['optin(pay,uint64)void']>): ListingComposer<[...TReturns, ListingReturns['optin(pay,uint64)void'] | undefined]>\n\n /**\n * Gets available delete methods\n */\n readonly delete: {\n /**\n * Deletes an existing instance of the Listing smart contract using the purchase(pay,address,address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n purchase(params?: CallParams<ListingArgs['obj']['purchase(pay,address,address)void'] | ListingArgs['tuple']['purchase(pay,address,address)void']>): ListingComposer<[...TReturns, ListingReturns['purchase(pay,address,address)void'] | undefined]>\n /**\n * Deletes an existing instance of the Listing smart contract using the delist(address)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n delist(params?: CallParams<ListingArgs['obj']['delist(address)void'] | ListingArgs['tuple']['delist(address)void']>): ListingComposer<[...TReturns, ListingReturns['delist(address)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the Listing smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): ListingComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): ListingComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<ListingComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<ListingComposerResults<TReturns>>\n}\nexport type ListingComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { BaseSDK } from \"../base\";\nimport {\n ListingClient,\n ListingFactory,\n} from '../generated/ListingClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n ChangePriceParams,\n ListingState,\n} from \"./types\";\n\n/**\n * SDK for interacting with an individual Listing contract.\n * Use this to manage listing state and change prices.\n * Note: Purchases and delisting should be done through the MarketplaceSDK.\n */\nexport class ListingSDK extends BaseSDK<ListingClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: ListingFactory, ...params });\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current state of the listing.\n */\n async state(): Promise<ListingState> {\n const state = await this.client.state.global.getAll();\n\n return {\n prize: state.prize ?? 0n,\n isPrizeBox: state.isPrizeBox as unknown as boolean ?? false,\n price: state.price ?? 0n,\n paymentAsset: state.paymentAsset ?? 0n,\n expiration: state.expiration ?? 0n,\n seller: state.seller?.toString() ?? '',\n reservedFor: state.reservedFor?.toString() ?? '',\n creatorRoyalty: state.creatorRoyalty ?? 0n,\n gateId: state.gateId ?? 0n,\n marketplace: state.marketplace?.toString() ?? '',\n marketplaceRoyalties: state.marketplaceRoyalties ?? 0n,\n };\n }\n\n /**\n * Checks if the listing has expired.\n */\n async isExpired(): Promise<boolean> {\n const listingState = await this.state();\n if (listingState.expiration === 0n) {\n return false; // No expiration set\n }\n const now = BigInt(Math.floor(Date.now() / 1000));\n return now > listingState.expiration;\n }\n\n /**\n * Checks if the listing is reserved for a specific address.\n */\n async isReserved(): Promise<boolean> {\n const listingState = await this.state();\n return listingState.reservedFor !== '' && listingState.reservedFor !== 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ';\n }\n\n // ========== Write Methods ==========\n\n /**\n * Changes the price of the listing.\n * Can only be called by the seller.\n */\n async changePrice({ sender, signer, price }: ChangePriceParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await this.client.send.changePrice({\n ...sendParams,\n args: { price },\n });\n }\n}\n\n","/**\n * ARC-65 error codes emitted by the Marketplace + Listing contracts.\n *\n * The contracts log `ERR:{code}` via `loggedAssert` / `loggedErr` before\n * failing, where `code` is one of the short alphanumeric tags in this file.\n * Keep this in sync with `akita-sc/smart_contracts/marketplace/errors.ts` —\n * the short codes are the shared wire format between contract and SDK.\n *\n * Use `translateMarketplaceError(code)` to turn a code back into a\n * human-readable message for display in a UI or log.\n */\n\nimport { makeErrorTranslator } from '../errors'\n\n/**\n * Short code → human-readable message for every error the Marketplace and\n * Listing contracts can emit. Ordered roughly the same way as the\n * contract-side file.\n */\nexport const MARKETPLACE_ERROR_MESSAGES: Record<string, string> = {\n // --- Listing validation -------------------------------------------------\n PRLO: 'Lowest price is 4 units for divisibility',\n MNOP: 'Marketplace must be opted into payment asset',\n NALS: 'Not a listing contract',\n IEXP: 'Invalid expiration',\n LEXP: 'Listing expired',\n\n // --- Payment asset ------------------------------------------------------\n PAMA: 'Payment asset must be ALGO',\n PANA: 'Payment asset must not be ALGO',\n\n // --- Access / delist ----------------------------------------------------\n OSCD: 'Only the seller can delist',\n RFDA: 'Reserved for a different address',\n MBSL: 'Must be the seller',\n\n // --- Marketplace plugin -------------------------------------------------\n NENA: 'Not enough of the asset',\n LCNM: 'Listing creator is not the marketplace',\n}\n\n/**\n * Translates a short Marketplace error code (or raw ARC-65 log entry) into a\n * human-readable message. Falls back to the common error table when the code\n * isn't domain-specific. Unknown codes pass through as-is.\n */\nexport const translateMarketplaceError = makeErrorTranslator(MARKETPLACE_ERROR_MESSAGES)\n"]}
|